何百万もの頂点とエッジを持つ有向グラフがあります。頂点のセットが与えられています。それらが「START_POINTS」と呼ばれていると仮定しましょう。「END_POINTS」と呼ばれる別の頂点のセットも示されています。問題は、どの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つずつ開始し、深さ優先探索を使用して到達可能なEND_POINTSを見つけてみました(またはBFS、実行時間を大幅に変更します)。ただし、START_POINTSが非常に多い(END_POINTSも多い)ため、時間がかかります。
START_POINTSのトレースされたパス間には大きな重複があるため、検索を最適化できます。どのパスがどのEND_POINTSに到達できるかを覚えておく必要があります。これを達成するための最も効率的な方法は何ですか?これはよく知られている問題かもしれませんが、私はまだ解決策を見つけることができませんでした。
1月6日に編集:
highBandWidthのアイデアを実装しようとしました(Keith Randallが提案した方法と同様の方法で):各ノードについて、このノードがSTARTポイントまたはENDポイントでない場合は、すべての入力を出力に接続してから、ノードを削除します。
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
これは非常に速く始まり、すぐに非常に遅くなります。これは主に、残りのノードの入出力カウントが非常に大きくなり、forループがネストされてパフォーマンスが低下するためです。それをより効率的にする方法はありますか?