有向非巡回グラフの推移閉包を取得するための効率的なアルゴリズム


14

グラフの問題を解決しようとしています(宿題ではなく、単にスキルを練習するためです)。DAGが与えられます。ここで、は頂点のセット、はエッジです。グラフは隣接リストとして表されるため、はすべての接続を含むセットです。私の仕事は、各頂点から到達可能な頂点を見つけることです。私が使用するソリューションは複雑さを持ち、 推移的閉包を持ちますが、ブログで読むと高速になる可能性がありますが、方法は明らかになりませんでした。DAGの推移的閉包問題を解決する別の方法(より複雑な方法)を教えてもらえますか?G(V,E)VEAvvvVO(V3)



そしてこれ:cs.hut.fi/~enu/thesis.html
AJed

ただし、私の提案はを保持することです。ただし、平均して比較回数を減らすようにしてください。つまり、推測を行い、単純なルールをアルゴリズムに追加します。行列の乗算を使用できますが、小さなグラフに使用している場合、それは単なる混乱であり、実際には実際にはメソッドの方が優れています。O(|V|3)
AJed

@AJedこの特定の問題では、が制限時間を超えます。O(V3)
ロントギアニスアリストファニス

2
@RondogiannisAristophanesあなたが制限時間を言うとき、これはトップコーダーなどのようないくつかのプログラミング/アルゴリズムの課題の問題であることを意味しますか?その場合、およびソリューションを正しく実装していることが確実な場合は、問題をもう一度調べてください。物事を単純化するかもしれないいくつかの他の隠されたプロパティがあるかもしれません、または推移的な閉鎖が必要でないように問題を表現するより良い方法があるかもしれません。推移的閉包は行列乗算と同じくらい難しいからです。O(V3)
student.cs.uwaterloo.ca/~cs466/Old_courses/F08/

回答:


8

グラフが非周期的であるという事実により、この問題ははるかに単純になります。

トポロジカルソートでは、頂点順序付けを行うことができ、i < jの場合、v jからv iに戻るエッジはありません。リスト内のすべてのエッジが「進む」ように頂点をリストしました。v1,v2,,vni<jvjvi

(分析を修正し、わずかに高速なアルゴリズムを提供するように編集)

最後の頂点から始めて、このリストを逆方向にたどっていきます。v nの推移閉包はそれ自体です。また、追加のV nとのエッジにすべての頂点の推移閉包にV Nvnvnvnvn

他の各頂点について、末尾から逆向きに移動し、最初にv iをそれ自身の推移閉包に追加し、次にv iの推移閉包内のすべてを、エッジがv iのすべての頂点の推移閉包に追加します。vivivivi

実行時間は最悪の場合でn個の頂点の数M O N 2エッジの数。トポロジカルソートにはO n + m 時間かかります。次に、逆方向パスで別のO m n 作業を行います。リストを逆方向に進むと、各エッジに対して、nを加算する必要がありますO(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n 誰かの推移的閉包の頂点。

全員の推移的閉包をビット配列で表すことにより、一定の係数で高速化できることに注意してください。しかなかったとします。次に、iが推移的閉包にある場合はビットiが1 で、それ以外の場合は0である単一の64ビットintを使用します。その後、我々はすべてのものを追加部分I「にsの推移閉包J s」は本当に速いです:私たちはちょうど取るのC jは | = C I。(バイナリOR演算。)n=64iiijcjci

以下のため、あなたは配列でそれらを維持し、いくつかの算術演算を行う必要があるだろうが、それははるかに高速オブジェクトの集合よりなります。n>64

また、非常に最悪の場合のbig はまだO n 3であることがわかりますが、実際にこれを破るには、もっと複雑なものが必要です。このアルゴリズムはまばらなグラフでも非常にうまく機能します。OO(n3)


1
セットにリンクリスト表現を使用すると、共通のテールを共有することになります。
カイルバット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.