web-dev-qa-db-ja.com

最初に空のB +ツリーへのキーを持つレコードを入力する方法は?

順序(1、2、3、4、5)のキーを持つレコードをm = 3の最初の空のB + –treeに入力した結果を示します。オーバーフローの場合は、ノードを分割し、再配布しないでください隣人への鍵。高さの低いツリーを作成するために、キーを使用してレコードを異なる順序で入力することは可能ですか?

From Relational DBMS Internals、Chapter 5:Dynamic Tree-Structure Organizations、p.5 から

私はこれが得意ではありませんが、私は左で≤、右で>をしようとしました:

1,2の挿入まで:

enter image description here

次に、ノードを分割し、近隣にキーを再配布しないようにする必要がある限り(私はそれを息子ノードとして理解しています)、2のセルの右側にのみ挿入しました。

enter image description here

そして、私は5を挿入するときと同じことを続けました:

enter image description here

しかし、これはかなり奇妙です。これらのような空のノードを見たことがありません...そして、それがいくつかの非常に基本的なBツリープロパティを尊重するかどうかわかりません:

  • 各ノードには最大で(m-1)キーがあり、少なくとも(⌈(m/2)⌉- 1)キーは、キーを空にできず、キーを「ポインタ」として理解しない限り。

最初の試み:注文のエラーにより、あいまいなツリーが明らかになりました

最初に、「順序」が何であるか(ノードあたりの子の最大数)を誤解しました。したがって、ノードには3つのスペース(したがって、4つの子)を含めることができると思いました。次数4のツリーを作成していたと思います。

1,2,3の挿入まで:

enter image description here

ノードを分割し、近隣にキーを再配布しないようにする必要がある限り、4を挿入します(これは矛盾しているようです)。3の後、右側の葉に1,2,3と4,5を割り当てます。

B tree of order 3 after inserting 4 & 5

11

ページの作成が逆さまになっていると思います。ノードが分割されても、それ以上のノードdownを作成しません(命名法の子ノード)。代わりに、ルートに向かってupwardsを作成します。本が言うように

成長はツリーのtopであることに注意してください。これは、常に持つ重要なプロパティを確保するためのBツリーの固有の特性です。すべての葉が同じレベルにあり、ルートとは異なる各ノードが少なくとも50%満たされています。

(私の強調)

リンクされた電子ブックから:

定義5.1B次mのBツリー(m≥3)...各ノードには最大でm − 1個のキーが含まれます

演習はm = 3を対象としているため、ノードあたり最大2つのキーです。

最初の2つのキーは簡単です。最初のページに移動します。

A:[1,2]

ASCII artを使用します。作成された順序で各ページにラベルを付け、ページ内のキー/ポインタを表示します。したがって、ページPにはキー値k1およびk2が含まれていますP:[k1,k2]

次にキー3が表示されます。セクション5.2.1 ...挿入によると、最初のタスクは検索です。これにより、キー3がページA(唯一のページ)にあることが決定されます。さらに、「[そのノード]がいっぱいになると、2つのノードに分割されます。」ページがいっぱいなので分割する必要があります。私たちは今持っています

A:[1,2]    B:[3, ]

しかし、これは木ではありません!本が言うように:

[新しいノード]へのポインタ、..が[現在のノード]のfatherノード..に挿入されます。ノード[ie親ノード]。この分割と上に移動するプロセスは、必要に応じてルートまで続行でき、これを分割する必要がある場合は、新しいルートノードが作成されます。

(処理を示すことに私の重点を置いたのは、葉に向かってではなく、ルートに向かってツリーを上っていくことです。)

したがって、新しいページへのポインタ(B)を現在のページの親(A)に入れる必要があります。新しいルートノードが必要です。

      C:[2,3]
      /     \
A:[1,2]    B:[3, ]

子(息子)ノードの最高値を指す非リーフページのポインターがあります。リンクされたテキストではこれが異なる場合がありますが、結果は同じになります。

キー値4が到着します。アルゴリズムに従って、どのページにあるかを検索します。それはページBである必要があります。そのための余地があるので、そのページとページCのポインターを更新します。

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]

次に、キー5を挿入します。Bページに移動するはずですが、いっぱいです。したがって分割します

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]   D:[5, ]

親ノードを更新する必要があります。それもいっぱいなので、分割されます:

      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

分割が伝播し、新しいルートノードが形成されます。

            F:[4,5]
            /     \
      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

上向きに成長することにより、ツリーはすべてのブランチで同じ深さを維持します。これは、予測可能なパフォーマンスにとって重要です。 (BツリーのBがまさにこの理由で「バランスの取れた」を表すと言う人もいます。)


2番目の部分については、「キーを使用してレコードを別の順序で入力して、高さの低いツリーを作成することは可能ですか?」ノードごとに5つのキーと2つのキーがあるため、すべての値を保持するために少なくとも3つのリーフノードと、ツリーを形成するために3の高さが必要です。したがって、私の配置は、与えられたデータ、シーケンス、およびアルゴリズムに最適です。

この本は、私が使用するものとは非常に異なるポインタ配置と、異なるページ分割配置を使用しています。これは重要で、ページ全体が表示されます。 42ページに「データの読み込み」と呼ばれるセクションがあり、キーシーケンスから読み込むことでページをさらに充実させることができることを示しています。しかし、私はあなたに十分な指針を与えていただければ幸いです。そうすれば、本のポインター構造を使用してそれを自分で解決できるようになります。


私は、B-Treeがどのように成長するか このインタラクティブシミュレーション に遭遇しました。

6
Michael Green