web-dev-qa-db-ja.com

AVLツリーとBツリー

AVLツリーはBツリーとどう違うのですか?

39
neuromancer

AVLツリーは、ランダムアクセスが比較的安価なメモリ内での使用を目的としています。 Bツリーは、より多くのキーを各ノードにグループ化して、読み取りまたは書き込み操作に必要なシークの数を最小限に抑えるため、ディスクバックアップストレージに適しています。 (これが SQLite のように、ファイルシステムやデータベースでBツリーがよく使用される理由です。)

47
David

AVLツリーとBツリーはどちらもデータ構造であるという点で似ています。これらの要件によって、それぞれのツリーの高さが最小化されます。この「短さ」により、O(log n)時間で検索を実行できます。これは、可能な最大の読み取り数がツリーの高さに対応するためです。

    5
   / \
  3   7
 /   / \
1   6   9

これはAVLツリーであり、その中心にあるバイナリ検索ツリーです。ただし、これは自己バランスです。つまり、ツリーに要素を追加すると、高さをできるだけ均一に保つように再構築されます。基本的に、長いブランチは許可されません。

Bツリーもこれを行いますが、別の再バランススキームを使用します。書くのは少し複雑ですが、「Bツリーアニメーション」をGoogle検索すると、Bツリーを非常によく説明する本当に良いアプレットがいくつかあります。

AVLツリーはメモリベースのソリューションを考慮して実装されているのに対し、Bツリーはディスクベースのソリューションを考慮して実装されているという点で異なります。 AVLツリーは動的なメモリ割り当てと次のメモリブロックへのポインタを使用するため、大量のデータコレクションを保持するようには設計されていません。明らかに、AVLツリーの機能をディスクの場所とディスクポインターで複製することはできますが、非常に大きなサイズのツリーを読み取るために、まだかなりの数の読み取りが必要であるため、はるかに遅くなります。

データコレクションが大きすぎてメモリに収まらない場合、解決策はBツリーです(興味深いファクトイド:「B」が実際に何を表すのかについてコンセンサスはありません)。 Bツリーは、1つのノードに多数の子を保持し、子ノードへの多くのポインタを保持します。このようにして、ディスクの読み取り中に(単一のディスクブロックを読み取るのに約10ミリ秒かかる場合があります)、関連ノードデータの最大量と、「リーフノード」ディスクブロックへのポインターが返されます。これにより、データの取得時間をlog(n)時間に償却できるため、Bツリーはデータベースおよび大規模なデータセットの取得実装に特に役立ちます。

41
Keshav Saharia

AVLツリーは、O(log n)の高さを維持するようにバランスがとられた自己バランス型バイナリ検索ツリーです。

Bツリーはバランスの取れたツリーですが、バイナリツリーではありません。ノードにはより多くの子があり、ノードごとの検索時間は増加しますが、検索がアクセスする必要のあるノードの数は減少します。これにより、ディスクベースのツリーに適しています。詳細については、 Wikipediaの記事 を参照してください。

16

AVLツリーは自己分散型のバイナリツリーであり、検索の挿入および削除操作でO(lgN)平均および最悪のケース)を有効にします。これは、メモリでサポートされる検索ツリー(中程度のサイズのデータ​​セット)で使用されます。

Bツリーは、ディスクへの読み取りが少ないため、主に非常に大規模なデータセットのストレージに基づく検索ツリーとして使用されます(各ノードに含まれるNキーがN> 1であるため)。 Bツリーは(N、N + 1)Bツリーと呼ばれ、Nはノードあたりのキーの数、N + 1はノードあたりの子の数です。ノードあたりのキー数が多いほど、ディスクからの読み取りに必要な時間が少なくなり、自然に浅いツリーになります(レベルが低くなります)。

3
Aaron Dancygier

AVLは自己バランスであり、すべての操作が平均および最悪の場合にO(log n)であることを保証します。

3
James Kolpack

他の回答者はすでにAVLとB-Treeの両方についてかなり詳細な技術的詳細を提供していますが、これら2つに関する比較的初心者向けの情報を追加したいと思います。

  • AVLツリーはバイナリツリーですが、Bツリーはマルチウェイツリー(N-aryツリー)です。つまり、AVLツリーのノードは最大2つの子ノードを持つことができます。 1つの情報/データwhileBツリーの任意のノードはnノードを持つことができますn-1個の情報/データ。 Bツリーの場合、nはその順序とも呼ばれます。
2
RBT

Bツリーは、上記のすべてのアイデアを使用します。特に、Bツリー:

1)keeps keys in sorted order for sequential traversing
2)uses a hierarchical index to minimize the number of disk reads
3)uses partially full blocks to speed insertions and deletions
4)keeps the index balanced with an elegant recursive algorithm

さらに、Bツリーは、内部ノードが少なくとも半分満たされていることを確認することにより、無駄を最小限に抑えます。 Bツリーは、任意の数の挿入と削除を処理できます。

2
Tanmoy De

連想テーブルをサポートするというほとんど同じ目的を果たしますが、実際には非常に異なります。歴史的に、AVLツリーはメモリ内の操作でBツリーよりも優れていると考えられていましたが、CPUサイクルと比較してメモリへのアクセスが安価な場合に特にそうです。

可変長キーのデータベースストアで一般的に使用されますが、Bツリーは固定長レコードと短いレコード(キー+データ)で最適に機能します。このような用途では、メモリフットプリント(データをよりコンパクトに格納するため)と速度(キャッシュの局所性が大幅に向上するため)の両方の観点から、メモリ内での使用に対してAVLツリーを大幅に上回る可能性があります。

L2 は、Bツリー上で非常に高速な連想テーブルとシーケンスを実装するデータ構造ライブラリです。また、AVLツリーがあり、2つのパフォーマンスを簡単に比較できます。

2

素人の言葉で-

AVLツリーとバイナリ検索ツリーはどちらも同じですが、AVLツリーには、左のサブツリーと右のサブツリーの高さの差が0、1、または-1のいずれかでなければならないという制約があります。

バイナリ検索ツリーがこれらの条件を満たす場合、それはAVLツリーと呼ばれます。

二分探索木+ HEIGHT CONDITIONはAVLツリーです。

参照:Cormenによるアルゴリズムの紹介 https://books.google.co.in/books ...

0
Sagar Chand