2つのバイナリ検索ツリーのマージ


17

任意のサイズと範囲の2つのバイナリ検索ツリーをマージするアルゴリズムを探しています。これを実装するための明確な方法は、範囲が他のツリーの任意の外部ノードに収まるサブツリー全体を見つけることです。しかし、このタイプのアルゴリズムのための時間を実行している最悪の場合は、の順になるようだと、それぞれの木の大きさです。O(n+m)nm

ただし、これはで行うことができると言われていますO(h)。ここhで、高さの大きいツリーの高さです。そして、私はこれがどのように可能かについて完全に迷っています。最初に木を回転させて実験してみましたが、木を背骨に回転させることはすでにO(h)です。


私も同じ質問をしているエリクを知らない。

公平のために、これはアルゴリズムの宿題で与えられた質問でした。質問必要な情報を提供するのを忘れていたため、O(h)は実行時間が厳しすぎることがわかりました。
エフリッツ

何かが足りないのO(log n)ですか、単純なノード移動機能を使用してバイナリツリーのマージを簡単に行うことはできませんか?
AT

@ATはい。ただし、あるBSTのキーが他のBSTから相互に排他的であることを知りませんでした。
エフリッツ

1
これは赤黒の木であり、BSTではありません。赤黒(およびAVLツリーとヒープ)は、高さ制限のプロパティを保持する特別な種類のツリーです。バニラBSTは単一のスパインにすることができます。数字の減少しないまたは増加しない列をBSTに挿入してみてくださいn。これらのツリーの高さが実際にであることがわかります。完全または完全な二分木のみが、ノードの総数に対する高さの対数を持ちます。
エフリッツ

回答:


24

arXivの:1002.4248、ジョンIaconoとÖzgürオズカンは二つ二分探索木をマージするための比較的単純なアルゴリズム記述償却時間; 分析は難しい部分です。[ 更新: Joeが答えで正しく観察しているように、このアルゴリズムはBrownとTarjanによるものです。]また、バイアスされたスキップリストに基づいたO log n 償却時間のマージをサポートするより複雑な辞書データ構造についても説明しています。O(log2n) O(logn)

一方、最悪の場合の境界log n は不可能です。有する2本の二分探索木考慮するN個のノードとの間であっても整数格納1 22 nとの間に奇数の整数を格納する、他の1及び2 N - 1。2つのツリーをマージする間のすべての整数格納し、新たな二分探索木作成1及び2 のnを。そのようなツリーでは、一定の割合のノードが親と異なるパリティを持っています。(証明:奇数の葉の親は偶数である必要があります。)したがって、偶数ツリーと奇数ツリーをマージするには変更が必要ですO(logn)n22n12n112nポインター。Ω(n)


注:このペーパーの説明を正しく読んだ場合、これらのツリーは挿入と削除をサポートしていません。マージはちょうど(ジョーの答えに記載)を指探索木を併合するための手順に従います。操作の制限されたセットにより、O n lg mO(lg2n)1。O(nlgmn)
jbapple

1
改善された分析は、許可された操作の制限ではなく、償却によるものです。挿入と削除は、同じ償却期間内の分割とマージ(実際には「結合」)でサポートできます。O(logn)
ジェフ

ただ好奇心から、ん木の代わりに(私は「...変更すると言ったときにあなたが何を意味するのかであると仮定リンクされたリストの配列に格納されている場合、時間には影響を受けるのポインタを」)?Ω(n)
mtahmed

デフォルトでは、「バイナリ検索ツリー」はポインターベースの構造です(「リンクリスト」ではありません)。各ノードは、その2人の子供と、おそらくその親を指します。しかし、下限は正確な表現に依存しません。あり 2つのnノードのバイナリ検索ツリーをマージする方法。したがって、比較ベースのアルゴリズムには少なくともlog2 2n(2nn)nの比較は正しいものを選択します。log2(2nn)2nO(logn)
ジェフ

1
@Jɛff E:分割と結合はサポートされていることに同意しますが、ツリーの作成や破壊はサポートしているとは思いません。たとえば、アルファベットから「x」を削除する場合、「a..wyz」だけでなく「x」も取得されます。ユニバースのサイズ(、セクション2.1を参照)は変わりません。また、セクション1のイントロでは、セットがユニバースを分割する必要があることに注意します。これは、ユニバースの各要素が何らかのツリーにあることを意味すると解釈します(おそらく間違っています)。だから、私がそれを読んだ方法では、この構造は無制限の宇宙では機能しません。それが私が上記のコメントを書く方法です。n
jbapple

9

このリファレンスは役に立つかもしれません:Brown and Tarjan、A Fast Merging Algorithm、著者はこれは最適です(比較ベースのアルゴリズム)。M及びnはソートされたリストの長さは、二分探索木で表され、それはものとするMNO(nlogmn)mnmn

また、指の探索木に関するこのホワイトペーパーのセクション11.5で、順序付きセットをマージするためのさまざまな手法の説明を見ることができます。


2
両方の下限時間結合させ、マッチングされたと仮定し、MをNO(nlogmn)mn
ジェフ

私はそれが時間の制約によって暗示されていると思いましたが、質問を編集して明示的にしました。
ジョー

0

1
それらのデータ構造は、マージではなく、O(1)償却時間での結合をサポートしています。1つのツリーのすべての要素は、他のツリーのすべての要素よりも小さくなければなりません。
ジェフ

ああ、本当。記事再読しなければならなかった:「(参加Tのjは)、一本の木に2本の木を結合木。T IおよびTのjは、すべての要素という意味で順序付けされたT jが最も小さいかのいずれよりも小さいか大きいですT iの最大要素。一般性を失うことなく、w T i= w T jと仮定します。この場合、ツリーT jはツリーT iに接続され、この演算の結果はツリーですTiTjTiTjTjTiw(Ti)=w(Tj)TjTiの背骨上のノードに取り付けられている T I「。TiTjTi
AT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.