私は、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. Google Mapsではいくつかの結果が表示されますが、Places APIの結果で表示されないのはなぜですか?
- 3. BFSで実際に見つかったパスを見つけるにはどうすればよいですか?
- 4. Git Fetch対Pull:別の結果、確かではないなぜ
- 5. UISearchDisplayController-検索結果ビューに空のセルが含まれているのはなぜですか?
- 6. ALSOの使用がR2とR3で異なる結果につながるのはなぜですか?
- 7. TBitBtnに含まれているグリフが醜く古くなっているのはなぜですか?
- 8. パターンにカッコで囲まれたグループが含まれていると、exprの結果が異なるのはなぜですか?
- 9. mysqli_fetch_fields()はなぜ私に不正確な結果を与えていますか?
- 10. なぜZend Luceneは結果が見つからないのですが、Lukeは同じファジークエリに対して同じ結果を返します
- 11. 2つの関数定義の結果がコンマで結ばれているのはなぜですか?
- 12. 実行時ではなくコンパイル時にエラーを見つけるほうがよいのはなぜですか?
- 13. BFSとDFSの目的は何ですか?
- 14. 正確なフレーズはn-gramと一致しますが、結果は見つかりませんでしたか?
- 15. なぜ私はこれについて異なる結果を得ているのですか?実際は同じ数字ですか?
- 16. なぜソートされた配列ではなく、結果がTRUEになるのですか?
- 17. qsortの結果が正しくないのはなぜですか?
- 18. 私の減算結果が正しくないのはなぜですか?
- 19. グラフに目立つ線と細い線があるのはなぜですか?
- 20. なぜ私はTigでそれらを見ると、いくつかのgitコミットに "refs"がありますか?
- 21. ListViewがスクロールしているときにカスタムSimpleCursorAdapterが異なる結果を返すのはなぜですか?
- 22. Slick - データベースに結果が含まれない場合はどうですか?
- 23. gitエイリアスとしてコマンドを実行すると、結果が異なるのはなぜですか?
- 24. なぜ、NULLがnilと異なる結果になるのですか?
- 25. このMySQLクエリで結果が返されないのはなぜですか?
- 26. セットアッププロジェクトにvcomp100.dllが含まれていないのはなぜですか?
- 27. Maven JARプラグインにリソースが含まれていないのはなぜですか?
- 28. クラスCanvasPaneがJava APIに含まれていないのはなぜですか?
- 29. バリアブルが含まれていると、クラス内でグローバルが空になるのはなぜですか?
- 30. int/floatの乗算が異なる結果につながるのはなぜですか?
DFSを使用して「この迷路から最短の出口を見つける」ように1日を過ごした人からそれを取り出してください。それでもBFSを使用してください。多くのサイクルが可能な場合、DFSケースのブックキーピングは複雑になります。間違ったメモを防ぐために距離チェックを組み込む必要があるため、中間結果の簡単なメモの使用はできません。 BFSがソリューションにヒットすると、DFSがソリューションにヒットしたら、あなたのトラブルはちょうど始まっています:)。 – Bogatyr