赤と黒の木の部分範囲


14

ライブラリのバグを修正しようとしていたとき、私は赤と黒の木のサブレンジを見つけることに成功せずに論文を検索しました。私はジッパーと 不変データ構造の削除アルゴリズムで使用される通常の追加操作に似た何かを使用するソリューションを検討していますが、私は見つけることができなかったより良いアプローチ、または最小の複雑さの境界さえあるのだろうかとまだ疑問に思っていますそのような操作で?

明確にするために、赤と黒のツリーと2つの境界が与えられた場合、それらの境界内に属する最初のツリーのすべての要素を含む新しい赤と黒のツリーを生成するアルゴリズムについて説明します。

もちろん、複雑さの上限は、1つのツリーをトラバースし、要素を追加して他のツリーを構築する複雑さです。


3
@Radu:コメント編集機能にバグがあります。コメントでラテックスを使用してコメントを編集すると、複製などの奇妙な動作が見られます。
Aryabhata

@Radu質問をよりよく説明するために、いくつかの段落を追加しました。
ダニエルC.ソブラル

木は不変ですか?
伊藤剛

また、最後の段落の下限ではなく上限を意味しましたか?
伊藤剛

2
赤黒木での分割操作は、最悪の場合O(log n)で実装できるようです。ここで、nは木の要素数です。この主張は、ESA 2006のGerthStøltingBrodal氏、Christos Makris氏、Kostas Tsichlas氏の論文「純粋に機能的な最悪の場合の一定時間の分類可能なソート済みリスト」の紹介で見つけることができます:cs.au.dk/~gerth/pub/esa06trees.html。以前のコメントで述べたように、これにより、サブレンジ操作の最悪の場合のO(log n)時間の実装が可能になります。
伊藤剛

回答:


10

この回答は、質問に対する私のコメントの一部を組み合わせて展開します。

赤黒木の部分範囲操作は、最悪の場合のO(log n)時間で実行できます。ここで、nは元のツリーの要素の数です。結果のツリーは元のツリーといくつかのノードを共有するため、このアプローチは、ツリーが不変である場合(またはツリーは変更可能ですが、元のツリーは不要になった場合)にのみ適しています。

最初に、サブレンジ操作は2つの分割操作で実装できることに注意してください。ここで、分割操作は赤黒ツリーTとキーxを取り、Lがxより小さいTのすべての要素とRがxより大きいTの要素で構成されるような2つのツリーLとRを生成します。したがって、今の目標は、最悪の場合のO(log n)時間で赤黒木に分割操作を実装することです。

O(log n)時間に赤黒木で分割操作を実行するにはどうすればよいですか?さて、よく知られた方法があることがわかりました。(私はそれを知りませんでしたが、私は、データ構造のない専門家ではありません。)考えてみましょう参加 Lのすべての値がRのすべての値よりも小さくなるように、2つのツリーのLとRを取り、から成る木を生成し、操作し、すべてのLおよびRの値。結合操作は最悪の場合に実装できますO(| r L −r R | +1)、ここでr Lおよびr RそれぞれLとRのランク(つまり、ルートから各リーフへのパス上の黒いノードの数)です。分割操作は、結合操作をO(log n)回使用することで実装でき、合計の最悪の場合の時間は、テレスコープの合計を考慮すると、まだO(log n)です。

Tarjanの本[Tar83]のセクション4.1および4.2は、最悪の場合の時間O(log n)で赤黒木に結合および分割操作を実装する方法を説明しています。これらの実装は元のツリーを破壊しますが、ノードを変更する代わりにコピーすることにより、それらを不変の機能的な実装に簡単に変換できます。

サイドノートとして、Objective CamlのSetおよびMapモジュールは、(不変の)バランスの取れたバイナリ検索ツリーでの分割操作と他の標準操作を提供します。それらは赤黒木を使用しませんが(左高さと右高の差が最大2であるという制約のある平衡二分探索木を使用します)、実装を調べることも有用です。これがSetモジュールの実装です

参照資料

[Tar83]ロバート・エンドレ・タージャン。 データ構造とネットワークアルゴリズム。1983年、SIAMの応用数学におけるCBMS-NSF地域会議シリーズの第44巻。


@Radu GRIGore:はい、何かが足りない場合を除きます。
伊藤剛

