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


11

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

以下からの動的な木構造組織、P.50:リレーショナルDBMSの内部、第5章

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

1,2の挿入まで:

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

  • 各ノードは最大で(m-1)個のキーを持ち、少なくとも(⌈(m / 2)⌉-1)個のキーを持ちます。

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

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

1,2,3の挿入まで:

ここに画像の説明を入力してください

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

4&5を挿入した後の3次のBツリー

回答:


6

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

成長はツリーの最上部にあり、これはBツリーの本質的な特性であり、常にすべてのリーフが同じレベルにあり、ルートとは異なる各ノードが少なくとも50%満杯。

(私の強調)

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

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

演習はm = 3のため、ノードあたり最大2つのキーです。

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

A:[1,2]

アスキーアートを使用します。作成した順に各ページにラベルを付け、ページ内のキー/ポインタを表示します。したがって、キー値k1とk2を含むページPはになりますP:[k1,k2]

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

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

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

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

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

そのため、新しいページへのポインター(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ツリーがどのように成長するかについてのこのインタラクティブなシミュレーションに出くわしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.