ほぼ同じサイズのtreapのようなデータ構造の高速結合


16

所与2本のAVL木T1及びT2及び値trようxT1,yT2,x<tr<y、それが含む新しいAVLツリーを構築することが容易であるtrと値T1及びT2時間でO(1+|h(T1)h(T2)|)、ここでhTはツリー高さを示しますT(ツリーが高さを保存している限り)。

これは赤黒木でも可能です。他の多くの種類のバランスの取れた木も同様に想定しています。

これは、盗用または盗用のようなデータ構造で可能ですか?を省略するとどうなりtrますか?

OhT1hT2


ほぼ同じサイズのAVLツリーの高速結合を示す筆者のHaskellコードを次に示します。haskell.pastebin.com
jbapple

h(T_1)= h(T_2)の場合でも、新しいノード(値t_rを含む)の予想される深さは定数よりも大きいようです(証拠なしに)可能性があるとは思えません。
伊藤剛

伊藤剛:同意します。新しいノードに他のノードに優先順位を割り当てるのと同じ方法で優先順位を割り当てた場合。ルートノードの優先度よりも高いことが保証された優先度を割り当てた場合はどうなりますか?それは優先度のIIDの性質を破壊しますが、その後、永続的な赤黒木のパスがエンドポイントでマークされるように、他の優先度をシフト済みとしてマークするとどうなりますか?または、値をトレープの葉にのみ保存し、t_rなしで結合を実行するとどうなりますか?
-jbapple

子孫がn個あるトレップのノードには、確率が1 / nの子孫がi個あります。これは、同じサイズのトレープでも長いマージ時間に貢献する可能性があります。新しいルートを選択するには、ツリーに移動する必要があります。n個の子孫を持つtreapノードに、確率(nがi)/ 2 ^ nの子を残し、値がB +ツリーのような葉にのみ格納される場合 次に、2つの同じサイズの再結合により、1つのツリーから別のツリーに少数の要素が再分配されます。
jbapple

私の計算が正しければ、再配布される要素の予想数はTheta(sqrt n)であり、他のすべてがうまくいくと仮定すると(指の検索プロパティなど)、予想にまだTheta(lg n)時間かかります。さらにタイトなディストリビューションを使用するのはどうですか?
jbapple

回答:


3

いいえ、優先順位がランダムな場合、通常のTreapでこれを行うことはできません。

私が行う正確な主張は、ランダムな優先順位で2つの同じサイズのトループでそのようなマージを実行するには、期待してポインターを更新する必要があるということです。Θ(logn)

大まかな証拠のスケッチは次のとおりです。

操作を実行するために、変更する必要があるポインターの数を考慮してください。挿入せずにとマージするだけの場合、バインドを証明する方が簡単です。右脊椎考えてみましょうのと左脊椎の。の要素を赤、の要素を青にます。を優先度順にます。このシーケンスで色が変わるたびにポインターを変更する必要があります。両方のスパインのサイズがΘ(logn)trT1T2S1T1S2T2S1S2S1S2Θ(logn)高い確率で、優先順位がランダムである場合、シーケンス内の色の変化の数もことを確認するのはそれほど難しくありません。したがって、マージのポインターを更新する必要があり(を追加せずに)。Θ(logn)Θ(logn)tr

現在、マージの中にを追加してもあまり役に立ちません。その場合のポインター変更の数は、次のように下限を設定できますを優先度ます。シーケンス内の未満のすべてを削除します。そして、結果のシーケンスの色の変化の数が下限です。以来ランダム優先され、最終treapでそれをルートとするサブツリーの予想高さはO 1 それだけ有するので、Oを1 のノードS 1S 2の期待に、それよりも低い優先度を持つ、我々のでOだけを失ったtrS1S2{tr}trtrO(1)O(1)S1S2t rを追加すると、ポインターは下限で変化します。O(1)tr

そうは言っても、予想される一定の時間のマージを可能にする「トレジャーのような」データ構造を取得する方法はおそらくあります。


はい、「treのような」データ構造を探しています。私はコメントと私の死んだ答えで同じくらい言及しましたが、タイトルや質問には入れませんでした。
jbapple

ご回答有難うございます。質問のタイトルとテキストを変更して、あいまいさが少なくなるようにしました。
jbapple

1

更新:この結合操作の不正確さに関する更新については、以下を参照してください

考えられる解決策の非常に大まかなスケッチを次に示します。

ランダムにバランスされたタイプのB +ツリーを使用して、この問題の解決策があると思います。トレジャーのように、これらの木はユニークな表現を持っています。トレジャーとは異なり、いくつかのキーを複数回保存します。Bent et alの「Biased Search Trees」のトリックを使用して、各キーが表示される最も高い(つまり、ルートに最も近い)レベルにのみ保存するように修正することは可能かもしれません)

一意の値の順序付けられたセットのツリーは、各値をビットストリームに最初に関連付けることによって作成されます。これは、トレープの各値が優先順位に関連付けられる方法と同様です。ツリーの各ノードには、キーストリームとビットストリームの両方が含まれています。さらに、非リーフノードには、そのノードをルートとするツリーの高さを示す自然数が含まれます。内部ノードには、ゼロ以外の数の子があります。B +ツリーと同様に、ルートからリーフまでのすべての非自己交差パスは同じ長さです。

すべての内部ノードは(B +ツリーのように)子孫の葉の最大キーkが含まれます。それぞれはまた、自然数含まIをルートとするツリーの高さを示すVを、および関連付けられたビットストリームKからI + 1以降番目のビットを。vをルートとするツリーのすべてのキーのビットストリームの最初のビットが同じである場合、vのすべての子はリーフであり、i1です。それ以外の場合、vの子は内部ノードであり、すべてのキーに関連付けられたビットストリームで同じi番目のビットを持ちます。vkivki+1vvi1vi

ビットストリームが関連付けられたキーのソートされたリストからツリーを作成するには、まず、ストリームの最初のビットに基づいてキーを連続したグループに収集します。これらの各グループに対して、グループ内で最大のキーのキーとビットストリームを使用して親を作成しますが、ストリームの最初のビットは除外します。次に、新しい親で同じグループ化手順を実行して、祖父母を作成します。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 - 1n21n および期待値はn+1/2です。すべてのためのN2、これは3n11n+1/2n2なので、予想されるツリーの高さはOlgnです。34nOlgn

同じ高さの2つのツリーを結合するには、最初にルートが同じ色であるかどうかを確認します。その場合は、左のルートからその右端の子を切断し、右のルートからその左端の子を切断してから、これら2つのツリーを再帰的に結合します。結果は、ツリーのフレーバーが同じであるため、同じ高さまたはより高いツリーになります(以下を参照)。2つのツリーを再帰的に結合した結果が、切断された2つの子と同じ高さである場合、それを前の左ルートの残りの子と右ルートの残りの子を持つルートの中間子にします。1だけ背が高い場合、その子をルートの中央の子にし、左のルートの残りの子を前に、右のルートの残りの子を後にします。根の色が異なる場合、同じフレーバーがあるかどうかを確認します。もしそうなら、正しいルートのキーとビットストリームを持つ新しい親を与え、最初のビットを隠します。そうでない場合は、各ルートに古いルートのキーとビットストリームを持つ新しい親を与え(最初の各ビットを除外)、それらのツリーに再帰的に参加します。

1/21/2O11/4、および後続の再帰呼び出しは常に異なる色のツリーで行われるため、同じ分析が適用されます。

1/2O(1)

O(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です。

このエラーを見つけるために使用したコードを次に示します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.