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