タグ付けされた質問 「union-find」

1
指示されたunion-find
エッジを動的に追加して特定のクエリを実行できる有向グラフについて考えGGGます。 例:分離セットフォレスト 次の一連のクエリについて考えてみます。 arrow(u, v) equiv(u, v) find(u) 最初のものは、矢印追加場合は、2番目の一方が決定し、グラフにしU ↔ * V、最後の一つはの同値クラスの正規代表見つけ↔ *を、すなわちA R (U )、その結果、U ↔ * V r (v )= r (u )を意味します。u→vu→vu→vu↔∗vu↔∗vu↔^*v↔∗↔∗↔^*r(u)r(u)r(u)u↔∗vu↔∗vu↔^*vr(v)=r(u)r(v)=r(u)r(v)=r(u) これらのクエリを準定数の償却済みの複雑さで実装する分離セットフォレストデータ構造を使用したよく知られたアルゴリズム、つまります。この場合、を使用して実装されていることに注意してください。O(α(n))O(α(n))O(α(n))equivfind より複雑なバリアント 今、私は方向が重要であるより複雑な問題に興味があります: arrow(u, v) confl(u, v) find(u) 最初は矢印追加し、秒はと両方から到達可能なノード、つまりがあるかどうかを決定します。最後のものは、が意味するようなオブジェクトを返す必要があり、は簡単に計算できるはずです。(たとえば、計算するために)。目標は、これらの操作が高速になるような適切なデータ構造を見つけることです。u→vu→vu→vwwwuuuvvvu→∗←∗vu→∗←∗vu→^*←^*vr(u)r(u)r(u)u→∗←∗vu→∗←∗vu→^*←^*vr(u)∙r(v)r(u)∙r(v)r(u) \bullet r(v)∙∙\bulletconfl サイクル グラフにはサイクルを含めることができます。 主要な問題のDAGのみを考慮するために、強連結成分を効率的かつ増分的に計算する方法があるかどうかはわかりません。 もちろん、DAGの解決策もありがたいです。これは、最も一般的でない祖先の増分計算に対応します。 素朴なアプローチ disjoint-setフォレストのデータ構造は、エッジの方向を無視するため、ここでは役に立ちません。そのノート、グラフがコンフルエントでない場合には、単一のノードにすることはできません。r(u)r(u)r(u) 一つは、定義することができと定義することがとして場合。しかし、これを段階的に計算する方法は?r(u)={v∣u→∗v}r(u)={v∣u→∗v}r(u)=\{v ∣ u→^*v\}∙∙\bulletS1∙S2S1∙S2S_1\bullet S_2S1∩S2≠∅S1∩S2≠∅S_1 ∩ S_2≠∅ おそらく、そのような大きなセットを計算することは役に立たないでしょうが、通常のunion-findアルゴリズムのように、小さなセットはより興味深いはずです。

2
ランクなしのパス圧縮を使用したunion-findの複雑さ
ウィキペディアはパス圧縮なしのランク別組合はの償却時間複雑与え言い、そしてランクとパス圧縮することにより、両方の労働組合は、の償却時間複雑与えることをO (α (N ))(αはの逆であるがアッカーマン関数)。ただし、ユニオンランクなしのパス圧縮の実行時間については触れていません。これは、私が通常自分で実装するものです。O(logn)O(log⁡n)O(\log n)O(α(n))O(α(n))O(\alpha(n))αα\alpha パス圧縮最適化を使用して、ランク最適化による結合を使用しない場合のunion-findの償却時間の複雑さはどのくらいですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.