2011-01-04 8 views
2

私は数百万の頂点とエッジを持つ有向グラフを持っています。頂点の集合が与えられ、それらが「START_POINTS」と呼ばれると仮定しよう。 「END_POINTS」と呼ばれるもう1組の頂点も与えられる。問題は、どのSTART_POINTSからどのEND_POINTSに到達できるかを見つけることです。ここで有向グラフでの効率的な検索

は一例です:

START_POINTS: S1 S2 S3 S4 S5 S6 S7 ... 
END_POINTS : E1 E2 E3 E4 E5 E6 E7 ... 

アルゴリズムは次のことを伝えることができる必要があります:

S1 can reach to E1, E2, E6 
S2 can reach to E9, E10 
S3 cannot reach any END_POINT 
S4 can reach to ..... 
.... 

END_POINTSの一部は、任意のSTART_POINTから到達されない場合があります。

ここで問題は、それを実装する最も効率的な方法は何ですか?

各START_POINTから順番に1つずつ試してみましたが、深さ優先検索(またはBFSでは実行時間を大幅に変更します)を使用して到達可能なEND_POINTSを検索しました。しかし、多くのSTART_POINTS(END_POINTSもたくさんあるため)には多くの時間がかかります。

START_POINTSのトレースされたパスの間に大きなオーバーラップがあるため、検索を最適化できます。どのパスがどのEND_POINTSに到達できるかを覚えておく必要があります。これを達成する最も効率的な方法は何ですか?これはよく知られている問題かもしれませんが、まだ解決策を見つけることができませんでした。 1月6日に

EDIT:

私は(キース・ランドールが提案されているものと同様の方法で)高帯域幅のアイデアを実装しようとした:各ノードで、このノードがある場合に開始または終了ポイントのすべてを接続しません出力を入力し、ノードを削除します。

foreach NODE in NODES 
    Skip if NODE is START_POINT or END_POINT 
    foreach OUTPUT_NODE of NODE 
     Disconnect NODE from INPUT_NODE 
    end 
    foreach INPUT_NODE of NODE 
     Disconnect NODE from INPUT_NODE 
     foreach OUTPUT_NODE of NODE 
      Connect INPUT_NODE to OUTPUT_NODE 
     end 
    end 
    Remove NODE from NODES 
end 

これは非常に高速起動し、すぐに非常に遅くなり、残りのノードの入力/出力数はループのために非常に大きく、ネストされた取得する主な理由は、パフォーマンスを殺します。どのようにしてより効率的にすることができますか?

答えて

1

開始ノードまたは終了ノードに表示されないすべてのノードを取り除き、受信ノードから送信ターゲットにエッジで置き換えるだけで、グラフをプルーニングしてください。それが完了したら、他のすべてのノード(開始ノードまたは終了ノード)を通過し、これらのノードを削除せずに、受信ノードから送信ノードにエッジを追加します。 Djikstraのような繰り返しの2つの場合、開始から終了までのエッジを残しておく必要があります。

+0

このメソッドを実装し、結果を取得します。 – Yilmaz

1

これは残忍かもしれませんが、Dijkstraをチェックしてみるとよいでしょう。仮想ノードの独自のルーティングテーブルを作成するときは、これを過去に使用しました。この場合、すべてのノードの値は1になります。つまり、各ノードの旅行には同じコストがかかります。

0

まず、strongly connected componentsアルゴリズムを実行します。次に、接続されているすべてのコンポーネントを1つのノードに縮小します。次に、グラフのtopological sortを実行します。次に、1回のパスで、どの開始ノードがグラフ内の各ノードに到達できるかを計算することができます(各開始ノードsを集合{s}に初期化し、各ノードで着信エッジをトポロジカル順序で結合します)。

答えが#開始ノード*#終了ノードほど大きくなる可能性があるという潜在的な問題があります。単一のノードに収縮する大きなSCCを用意しておけば、その答えがより簡潔になります(同じSCC内のすべての開始ノードが同じ場所に到達できるため、セット内に1人の代表者しか使用する必要はありません)。

関連する問題