順序(1、2、3、4、5)のキーを持つレコードをm = 3の最初の空のB + –treeに入力した結果を示します。オーバーフローの場合は、ノードを分割し、再配布しないでください隣人への鍵。高さの低いツリーを作成するために、キーを使用してレコードを異なる順序で入力することは可能ですか?
From Relational DBMS Internals、Chapter 5:Dynamic Tree-Structure Organizations、p.5 から
私はこれが得意ではありませんが、私は左で≤、右で>をしようとしました:
1,2の挿入まで:
次に、ノードを分割し、近隣にキーを再配布しないようにする必要がある限り(私はそれを息子ノードとして理解しています)、2のセルの右側にのみ挿入しました。
そして、私は5を挿入するときと同じことを続けました:
しかし、これはかなり奇妙です。これらのような空のノードを見たことがありません...そして、それがいくつかの非常に基本的なBツリープロパティを尊重するかどうかわかりません:
最初に、「順序」が何であるか(ノードあたりの子の最大数)を誤解しました。したがって、ノードには3つのスペース(したがって、4つの子)を含めることができると思いました。次数4のツリーを作成していたと思います。
1,2,3の挿入まで:
ノードを分割し、近隣にキーを再配布しないようにする必要がある限り、4を挿入します(これは矛盾しているようです)。3の後、右側の葉に1,2,3と4,5を割り当てます。
ページの作成が逆さまになっていると思います。ノードが分割されても、それ以上のノード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がどのように成長するか このインタラクティブシミュレーション に遭遇しました。