プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

データ構造のスプレー木


プレイツリーは、最近アクセスした要素がすぐに再びアクセスできるという追加のプロパティを備えた、自己平衡型のバイナリ検索ツリーとして定義されます。挿入、検索、削除などの基本的な操作は、O(log n)償却時間のスプレーツリーによって実行されます。非ランダム操作の多くのシーケンスでは、シーケンスの特定のパターンが不明な場合でも、スプレーツリーは他の検索ツリーよりもうまく機能します。二分探索木の通常の操作はすべて、スプレイと呼ばれる1つの基本的な操作に結合されます。

ノードaごとに、実数キー(a)を格納するとします。

任意の二分探索木では、任意のノードaの左側のサブツリーにはkey(a)の値よりも小さい「key」値を持つアイテムが含まれ、ノードaの右側のサブツリーにはkey(a)の値よりも高い「key」値を持つアイテムが含まれます。

スプレーツリーでは、最初にクエリアイテムを検索します。たとえば、通常の二分探索ツリーのように、クエリアイテムをルートの値と比較します。それより少ない場合は左側のサブツリーを再帰的に検索し、それより高い場合は再帰的に検索します。右のサブツリーであり、それが等しい場合は完了です。次に、非公式に言えば、連続する祖先のすべての互いに素なペアf a、たとえばb =parent(a)とc =parent(b)を調べ、特定の回転のペアを実行します。これらの回転の結果として、cの代わりにaが使用されます。

aに奇数の適切な祖先がある場合、(ルートの子である)aの祖先も、ターミナルケースでは、別の方法で処理する必要があります。つまり、aとルートの間でエッジを回転させます。このステップはジグステップと呼ばれます。

aとbが両方とも左であるか、両方がそれぞれの親の右の子である場合、最初にbとその親cの間のエッジを回転させ、次にaとその親bの間のエッジを回転させます。このステップは、ジグジグステップと呼ばれます。

aが左(それぞれ右)の子で、bが右(それぞれ左)の子である場合、最初にaとbの間、次にaとcの間でエッジを回転します。このステップは、ジグザグステップとして示されます。


  1. データ構造の範囲ツリー

    範囲ツリーは、ポイントのリストを保持するための順序付けられたツリーデータ構造として定義されます。これにより、特定の範囲内のすべてのポイントを効率的に取得でき、通常は2次元以上で実装されます。 O(log d のクエリ時間が速いことを除いて、kdツリーと同じです。 n + k)が、O(n log d-1 のストレージが悪い n)、dはスペースの次元を示し、nはツリー内のポイントの数を示し、kは特定のクエリで取得されたポイントの数を示します。範囲ツリーは、間隔ツリーで区別できます。ポイントを格納して特定の範囲内のポイントを効率的に取得できるようにする代わりに、間隔ツリーは間隔を保存し、特定のポ

  2. データ構造の仮想ツリーでのスプレー

    仮想ツリーでは、一部のエッジは実線として扱われ、一部は破線として扱われます。通常のスプレイは、堅い木でのみ実行されます。仮想ツリーのノードyで表示するには、次の方法を実装します。 アルゴリズムは、パスごとに1回ずつ、ツリーを3回調べ、それを変更します。最初のパスでは、ノードyから開始して、ソリッドツリーのみでスプレイすることにより、yからツリー全体のルートへのパスが破線になります。このパスは、スプライシングによって確実に作成されます。ノードyでの最後のスプレイにより、yがツリーのルートになります。非公式ではありませんが、アルゴリズムは次のように説明されています Splay(y)のアルゴリズ