私は、DFSが解決策を見つけるのが難しいと読んだことがありますが、BFSはなぜですか?私は本当にこれがどういうものなのか分かりません。DFSではなくBFSのグラフに含まれていると、結果が確実に見つかるのはなぜですか?
答えて
DFSは、深さの最初の検索が無限の枝に詰まり、探している頂点に到達しないことがあるためです。 BFSは、どんな枝であっても、各反復のルートから同じ距離にあるすべての頂点を通過するので、最終的に必要な頂点を見つけることができます。
例:
ルート - > V1 - > V2 - > V3 - > ...に行く永遠
| - > U。
この例では、DFSがルートから始まり、次にv1に進む場合です。入力したブランチが無限であるため、決してuに到達しません。 BFSは、ルートからv1またはuのいずれかに、次にもう一方に移動します。
@yuribは正しいですが、さらに複雑です。
グラフに目的の頂点がない場合、サイクルが検出されない限り、BFSもDFSも終了しません。また、サイクルを検出するための手順を実行している場合は、BFSとDFSの両方が終了します。
(有限数の頂点を持つグラフ上の)DFSとBFSの両方の出力は終了し、パス(またはむしろツリーですが、OPはそのツリーの1つのパスに関心があるようです)。グラフにサイクルがあるかどうかは関係ありません。これは、両方のプロシージャがすでにどの頂点が訪問されたかを記録し、同じ頂点を2回以上訪問することを避けるためです。 DFS/BFSの正常な実装はこれを行います。そうしないと、非循環グラフのみに制約されます(CLRSの擬似コードを参照)。
@yuribが述べたように、グラフに無数のノードがある場合、dfsは永遠にかかる可能性があります。無限のノードが存在するので、どの頂点が既に訪問されているか(潜在的に無限のメモリをとる)を実際に追跡することはできず、もし我々が探している頂点を含まない一意の頂点を含む無限のパス。
しかし、それがDFSが常に最短パスを見つけるわけではありません。有限グラフであっても、DFSは最短パスを見つけることができません。
主な理由は、BFSは、距離x + 1のノードに移動する前に、ルートから距離xのすべてのノードを常に探索することです。したがって、あるノードが距離kにある場合、ルートからそのノードまでの最小距離がk-1、k-2、...、0ではないことが分かります。
DFSは、基本的に1つのパスに沿ってノードを探索し、別のパスを参照する前にそのパスに新しいノードがなくなるまで探索します。 DFSは、基本的に任意の順序で、ノードの各後継者を1つずつ探索します。つまり、ターゲットノードへのパスが最初に見つかったばかりなので、ターゲットノードまでのパスが長くなる可能性があります。上記画像における
、BFSは、第B及びEを探索し、次にEを介してDに到達する - root-> E-> DとDに私たちのパスを与えます。 DFSは最初にBから検索を開始することができるので、明らかに最短ではないルートroot-> B-> C-> Dを見つけることができます。
重要な決定は、Eの前にBを調べることだったことに注目してください。DFSはEをよく選択し、正解に到着した可能性があります。しかし、一般的にどの経路を先に下るかを知る方法はありません(最短経路を知ることがわかっていれば)。 DFSの場合、発見されるパスは、後続ノードを探索する順序に依存するだけであり、最短パスが得られるかどうかは問わない。
- 1. C#ユニットテスト:テスト結果に期待される結果が含まれているのはなぜですか?
- 2. Dijkstraアルゴリズムのグラフは、DFSまたはBFSに似ていますか?
- 3. すべての接続されていないグラフを見つけるために最適なBFSまたはDfsまたは非接合集合
- 4. 実行時に結果が返されないのはなぜですか?
- 5. Google Mapsではいくつかの結果が表示されますが、Places APIの結果で表示されないのはなぜですか?
- 6. RCNNが早く、convの結果がbbox_deltasになるのはなぜですか?
- 7. 計算結果が0になるのはなぜですか?
- 8. Git Fetch対Pull:別の結果、確かではないなぜ
- 9. BFSで実際に見つかったパスを見つけるにはどうすればよいですか?
- 10. UISearchDisplayController-検索結果ビューに空のセルが含まれているのはなぜですか?
- 11. ソーシャルネットワークフォローモデルのBFSまたはDFS
- 12. なぜ私のクエリは、これは完全に一致するか含まれている、結果を見つけていませんか?
- 13. なぜSymPyは本の逆行列結果を私に見せてくれなかったのですか?
- 14. シェルで実行すると、バッチスクリプトで実行される結果と異なる結果になるのはなぜですか?
- 15. TBitBtnに含まれているグリフが醜く古くなっているのはなぜですか?
- 16. ALSOの使用がR2とR3で異なる結果につながるのはなぜですか?
- 17. BFS対DFSグラフ空間の複雑度
- 18. なぜ左の結合で結果が列の下にいくつかの行が表示されます
- 19. パターンにカッコで囲まれたグループが含まれていると、exprの結果が異なるのはなぜですか?
- 20. なぜ結果が返ってくるのですか?
- 21. BFSとDFSを使用してグラフ内の2つのノード間のパスを見つける
- 22. mysqli_fetch_fields()はなぜ私に不正確な結果を与えていますか?
- 23. 同じ日に結果が含まれていない結果を見つける方法
- 24. 実行時ではなくコンパイル時にエラーを見つけるほうがよいのはなぜですか?
- 25. 2つの関数定義の結果がコンマで結ばれているのはなぜですか?
- 26. 2つのボックスをリンクすると対称的な結果が得られないのはなぜですか?
- 27. なぜZend Luceneは結果が見つからないのですが、Lukeは同じファジークエリに対して同じ結果を返します
- 28. 私のプロットに結果が表示されないのはなぜですか?
- 29. BFSとDFSの目的は何ですか?
- 30. DFSでグレー色を、CLRSでBFSを実装する目的は何ですか?
DFSを使用して「この迷路から最短の出口を見つける」ように1日を過ごした人からそれを取り出してください。それでもBFSを使用してください。多くのサイクルが可能な場合、DFSケースのブックキーピングは複雑になります。間違ったメモを防ぐために距離チェックを組み込む必要があるため、中間結果の簡単なメモの使用はできません。 BFSがソリューションにヒットすると、DFSがソリューションにヒットしたら、あなたのトラブルはちょうど始まっています:)。 – Bogatyr