logo

B+ ツリー

B+ Tree は、効率的な挿入、削除、検索操作を可能にする B Tree の拡張機能です。

B ツリーでは、キーとレコードの両方を内部ノードとリーフ ノードに保存できます。一方、B+ ツリーでは、レコード (データ) はリーフ ノードにのみ保存でき、内部ノードはキー値のみを保存できます。

B+ ツリーのリーフ ノードは、検索クエリをより効率的にするために、単一リンク リストの形式でリンクされます。

B+ Tree は、メインメモリに格納できない大量のデータを格納するために使用されます。メイン メモリのサイズは常に制限されているため、B+ ツリーの内部ノード (レコードにアクセスするためのキー) はメイン メモリに格納され、リーフ ノードは二次メモリに格納されます。

B+ ツリーの内部ノードは、インデックス ノードと呼ばれることがよくあります。次数 3 の B+ ツリーを次の図に示します。


B+ ツリー

B+ ツリーの利点

  1. 同じ回数のディスクアクセスでレコードをフェッチできます。
  2. 木の高さはバランスが取れており、B木に比べて低くなります。
  3. B+ ツリーに格納されたデータには、直接アクセスすることも、順次アクセスすることもできます。
  4. キーはインデックス作成に使用されます。
  5. データがリーフ ノードにのみ保存されるため、検索クエリが高速になります。
B+ ツリーの利点

B ツリー VS B+ ツリー

SN Bツリー B+ ツリー
1 検索キーを繰り返し保存することはできません。 冗長な検索キーが存在する可能性があります。
2 データは内部ノードだけでなくリーフノードにも保存できます データはリーフ ノードにのみ保存できます。
3 データはリーフ ノードだけでなく内部ノードでも見つかる可能性があるため、一部のデータの検索は処理が遅くなります。 データはリーフ ノードでのみ見つかるため、検索は比較的高速になります。
4 内部ノードの削除は非常に複雑で時間がかかります。 要素は常にリーフ ノードから削除されるため、削除は複雑なプロセスになることはありません。
5 リーフ ノードを相互にリンクすることはできません。 リーフ ノードは、検索操作をより効率的に行うために相互にリンクされます。

B+ ツリーへの挿入

ステップ1: 新しいノードをリーフ ノードとして挿入します

ステップ2: リーフに必要なスペースがない場合は、ノードを分割し、中間ノードを次のインデックス ノードにコピーします。

ステップ 3: インデックス ノードに必要なスペースがない場合は、ノードを分割し、中央の要素を次のインデックス ページにコピーします。

例 :

次の図に示す次数 5 の B+ ツリーに値 195 を挿入します。


B+ツリー

195 は、120 の右側のサブツリーの 190 の後に挿入されます。任意の位置に挿入します。


B+ツリー

ノードには最大数 (つまり 4) を超える要素が含まれているため、ノードを分割し、中央ノードを親まで配置します。


B+ツリー

ここで、インデックス ノードには 6 つの子と 5 つのキーが含まれており、B+ ツリーのプロパティに違反しているため、次のように分割する必要があります。


B+ツリー

B+ ツリーの削除

ステップ1: リーフからキーとデータを削除します。

ステップ2: リーフ ノードに含まれる要素が最小数に満たない場合は、そのノードをその兄弟とマージし、それらの間にあるキーを削除します。

ステップ 3: インデックス ノードに含まれる要素が最小数に満たない場合は、ノードを兄弟とマージし、それらの間のキーを下に移動します。

次の図に示す B+ ツリーからキー 200 を削除します。

夕食対夕食

B+ツリー

200 は、190 の右側のサブツリーの 195 の後に存在します。これを削除します。


B+ツリー

195、190、154、129 を使用して 2 つのノードをマージします。


B+ツリー

ここで、要素 120 は、B+ ツリーのプロパティに違反しているノード内に存在する単一の要素です。したがって、60、78、108、120 を使用してマージする必要があります。

これで、B+ ツリーの高さが 1 減ります。


B+ツリー