nペアのノード間のルートの存在


8

ノードの有向非循環グラフが与えられた場合、ノードの次のnペア1 n + 1 n n + n )の間にパスがあるかどうかをどのように判断できますか?そこに簡単なアルゴリズムであり、O nがN + M 各ノードからの検索実行することによって(mはエッジの数である)1 ... N、それはより良好に行うことができますか?2n(1n+1),,(nn+n)O(n(n+m))1n

編集:完全なパスではなく、存在を探しています。


あなたが何を求めているのかは完全には明らかではありません。あなたが言及したエッジを含む単一のパスを探していますか?または、複数のパスを探していますか?
Dave Clarke

2
@Dave:彼は推移閉包行列の小さな断片のORを探しています。
Radu GRIGore、2011

1
@ Alexandru、1-> 4、2-> 3。3-> 1、4-> 2を追加します。
Radu GRIGore、2011

6
mが大きい場合、O(nm)時間よりも優れている高速行列乗算を介して推移閉包を計算できます。
Chandra Chekuri、2011

4
@alexandru:公平を期すために、あなたの質問はそうではありません。実用的な実装ではなく、より高速なバインドを求めていました(これは有効ですが、別の質問です)
Suresh Venkat

回答:


5

チャンドラChekuriコメントで指摘したように、あなただけのO(問題解決、高速な行列の乗算を経由して推移閉包を計算することができ)の時間を(お好みの方法で、O(使用nは2.376の銅細工とウィノグラード、以上の事実上経由) StrassenのO(n 2.81))を使用します。これは、密なグラフに適しています。nωn2.376n2.81

密なグラフの問題でこの実行時間を上回れば、2つのブール行列の積を計算するよりも効率的な三角形検出のアルゴリズムが得られると私は主張します。このようなアルゴリズムの存在は、未解決の大きな問題です。

三角形の問題をnペアのDAG到達可能性の問題に還元します。n個のノードにグラフGが与えられ、Gに三角形が含まれているかどうかを判断するとします。

V1V2V3V4uiVivi+1Vi+1i=1,2,3(ui,vi+1)(u,v)(u1,u4)uG4nn2n3n2n(y,d)及び dは、従って得ダミー)を、 6 N正確に問題の-nodeインスタンス。yV2V3d6n


0

トポロジカルソート()を実行して、各ノードに到達できるノードのビットセット(O m n )を伝播します。O(m+n)O(mn)

O(n)n+xxxn+x


m=o(n)

1
これは私の基本的なアルゴリズムよりもどのように優れていますか?
Alexandru

O((m+n)n/w)w

これはトレードオフです。O(n)の代わりにO(n * n / w)の追加メモリを使用します。
Alexandru

@Alexandru、最悪の場合は漸近的に同じですが、平均ケースの分析はトリッキーであり、予想されるグラフ構造の統計に依存する方がよい場合があります。
Peter Taylor

0

O(N2)

yespath = array(1..N)       // output of the algorithm
                            // initially filled with false
processed = array(1..N)     // processed nodes

// HEURISTIC 1: some preprocessing
for every node u in 1..N
  if (no outbound edges from u) then processed[u] = true
  if (no inbound edges to u+N) then processed[u] = true

for each node u in [1..N]    // MAIN loop 
  if (not processed[u]) then
    collected = [u]          // a list that initially contains u
    visited = array(1..2*N)  // filled with zeroes        
    do a breadth first scan from u
       for each node v found in the search
         set visited[v] = distance from u
         if (v <= N) then add v to collected
    end do

    // HEURISTIC 2: useful collected info on other nodes <= N
    foreach node v in collected
      processed[v] = true
      if ( visited[ v + N ] > 0 and visited[v] < visited[v+N] ) then yespath[v] = true
    end foreach

  end if
end for // MAIN loop


O(N2)O(Nk)e>u+N

他のヒューリスティックを追加できますが、それらの効率(および提案された3つの効率)はグラフ構造に大きく依存します。

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