web-dev-qa-db-ja.com

Breadth First Search(BFS)が同じことをより速くできるのに、なぜダイクストラのアルゴリズムを使用するのですか?

両方を使用して、単一ソースからの最短パスを見つけることができます。 BFSはO(E+V)で実行され、ダイクストラはO((V+E)*log(V))で実行されます。

また、Dijkstraがルーティングプロトコルでよく使用されるのを見てきました。

したがって、BFSが同じことをより速くできるのであれば、なぜダイクストラのアルゴリズムを使用するのでしょうか?

97
gingercat

ダイクストラでは、各ステップに1以外の距離を割り当てることができます。たとえば、距離(または重み)のルーティングでは、速度、コスト、優先度などによって割り当てることができます。その後、アルゴリズムは、ソースからトラバースグラフのすべてのノードまでの最短パスを提供します。

一方、BFSは基本的に、すべての反復で検索を1ステップ(リンク、Edge、アプリケーションで呼び出すもの)だけ拡張します。これは、最小のステップ数を見つける効果があります=ソース(「ルート」)から特定のノードに到達するのに時間がかかります。

137
Arkku

旅行ウェブサイトを検討する場合、これらはノードの重み(距離)のためにダイクストラのアルゴリズムを使用します。

すべてのノード間で同じ距離を考慮する場合、BFSの方が適しています。

たとえば、A -> (B, C) -> (F)が_A->B_ = 10、_A->C_ = 20、_B->F_ = _C->F_ = 5。

ここで、BFSを適用すると、答えはABFまたはACFになります。両方とも(エッジの数に関して)最短パスですが、Dijstraを適用すると、答えはABFになります。パス。

20
Happy Singh

ダイクストラのアルゴリズム

  • 重み付きグラフのBFSと同様。
  • すべてのコストが等しい場合、ダイクストラ= BFS

ソース: https://cs.stanford.edu/people/abisee/gs.pdf

3
dekdev

実装の観点からは、queuepriority queueと交換することにより、ダイクストラのアルゴリズムをBFSとまったく同じように実装できます。

ソース: リンクの説明をここに入力

0
havij