web-dev-qa-db-ja.com

グラフのデータ構造:DFS vs BFS?

グラフの問題が与えられた場合、bfsまたはdfsアルゴリズムを使用する必要があるかどうかをどのように知ることができますか?または、いつdfsアルゴリズムまたはbfsアルゴリズムを使用しますか。他のものとの違いと利点は何ですか?

57
Jony

BFSは分岐要因に応じてより多くのメモリを使用します...ただし、BFSは完全なアルゴリズムです...つまり、可能な限り最も低い深さで何かを検索するために使用する場合、BFSは最適なソリューションを提供します。 BFS空間の複雑さはO(b^d)...深さまで引き上げられた分岐係数(多くのメモリが可能)です。

一方、DFSはスペースについてははるかに優れていますが、次善のソリューションが見つかる場合があります。つまり、ある頂点から別の頂点へのパスを検索する場合、実際の最短パスを見つける前に、次善の解決策を見つける(そしてそこで停止する)ことがあります。 DFSスペースの複雑さはO(|V|)...です。つまり、占有できる最大メモリは可能な限り長いパスです。

それらは同じ時間の複雑さを持っています。

実装に関しては、BFSは通常Queueで実装されますが、DFSはStackを使用します。

85
Polaris878

幅優先で最初に兄弟を検索します。 depth firstは明らかに子供を最初に検索します。ですから、あなたがどのような検索をしたいのかによって決まると思います。フィールド間の関係タイプ検索は、おそらくbfsに役立ちます。bfsでは、階層(ツリー、フォルダー、ランクなど)がdfsとしてより適しています。

6
dhoss

両方のグラフトラバーサルは、1つのことを約束します。グラフのすべての頂点を訪れる、グラフの完全なトラバーサルです。メモリの制約がない場合は、BFSが多くのスペースを占有するため、DFSが適しています。そのため、これら2つのどちらを選択するかは、要件によって異なります。

グラフの(強く/)接続されたコンポーネントを見つけたいですか?または迷路や数独を解決しますか? DFSを使用します。よく見ると、事前注文、事後注文、および注文はすべてDFSのバリエーションです。それで、はい、それはいくつかの興味深いアプリケーションです。

グラフが2部グラフかどうかをテストする場合は、BFSを使用して、このようなタスクを必要とする2つのノードまたはアプリケーション間の最短パスを見つけます。

4
madCode

Bfsキューではdfsスタックが使用され、グラフトラバーサルに従って頂点が格納されます。
2- bfsプロセスではレベルごとに(有向グラフまたは無向グラフに従って)行われますが、dfsではプロセスは深さまで行われます(最初にルートノードを訪問し、別のプロセスを行ってから適用します)最後のノードからルートノードへのバックトラッキング)。

2

BFSは最短パスに非常に適していますが、DFSはそうではありません。

0
Akash I