指示されたunion-find


11

エッジを動的に追加して特定のクエリを実行できる有向グラフについて考えGます。

例:分離セットフォレスト

次の一連のクエリについて考えてみます。

arrow(u, v)
equiv(u, v)
find(u)

最初のものは、矢印追加場合は、2番目の一方が決定し、グラフにしU * V、最後の一つはの同値クラスの正規代表見つけ*を、すなわちA R U 、その結果、U * V r v = r u )を意味します。uvuvr(u)uvr(v)=r(u)

これらのクエリを準定数の償却済みの複雑さで実装する分離セットフォレストデータ構造を使用しよく知られたアルゴリズム、つまります。この場合、を使用して実装されていることに注意してください。O(α(n))equivfind

より複雑なバリアント

今、私は方向が重要であるより複雑な問題に興味があります:

arrow(u, v)
confl(u, v)
find(u)

最初は矢印追加し、秒はと両方から到達可能なノード、つまりがあるかどうかを決定します。最後のものは、が意味するようなオブジェクトを返す必要があり、は簡単に計算できるはずです。(たとえば、計算するために)。目標は、これらの操作が高速になるような適切なデータ構造を見つけることです。uvwuvuvr(u)uvr(u)r(v)confl

サイクル

グラフにはサイクルを含めることができます。

主要な問題のDAGのみを考慮するために、強連結成分を効率的かつ増分的に計算する方法があるかどうかはわかりません。

もちろん、DAGの解決策もありがたいです。これは、最も一般的でない祖先の増分計算に対応します。

素朴なアプローチ

disjoint-setフォレストのデータ構造は、エッジの方向を無視するため、ここでは役に立ちません。そのノート、グラフがコンフルエントでない場合には、単一のノードにすることはできません。r(u)

一つは、定義することができと定義することがとして場合。しかし、これを段階的に計算する方法は?r(u)={vuv}S1S2S1S2

おそらく、そのような大きなセットを計算することは役に立たないでしょうが、通常のunion-findアルゴリズムのように、小さなセットはより興味深いはずです。

回答:


3

編集:私の問題に対する私の理解が(私は願っています)より明確になったので、私の答えを完全に書き直しました。)

この問題は、グラフが作成されて検索されるときに、グラフの推移的閉包の近似値を段階的に構築して改善することに減らすことができるようです。

r(u)は、抽象的には、グラフ内のすべてのについて、と両方から到達可能なすべてのノードのセットです。(もちろん、すべてのペアが必ずしも両方から到達できるノードを持っているわけではありません。)union-findの場合とは異なり、このセットはグラフの標準的な代表ノードとして表すことができません。と両方から、およびと両方から到達可能なノードが存在する場合がありますが、と両方からは到達できません。uvvuu,vuvuwvw

すべてのために、あなたは維持すると言うから到達可能なノードの集合(私はこれを呼び出します)。これらのセットは、各ノードの追加のデータ構造、または少なくとも、グラフ内の追加の「ショートカット」エッジのセットである必要があります。指定したグラフの構造を保持する必要がない場合は、これらのエッジと指定したエッジを区別する必要はありません。uuR(u)

これをキャプチャして、一般的なケースよりも効率的なデータ構造(ビットベクトルやハッシュテーブルなど)を用意するアイデアはありませんが、これらのセットを段階的に更新できます。

から他のノードにエッジを追加するたびに、ます。uvR(u)=R(u)R(v)

confl最初に試して実装します。空でない場合は、trueを返します。しかし、それ空の場合、両方の到達可能なセットを使い果たすか、共通のノードを見つけるまで、とから2つの並列幅優先検索を実行します。あなたがこれを行う一方で、また更新と(及びあなたが見つけた到達可能なノードを含めることのあなたが見つけるすべての中間ノードを)。共通のノードが見つかった場合は、R(u)= R(v)= R(u)\ cup R(v)を設定します。R(u)R(v)R(u)R(v)R(u)R(v)R

find(u)返すだけです。問題は、純粋にに関して実装されていないことです。アルゴリズムが非インクリメンタル(つまり、グラフの推移閉包ですべてのノードのすべてのセットを事前計算する)でない限り、どうなるかはわかりません。コストですが、に近づくかどうかはわかりません。(おそらくそうではありませんセットが飽和している場合でも、2つのBFSを起動する必要があります。これは、アルゴリズムを非増分にしない限り避けられないようです。)R(u)conflfindRO(α(n))conflR

これは、グラフの推移閉包を維持するためのLaPoutréとvan Leeuwenの方法の特別なケースである可能性が高いように聞こえます

これは質問に完全には答えませんが、おそらくそれはそれを明確にするのに役立ち、グラフアルゴリズムの経験が豊富な人はセットをエンコードするためのより良いデータ構造を提供できます。R


回答ありがとうございます。質問がもっと明確になったことを望みます。接続されたコンポーネントは気にしません(ただし、CC は最終的なソリューションに役立つ場合あります)。私 まだ持っていません。このをDAGの単一ノードにすることはできません。r u r(u)r(u)
jmad

わかりました、それは少し明確です。は、抽象的には、グラフ内のすべてのについて、と両方から到達可能なすべてのノードのセットであるように見えます。このセットはからの「ショートカット」エッジのセットである可能性があります。これにより、グラフの到達可能性の推移閉包を計算しているように見えます。union-findよりも多くのストレージ/作業(すべての「ショートカット」エッジのラベル付け/更新)が必要になる可能性がありますが、これがインクリメンタルに実行できなかった理由(まだパスを見つけたら圧縮)はまだわかりません。これは理にかなっていますか?u v v u ur(u)uv vuu
Chris Pressey

推移閉包を特徴づけるために公正な方法であると仮定すると、:それは密接に関連されるだろうように、この音、en.wikipedia.org/wiki/...r(u)
クリス・プレスジー

confl(u,v)をマージするべきではないと思います。それらを変更することもできますが、それはdisjoint-set forestメソッドのようにへの呼び出しによってすでに行われています。R v R(u)R(v)find
jmad

それらをマージしてはいけないというのはあなたの言う通りです。答えを編集します。しかし、近似するfindを除いて、「見つける」ための一意のオブジェクトがないため、への呼び出しは、実際に役立つものを計算できません。(更新を行うために、何を探すべきかをどのように知るのですか?のみが与えられますが、情報は、グラフ内の他のすべてのノードに適用される可能性があります。)R u u R u r(u)R(u)finduR(u)
Chris Pressey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.