@Radu GRIGore:またはそうでないかもしれませんが、今はわかりません。この分割操作の実装は、出力ツリーにO(log n)新しいノードを割り当てますが、O(1)作業スペースのみを必要とするテール再帰的な方法で操作全体を実装できると思います。これが正しければ、あなたの質問への答えは、あなたが何を意味するかに依存します「余分なスペース。」
剛伊藤

@Radu GRIGore:その場合、余分なスペースはO(1)であると思いますが、注意深くチェックしていません。
伊藤剛

@Radu GRIGore:結果自体を保存するのに必要なスペースの量を気にせずにワークスペースの量を気にする理由がわかりません。複雑性理論では、通常、問題は結果が何であるかを指定するため、結果を保存するために必要なスペースはアルゴリズムに依存しません。ただし、現在の問題では、必要な操作を実装する方法は多数あり、実装によっては、結果を保存するために他の実装よりも多くのスペースが必要です。このスペースの量の違いを無視しても、必要なワークスペースの大きさが気になる理由はわかりません。
伊藤剛

不変ツリーの問題は、可変ツリーの問題とは異なります。私は違いを理解しているので、私はそれについて尋ねることは何もありませんでした。ここで、2つの問題の1つにズームインすると、議論する2つの側面があります。それは、メモリと時間です。あなたはどれだけのメモリを使っているか言わなかったし、答えが何なのか私には明らかではなかったので、私は尋ねた。これにより、2つの問題の違いを無視するように思われたことがわかりません。
ラドゥグリゴール

8

解決策は、赤黒木を使用しないことです。スプレイツリーとAVLツリーでは、分割と結合のコードは非常に簡単です。これをサポートするスプレイツリーおよびAVLツリーのJavaコードを含む次のURLを参照します。次のURLに移動して、Set.java(avlツリー)およびSplayTree.java(splayツリー)をチェックアウトします。

ftp://ftp.cs.cmu.edu/usr/ftp/usr/sleator/splaying/

---ダニー・スレイター


5
サイトへようこそ、ダニー!
スレシュヴェンカト

2
これは、Scala Red Black実装を変更してサブレンジングをサポートするのにどのように役立ちO(n)ますか?私が持っている問題ではないので、どのような種類のツリーに単純なサブレンジの実装があるかを尋ねませんでした。この回答は、意図は正しいものの、トピックから外れており、目前の問題には役に立たないものです。
ダニエルC.ソブラル

6

(これはコメントを意図していますが、私はコメントを残すにはあまりにも新しいです。)

サブツリーを新しいツリーとして返し、サブツリーを別のサブツリーのない入力ツリーとして返す「excision」操作にも興味があるかもしれないことに注意したいだけです。ただし、既知の方法はレベルリンクに依存しているため、ツリーの基になる表現を制御する必要があります。償却は、償却された意味ではありますが、小さなツリーのサイズに対数的に時間をかけて実行されます(「償却」はiircです。これ以上論文にアクセスできないため)。

K. Hoffman、K。Mehlhorn、P。Rosenstiehl、およびRE Tarjan、レベルリンク検索ツリーを使用したヨルダンシーケンスの線形時間の並べ替え、情報と制御、68(1986)、170〜184

PS上記の引用は、Seidelのtreap writeupから来ました。トレジャーは切除もサポートします。


このメソッドは、2つの境界へのポインター(または「フィンガー」)がすでにあることを前提としています。
jbapple

3

nm[ab]

  1. Olgnaa
  2. Om
  3. Om

Om+lgnOn+mlgm

omΩlgmklgm

詳細を把握していないので、余分な簿記が実行時間にどのように影響するかわかりません。

O1Ωlgm


これについて考えるとO(logn)、一時的な配列を避けることができ、で大まかなカウントを得ることができると思います。
ダニエルC.ソブラル

ルートにサブツリーサイズを格納することにより、O(lg n)のカウントを取得できます。
ラドゥグリゴール

...しかし、ノードにサイズを保存することは、補助領域を使用しないという要件に反するため、私の観察ではメモリに関する懸念に対処していません。
ラドゥグリゴール

1
バイナリツリー完璧(木そのものに加えて)のみCONSTANT余分なスペースを使用してリバランスすることができます。eecs.umich.edu/~qstout/abs/CACM86.html
Jeffε

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