web-dev-qa-db-ja.com

AVLツリーとスプレイツリーの違い

いろいろな木を勉強していて、AVLの木やスプレーの木に出会いました。私は知りたいです

  1. AVLツリーとスプレイツリーの違いは何ですか?
  2. これらの房をどのような基準で選択しますか?
  3. これらの木のプラスとマイナスは何ですか?
  4. ビッグO表記の観点から、これらのツリーのパフォーマンスは何ですか?
43
venkysmarty
  1. スプレイツリーとAVLツリーはどちらも、優れたパフォーマンスが保証されたバイナリ検索ツリーですが、パフォーマンスを保証する方法は異なります。 AVLツリーでは、ツリーの形状は常に制約されるように制約されます。つまり、ツリーの高さがO(log n)を超えることはありません。この形状は挿入と削除で維持され、ルックアップ中に変更されません。一方、スプレーツリーは、ツリーのルックアップに応じてツリーの形状を変更することで効率を維持します。このようにして、頻繁にアクセスされる要素がツリーの上部に向かって移動し、ルックアップ時間が改善されます。スプレーツリーの形状は制約されず、実行されるルックアップに基づいて変化します。

  2. これについては厳格な規則はありません。ただし、構造間の1つの重要な違いは、AVLツリーは各操作で高速ルックアップ(O(log n))を保証するのに対し、スプレーツリーはn回の操作のシーケンスが最大でO(n log n)時間かかることしか保証できないことです。つまり、リアルタイムのルックアップが必要な場合は、AVLツリーの方が適している可能性があります。ただし、スプレイツリーは平均してはるかに高速になる傾向があるため、ツリールックアップの合計実行時間を最小限にしたい場合は、スプレイツリーの方が適している可能性があります。さらに、対応するAVLツリー操作の方が複雑で効率が悪い一方で、スプレイツリーは分割やマージなどのいくつかの操作を非常に効率的にサポートします。スプレイツリーはノードにバランス情報を格納する必要がないため、AVLツリーよりもメモリ効率が高くなります。ただし、AVLツリーは多数のルックアップがあるマルチスレッド環境でより有用です。なぜなら、AVLツリーでのルックアップは、スプレイツリーでは実行できない一方で、並行して実行できるためです。スプレイツリーはルックアップに基づいて自身を再形成するため、ツリーの要素の小さなサブセットにのみアクセスする必要がある場合、またはいくつかの要素に他の要素よりもはるかに多くアクセスする場合、スプレイツリーはAVLツリーよりも性能が優れています。最後に、回転ツリーの方がはるかに簡単なので、スプレイツリーはAVLツリーよりも実装が簡単な傾向があります。

  3. (2)を参照

  4. AVLツリーの挿入、削除、および検索には、それぞれO(log n)時間かかります。スプレイツリーにも同じ保証がありますが、保証は償却の意味でのみです。操作の長いシーケンスには最大でO(n log n)時間かかりますが、個々の操作にはO(n)時間もかかる場合があります。

お役に立てれば!

79
templatetypedef

1)AVLツリーとスプレイツリーの違いは何ですか?

これらは、構造と呼び出し側の操作が似ています。違いは、スプレイツリーでは、各操作の後、ツリーをほぼ完全にバランスさせて、将来の操作にかかる時間を短縮することです。

2)これらの房をどのような基準で選択しますか?

アプリケーションがツリー内の大量のデータを処理するが、データのサブセットに他より頻繁にアクセスする必要がある場合、スプレーツリーは常にバイナリ検索ツリーよりも優れています。この場合、頻繁にアクセスするデータは、スプレイの結果としてルートの近くに来ます。また、どのノードにも以前よりも短い時間でアクセスできます。

これらのツリーを選択するための一般的なルールとして、ツリー操作の期間にわたって「平均」log(n)時間を必要とする場合は、スプレーツリーを使用します。二分木はこれを保証できません。

3)これらの木のプラスとマイナスは何ですか?

両方の利点は、理論的にはこれらの両方のデータ構造でlog(n)を回避できることです。

前述のように、スプレイツリーには、いくつかの操作にわたって平均log(n)があります。これは、そのセットで少なくとも一度、操作の複雑さがn回あったことを意味します。しかし、これは、頻繁なアイテムにアクセスするときに補償されます。

二分探索木の欠点は、常にlog(n)を持っていることは幸運である必要があるということです。キーがランダムでない場合、ツリーは片側だけのフォームのようなリストに縮小されます。

4)ビッグO表記の観点から、これらのツリーのパフォーマンスはどのくらいですか?

ツリー操作のグループの平均でのツリーLog(n)のスプレー。バイナリツリーLog(n)は、キーがランダムに移動する場合のみです。

ランタイムの結果はここで明らかです スプレイツリーランタイムプロファイリング スプレイを使用した場合と使用しない場合の検索で、ランタイムの違いを確認できます。