データ構造 - ツリー (III): 多方向検索ツリー B ツリー、B+ ツリー

データ構造 - ツリー (III): 多方向検索ツリー B ツリー、B+ ツリー

多方向探索ツリー

  1. 完全二分木の高さ: O(log2N)、ここで2は対数
  2. 完全なM方向探索木の高さ: O(logmN)、ここでMは木の各レベルのノードの数の対数です。
  3. M 方向検索ツリーは、メモリにロードするには大きすぎるデータ ストレージの問題を解決するために主に使用されます。各層のノード数を増やし、各ノードに格納するデータを増やすことで、1 つの層に格納できるデータ量が増え、ツリーの高さが減り、データ検索時のディスク アクセス回数が減ります。
  4. したがって、各レイヤーのノード数が多くなり、各ノードに含まれるキーワードの数が増えるほど、ツリーの高さは低くなります。ただし、各ノードでデータを決定すると遅くなりますが、B ツリーはディスク パフォーマンスのボトルネックに重点を置いているため、単一ノードでのデータ検索のオーバーヘッドは無視できます。

Bツリー

B ツリーは M 方向検索ツリーです。B ツリーは主に、バイナリ ツリーがリンク リストに退化することで発生するパフォーマンスの問題と同様に、ツリーの高さが高くなる原因となる M 方向検索ツリーの不均衡を解決するために使用されます。 B ツリーは、ノードの分離、ノードのマージ、レイヤーがいっぱいになったときに親ノードを上方に分割して新しいレイヤーを追加するなど、各レイヤーのノードを制御および調整することで、M 方向検索ツリーのバランスを確保します。具体的なルールは以下のとおりです。

  1. ルートノードの子ツリーの数は 2 から M の間であり、その他の非リーフノードの子ツリーの数は M/2 から M の間です。分割により子ツリーの数が M を超える場合は、親ノードを再帰的に上方に分割する必要があります。分割する必要のない親ノードが見つかったら、分割は停止します。ルートノードまで分割処理が続きます。ルートノードを分割する必要がある場合は、2 つのルートが生成されるため、この 2 つのルートを子ノードとして使用するために新しいルートを作成する必要があります。このとき、ツリーの高さは 1 増加します。
  2. 各非リーフ ノードのキーワードの値は、左から右に向かって増加します。i 番目のキーワードは、サブツリー i+1 内の最小のキーワードを表します (ここで、i は、ルート ノードの場合は 1 から (2 から M) の間、その他の非リーフ ノードの場合は 1 から (M/2 から M) の間です)。
  3. B ツリーのすべてのデータ項目はリーフ ノードに格納されます。非リーフ ノードにはデータは格納されません。非リーフ ノードには、検索方向を示すために使用されるキーワード、つまりインデックスのみが格納されます。これにより、より多くの非リーフノードがメモリにロードされ、データの検索が容易になります。
  4. すべてのリーフ ノードは同じ深さにあり、各リーフ ノードには L/2 から L 個のデータ項目が含まれます。

サイズオプション: MとL

  1. MはBツリーのパスの順序または数である。
  2. Lは各リーフノードに格納できるデータ項目の最大数である。
  3. B ツリーでは、各ノードはディスク ブロックであるため、M と L はディスク ブロックのサイズに基づいて決定する必要があります。

ディスクブロックサイズとMの計算

  1. 各非リーフ ノードには、キーワードと子ツリーへのポインタが格納されます。具体的な数値は次のとおりです。M 次数の B ツリーの場合、各非リーフ ノードには M-1 個のキーワードと子ツリーへの M 個のポインタが格納されます。したがって、各キーワードのサイズが 8 バイト (Java の long 型は 8 バイト) で、各ポインタが 4 バイトの場合、M 次数 B ツリーの各非リーフ ノードには、8 * (M-1) + 4 * M = 12M - 8 バイトが必要です。
  2. 各非リーフノード (ディスク ブロック) が 8K を超えるメモリ (つまり 8192) を占有しないことが規定されている場合、M の最大値は 683、つまり 683*12-8=8192 になります。

