2017-12-11 2 views
0

メモリにB +ツリーを実装し、内部ノードにキーがあり、リーフノードにキーデータペアがあるとします。 ファンアウトfのB +ツリーの場合、B +ツリーの高さはlog_f N(Nはキーの数)、対応するBSTの高さはlog_2 Nとなります。 実行していない場合ディスクの読み取りと書き込み、B +ツリーの検索パフォーマンスはバイナリ検索ツリーの検索のパフォーマンスより優れていますか?どうやって? 各内部ノードのB +ツリーでは、BSTに対して1を選択すると、Fに対して多くの選択肢が決定されるため、B +ツリー検索は、リーフノードのすべてのキーデータがメモリ内にあるバイナリ検索ツリー検索よりも優れたパフォーマンスを発揮できますか?

+1

あまりありません。 B +ツリーの魅力は、ディスクへのアクセスが非常に遅いため、ディスクシークを減らすことです。私がこれまで見たことのない唯一の方法は、純粋なBSTよりも優れているということですが、キャッシュの利便性が原因ですが、BSTはおそらくより良い割り当て戦略でさらに最適化を行うことができます。 –

+0

B +ツリーが完全にメモリに実装されている場合、BSTよりもパフォーマンスが優れている理由がわかりませんでした。しかし、なぜB +ツリーはキャッシュが使いやすく、BSTはそうではないと思いますか? – burcak

+1

内部のFキーをベクターに入れたり、伝染性のあるものを入れることができるので、その実装に応じて、BST –

答えて

0

少なくともキャッシュと比較すると、メインメモリはディスクドライブと同じ特性の多くを持っています。これはかなり高い帯域幅を持ちますが、キャッシュよりもはるかに高い遅延です。それは、かなり大きい最小読み取りサイズを有し、読み取りが予測可能である場合(例えば、連続したアドレスに多数のキャッシュラインを読み取った場合)、実質的により高い帯域幅を与える。そのように、それは同じ一般種類の最適化の恩恵を受ける(ただし、詳細はしばしば変化する)。

Bツリー(およびB *ツリーやB +ツリーなどのバリアント)は、ディスクドライブで十分にサポートされているアクセスパターンとうまく機能するように明示的に設計されています。とにかくかなりの量のデータを読まなければならないので、読んでおく必要のあるメモリ量を最大限に活用するためにデータをパックすることもできます。いずれの場合も、予測可能なパターン(特に、連続するアドレスでの連続した読み取りの回数)で最小限の読み取りの何倍かを読み取ることによって、頻繁に大きな帯域幅を得ることができます。そのため、1ページのサイズを、一度に読むことができる最小サイズよりもさらに大きくすることがよくあります。

同様に、どちらの場合も、私たちが実際に気にするデータを見つける前に、ツリー内のいくつかのノードの層を降りる予定です。ディスクから読み込むときと同じように、私たちが実際に気にするデータが見つかるまで、読み込んだデータのキーの密度を最大にすることができます。典型的なバイナリツリーの場合:

template <class T, class U> 
struct node { 
    T key; 
    U data; 
    node *left; 
    node *right; 
}; 

...私たちは実際には使用していないデータ項目の数を読み上げます。それは、私たちが必要とする適切なキーが見つかったときにのみ、関連するデータを取得したいときです。公平に、我々はノード構造にのみ、かなりマイナーな変更で、同様のバイナリツリーであることを行うことができます。

template <class T, class U> 
struct node { 
    T key; 
    U *data; 
    node *left; 
    node *right; 
}; 

今、ノードは、データへのポインタではなく、データそのものが含まれています。 dataが小さい場合、これは何も成し遂げられませんが、大きければ大きな成果を上げることができます。

要約:CPUの観点からは、メインメモリからの読み出しは、ディスクからの読み出しと同じ基本的な特性を持っています。ディスクには同じ特性の極端なバージョンが表示されます。したがって、Bツリー(およびバリアント)の設計につながった設計上の考慮事項のほとんどは、主メモリに格納されたデータに同様に適用されるようになりました。

Bツリーはうまく機能し、メモリ内ストレージに使用すると大きなメリットが得られることがよくあります。

+0

の場合には当てはまらないかもしれません。しかし、ルートを除くB +ツリーでは、内部ノードは3つ以上の子を持つことができ、各ノードはすでにデータを保持していると仮定します。したがって、データへのポインタは必要ありません。データもメモリに格納されます。その場合、B +ツリーがバイナリ検索ツリーより優れているかどうか疑問に思っていますか? – burcak

関連する問題