所与2本のAVL木及び及び値よう、それが含む新しいAVLツリーを構築することが容易であると値及び時間で、ここではツリー高さを示します(ツリーが高さを保存している限り)。
これは赤黒木でも可能です。他の多くの種類のバランスの取れた木も同様に想定しています。
これは、盗用または盗用のようなデータ構造で可能ですか?を省略するとどうなりますか?
所与2本のAVL木及び及び値よう、それが含む新しいAVLツリーを構築することが容易であると値及び時間で、ここではツリー高さを示します(ツリーが高さを保存している限り)。
これは赤黒木でも可能です。他の多くの種類のバランスの取れた木も同様に想定しています。
これは、盗用または盗用のようなデータ構造で可能ですか?を省略するとどうなりますか?
回答:
いいえ、優先順位がランダムな場合、通常のTreapでこれを行うことはできません。
私が行う正確な主張は、ランダムな優先順位で2つの同じサイズのトループでそのようなマージを実行するには、期待してポインターを更新する必要があるということです。
大まかな証拠のスケッチは次のとおりです。
操作を実行するために、変更する必要があるポインターの数を考慮してください。挿入せずにとマージするだけの場合、バインドを証明する方が簡単です。右脊椎考えてみましょうのと左脊椎の。の要素を赤、の要素を青にます。を優先度順にます。このシーケンスで色が変わるたびにポインターを変更する必要があります。両方のスパインのサイズが高い確率で、優先順位がランダムである場合、シーケンス内の色の変化の数もことを確認するのはそれほど難しくありません。したがって、マージのポインターを更新する必要があり(を追加せずに)。
現在、マージの中にを追加してもあまり役に立ちません。その場合のポインター変更の数は、次のように下限を設定できますを優先度ます。シーケンス内の未満のすべてを削除します。そして、結果のシーケンスの色の変化の数が下限です。以来ランダム優先され、最終treapでそれをルートとするサブツリーの予想高さはO (1 )それだけ有するので、Oを(1 )のノードS 1 ∪ S 2の期待に、それよりも低い優先度を持つ、我々のでOだけを失ったt rを追加すると、ポインターは下限で変化します。
そうは言っても、予想される一定の時間のマージを可能にする「トレジャーのような」データ構造を取得する方法はおそらくあります。
考えられる解決策の非常に大まかなスケッチを次に示します。
ランダムにバランスされたタイプのB +ツリーを使用して、この問題の解決策があると思います。トレジャーのように、これらの木はユニークな表現を持っています。トレジャーとは異なり、いくつかのキーを複数回保存します。Bent et alの「Biased Search Trees」のトリックを使用して、各キーが表示される最も高い(つまり、ルートに最も近い)レベルにのみ保存するように修正することは可能かもしれません)
一意の値の順序付けられたセットのツリーは、各値をビットストリームに最初に関連付けることによって作成されます。これは、トレープの各値が優先順位に関連付けられる方法と同様です。ツリーの各ノードには、キーストリームとビットストリームの両方が含まれています。さらに、非リーフノードには、そのノードをルートとするツリーの高さを示す自然数が含まれます。内部ノードには、ゼロ以外の数の子があります。B +ツリーと同様に、ルートからリーフまでのすべての非自己交差パスは同じ長さです。
すべての内部ノードは(B +ツリーのように)子孫の葉の最大キーkが含まれます。それぞれはまた、自然数含まIをルートとするツリーの高さを示すVを、および関連付けられたビットストリームKからI + 1以降番目のビットを。vをルートとするツリーのすべてのキーのビットストリームの最初のビットが同じである場合、vのすべての子はリーフであり、iは1です。それ以外の場合、vの子は内部ノードであり、すべてのキーに関連付けられたビットストリームで同じi番目のビットを持ちます。
ビットストリームが関連付けられたキーのソートされたリストからツリーを作成するには、まず、ストリームの最初のビットに基づいてキーを連続したグループに収集します。これらの各グループに対して、グループ内で最大のキーのキーとビットストリームを使用して親を作成しますが、ストリームの最初のビットは除外します。次に、新しい親で同じグループ化手順を実行して、祖父母を作成します。1つのノードのみが残るまで続行します。これがツリーのルートです。
以下のキーおよび(開始)ビットストリームのリストは、その下のツリーで表されます。ビットストリームプレフィックスでは、「。」任意のビットを意味します。つまり、キーAのビットストリームは最初に0を持ち、他のキーのビットストリームが異なるものではないと仮定して、他と同じツリーを生成します。
A 0...
B 00..
C 10..
D 0...
E 0011
F 1...
G 110.
H 0001
____H____
/ \
E H
| / \
__E__ G H
/ | \ | |
B C E G H
/ \ | / \ / \ |
A B C D E F G H
特定の内部ノードのすべての子は、ビットストリームの最初の場所に同じビットを持っています。これは親の「色」と呼ばれます-0は赤、1は緑です。子には、ビットストリームの最初のビットに応じて「フレーバー」があります-0はチェリー、1はミントです。葉には風味がありますが、色はありません。定義により、チェリーノードは緑の親を持つことはできず、ミントノードは赤の親を持つことはできません。
ビットストリーム内のビットが一様分布からのIIDであると仮定すると、ノードの親の数のPMF は 2 1 - n ( n - 1 および期待値は(n+1)/2です。すべてのためのN≥2、これは≤3なので、予想されるツリーの高さはO(lgn)です。
同じ高さの2つのツリーを結合するには、最初にルートが同じ色であるかどうかを確認します。その場合は、左のルートからその右端の子を切断し、右のルートからその左端の子を切断してから、これら2つのツリーを再帰的に結合します。結果は、ツリーのフレーバーが同じであるため、同じ高さまたはより高いツリーになります(以下を参照)。2つのツリーを再帰的に結合した結果が、切断された2つの子と同じ高さである場合、それを前の左ルートの残りの子と右ルートの残りの子を持つルートの中間子にします。1だけ背が高い場合、その子をルートの中央の子にし、左のルートの残りの子を前に、右のルートの残りの子を後にします。根の色が異なる場合、同じフレーバーがあるかどうかを確認します。もしそうなら、正しいルートのキーとビットストリームを持つ新しい親を与え、最初のビットを隠します。そうでない場合は、各ルートに古いルートのキーとビットストリームを持つ新しい親を与え(最初の各ビットを除外)、それらのツリーに再帰的に参加します。
、および後続の再帰呼び出しは常に異なる色のツリーで行われるため、同じ分析が適用されます。
a 01110
b 110..
c 10...
d 00000
によって作成されたツリーの[a,b]
高さは2、作成されたツリーの[c,d]
高さは2、作成されたツリーのjoinEqual (tree [a,b]) (tree [c,d])
高さは3です。ただし、作成されたツリーの[a,b,c,d]
高さは5です。