リーフノードデータ項目数 L

  1. 各データ項目のサイズも 256 バイトの場合、ディスク ブロック サイズは 8K、つまり 8192 バイトであり、各リーフ ノードは L/2 から L のデータ項目を格納できるため、各リーフ ノードは最大で 8192/256 = 32 のデータ項目を格納でき、つまり L のサイズは 32 になります。
  2. 5 次 B ツリーの構造は次のようになります。つまり、M と L は 5 に等しくなります。各非リーフ ノードには、M を含む最大 M-1=5-1=4 個のキーワード、つまりサブツリーへの 5 つのポインターが含まれます。 L が 5 の場合、各リーフ ノードには最大 5 つのデータ項目を格納できます。

B+ ツリー

B+ツリーの構造は基本的にBツリーと同じです。唯一の違いは、B+ツリーのリーフノードがポインターで接続されてリンクリストを形成するため、すべてのリーフノードをトラバースすること、つまり、検索キーワードの特定の範囲にあるすべてのデータ項目を取得することが容易であることです。 MySQL の InnoDB ストレージ エンジンは、インデックス実装として B+ ツリーを使用します。

上記は、編集者が紹介した多方向探索木 B ツリーと B+ ツリーの詳細な統合です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。編集者がすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • MySQL 最適化における B ツリー インデックスの知識ポイントのまとめ
  • MySQL Bツリーインデックスとインデックス最適化の概要についての簡単な説明
  • 完全なBツリーアルゴリズムのJava実装コード
  • C言語Bツリーの深い理解

<<:  Vueモバイル端末は画面上で指をスライドさせる方向を判定する

>>:  Ubuntu 18.04 は pyenv、pyenv-virtualenv、virtualenv、Numpy、SciPy、Pillow、Matplotlib をインストールします

推薦する

HTML メタタグの使用の概要 (推奨)

メタタグ機能METAタグは、HTMLタグのHEAD領域にある重要なタグです。文書の文字セット、使用言...

MySQL トランザクションの概念と使用法の詳細な説明

目次情事の概念取引の状態取引の役割取引の特徴トランザクション構文トランザクション対応ストレージエンジ...

HTML に埋め込まれた Flash HTML ウェブページ コードに Flash ファイルを埋め込むソリューション (パート 1)

中国の習慣では、旧暦の1月15日より前に新年を祝います。ここで、庭にいる友人たちに新年の幸せを祈りた...

JavaScriptのループの違いについての詳細な説明

目次序文列挙可能なプロパティ反復可能なオブジェクトforEachメソッドとmapメソッドチェーン呼び...

Alibaba Cloud ドメイン名と IP バインディングの手順と方法

1 Alibaba Cloud コンソールに入り、ドメイン名コンソールを見つけて、バインドするドメイ...

SpringBoot でマイクロサービスを構築するために Docker を使用した実際の記録を分析する

それは何ですか? Spring Boot は、Spring オープンソース組織のサブプロジェクトであ...

Chromeの最小フォントサイズ制限12pxに対する最終的な解決策

ウェブサイトを作成するユーザーの多くが、このような問題に遭遇すると思います。Chrome のデフォル...

MySQL SQL ステートメント分析とクエリ最適化の詳細な説明

パフォーマンスの問題のあるSQL文を取得する方法1. ユーザーからのフィードバックを通じてパフォーマ...

MySQL がエラーを報告: ファイルが見つかりません: './mysql/plugin.frm' 解決策

問題を見つける最近、仕事中に問題が見つかりました。問題は、MySQL ディスクがいっぱいだったことで...

JS ES の新機能: 拡張演算子の紹介

1. スプレッド演算子スプレッド演算子は 3 つのドット ... で、複数の引数 (関数呼び出しなど...

MySQL 8.0 のデフォルトのデータディレクトリを変更する (設定なしの簡単な操作)

使用シナリオ: Alibaba Cloud を使用しており、データディスクを別途購入しました (大容...

React における同期および非同期 setState の問題のコード分析

React は Facebook の社内プロジェクトとして始まりました。 React の出現は革命的...

Vueはカスタムツリーコンポーネントを再帰的に実装します

この記事では、カスタムツリーコンポーネントを再帰的に実装するVueの具体的なコードを参考までに共有し...

mysql 8.0.16 winx64 および Linux でルート ユーザーのパスワードを変更する方法

データベースへの接続などの基本的な操作はご自身で行ってください。この記事ではパスワードの変更方法を中...

ウィンドウの中央にブロック要素の位置を設定する方法

ウィンドウの中央にブロック要素の位置を設定する方法ブロック要素をウィンドウの中央に配置する上記の方法...