このグラフで最短経路を見つけるには、どのアルゴリズムを使用すればよいですか?


8

約10億個の頂点を持つグラフがあり、それぞれがランダムに約100個の他の頂点に接続されています。

2点間の最短経路の長さを求めたい。使用される実際のパスは気にしません。

ノート:

  • エッジが切断または追加されることがあります。これは、ルックアップの約500分の1の頻度で発生します。また、パフォーマンスを向上させることができるのであれば、エッジ変更をバッチ処理することもできます。
  • 私がすることができ、グラフを事前に処理します。
  • 6ステップ以上かかる場合は、無限に戻ることができます。
  • 0.01%の確率で間違っていても問題ありませんが、長すぎる長さを返す場合のみです。
  • すべてのエッジの長さは1です。
  • すべてのエッジは双方向です。

アルゴリズムを探しています。Psuedocode、英語の説明、実際のコードはすべて素晴らしいです。

A *を使用することもできますが、パスファインディング用に最適化されているようです。ダイクストラのアルゴリズムの
使用を考えましたが、すべての頂点の最短パス検出属性を無限大に設定する必要がある手順があります

(ユースケースについて疑問がある場合は、アンダーハンドCコンテスト用です。)


1
ダイクストラのアルゴ A *でh = 0で、「パスファインディング」に対して、より良い最小コストを見積もる方法がないということですか?
jk。

1
すべての頂点の最短パス検出属性を設定しても、「無限大」を10億回記述する必要はありません。値が設定されていないときに「無限大」を返す関数が必要です。
kevin cline 2013

回答:


6

基本的なアルゴリズム

開始ノードと終了ノードから到達できるノードの2つのセットを維持します。交互に、両側から3ステップ進みます。セットをノードに置き換えるたびに、もう1つのステップで到達できます。各ステップの後に、2つのセットの共通ノードを確認します。

最適化

単一のスイープで一般的なノードを検索できるように、セットをソートされたとおりに反復できることを確認してください:O(n + m)操作。リストはそれぞれ最大100万ノードになります。

セットを1ステップで拡張するには、元のセットのノードのすべての接続をクエリし、それらを新しいソートされたセットにマージします。2つの並べ替えられたリストのマージは、1回のスイープで再度実行できます。したがって、ソートされたノードの接続を照会できることを確認する必要もあります。(これは前処理される可能性があります)。

最後の2つのステップでは、新しい各セットは、これらのクエリ結果の最大10000をマージした結果です。このマージアダプティブ(同じサイズのチャンクをマージ)を行うのが最善です。このようにして、ソートされたセットのデータ構造は、単純なリンクリストになります。

このようにして、アルゴリズム全体がO(6 * n + 6 * n * log n)になります。ここで、nは最大です。1,000,000。


リンクされたリストのメンバーシップをO(n)未満でどのように確認しますか?それは大きな問題のようです。
Nick ODell 2013

秘訣は、両方のリストを同時に実行することです。これにより、1回のスイープでダブルをチェックできます。
Kris Van Bael 2013

ソートされたリストを使用すると、挿入が高価になりませんか?ツリーまたはハッシュの方が適しています。
kevin cline 2013

木は確かに良いかもしれません。ただし、どちらの方法でも、ノードのすべての接続を事前にソートしておくことにより、挿入が最適化されます。
Kris Van Bael 2013

むしろ...リンクされた単一のリストで十分です。回答の編集を参照してください。
Kris Van Bael 2013

2

ブレスファースト検索を使用するだけです(すべてのエッジの長さが均一であるため、ダイクストラのアルゴリズムは必要ありません)(そして、Kris Van Baelが言ったように、両側から実行します)。


0

"All edges have a length of 1"これは、ダイクストラのアルゴリズムを完全な貪欲なアルゴリズムの選択にする最良のシナリオです。高速行列乗算を含むフロイドワーシャルアルゴリズムを使用することもできます。


よくわかりません。あなたが与えたリンクから、Floyd-Warshallアルゴリズムはすべてのペアの最短経路問題を解決することを目的としているように見えます。シングルペア間の距離を見つけるのにも最適な方法ですか?
Nick ODell 2013

@NickODell Floyd-Warshallは、グラフ内の最短経路を見つけるための貪欲なアルゴリズムです。スタートノードから他のすべてのノードへの最短パスを見つけるための、非常に人気のあるダイクストラを含む1つにすぎません。2つの点だけでなく、指定されたノードから他のすべてのノードへの最短経路を見つけていることを思い出してください。
Mushy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.