スプレイツリーローテーションアルゴリズムが親ノードと祖父母ノードの両方を考慮するのはなぜですか?


25

スプレーツリーデータ構造の回転が、評価ノードの親だけでなく、祖父母(zig-zagおよびzig-zig操作)も考慮している理由はよくわかりません。以下が機能しないのはなぜですか:

たとえば、ツリーに新しいノードを挿入するときに、左または右のサブツリーに挿入するかどうかを確認します。左に挿入する場合、結果を右に回転させ、右のサブツリーに対して結果を右に回転させます。再帰的にこのようになります

Tree insert(Tree root, Key k){
    if(k < root.key){
        root.setLeft(insert(root.getLeft(), key);
        return rotateRight(root);
    }
    //vice versa for right subtree
}

それは、「スプレイ」手順全体を回避するはずです、あなたは思いませんか?

回答:


30

単純なバランシングアルゴリズムでは、最悪の場合、ローテーションごとに償却時間を必要とする場合があります。ツリーは、正しい子のまったく不均衡なパスであると仮定します。左の子を持つノードはありません。このツリーの唯一の葉は、最大のキーを持つツリーです。このステップを段階的にルートまで回転させると、n 1回転を使用したことになり、結果のツリーはまだ完全に不均衡です。Ωnn1

回転するだけの悪い例

ここで、より単純なアルゴリズムを使用して、キーの順序を下げて、ツリー内のすべてのノードを一度に1つずつ繰り返し昇格するとします。すべてのプロモーションが行われた後、木は元の状態に戻った、と私たちは大体使用している回転を。したがって、平均して、このシーケンスの各プロモーションにはΩ n が必要ですn2/2ΩnΩn

悪い例が続いた

この悪い例は、SleatorとTarjanのオリジナルのスプレイツリーペーパーに記載されています。

スプレイアルゴリズムは、一度に1つのノードだけでなく、一度に2つのノードを考慮します。特に、スプレイされるノードが右の子の右の子である場合、スプレイアルゴリズムは最初に回転しますバツバツバツ

悪い例を広げる

このより複雑なアルゴリズムの利点は、アクセスされたノードをルートにもたらすだけでなく、 移動するすべての祖先をルートのほぼ半分に移動するだけでなく、ノードから一定数以上のレベルに移動しないことです。ルート。

OログnΩn

より簡単に:スプレイはノードをすばやく上に、下にゆっくりと移動します。


回転アルゴリズムはまったく同じだと思います。私のものは単純に短く理解しやすいものです。祖父母を見るのではなく、1つのローテーションステップでのみ親を検討します。まったく同じ結果になりませんか?
-Bober02

私はあなたが2つのスプレイアルゴリズムを参照していると思います、1つは上から下、もう1つは下から上で、私のものではない、それは正しいですか?私は自分のアルゴ対ボトムアップの
スプレイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.