グラフ検索:幅優先と深さ優先


78

グラフを検索する場合、幅優先深さ優先の 2つの簡単なアルゴリズムがあります(通常、すべての隣接グラフノードをキュー(幅優先)またはスタック(深さ優先)に追加することによって行われます)。

さて、他のものよりも優れているものはありますか?

私が考えることができるもの:

  • グラフ内のデータがかなり下にあると予想される場合、グラフのより深い部分に非常に高速で進むため、深さ優先の方が早く検索される場合があります。
  • 逆に、データがグラフのかなり上にあると予想される場合、幅優先の方が結果が早くなる可能性があります。

私が見逃したものはありますか、それは主に個人的な好みに帰着しますか?

回答:


43

問題をうまくカバーするhstoerrによるStack Overflowからの回答を引用したいと思います。

それは検索ツリーの構造とソリューションの数と場所に大きく依存します
ソリューションがツリーのルートからそれほど遠くないことがわかっている場合は、幅優先検索(BFS)の方が適している可能性があります。ツリーが非常に深く、解決策がまれな場合、深さ優先検索(DFS)は永久に回避される可能性がありますが、BFSはより高速になる可能性があります。ツリーの幅が非常に広い場合、BFSに必要なメモリが多すぎる可能性があるため、完全に非実用的です。ソリューションが頻繁であるがツリーの奥深くにある場合、BFSは実用的ではない可能性があります。検索ツリーが非常に深い場合は、とにかく深さ優先検索(DFS)の検索深さを制限する必要があります(たとえば、繰り返し深化する場合)。

しかし、これらは単なる経験則です。おそらく実験する必要があります。

ラファウ・ダウガードも次のように述べています。

一部のアルゴリズムは、DFS(またはBFS)の特定のプロパティに依存して機能します。たとえば、2連結コンポーネントを見つけるためのホップクロフトおよびタージャンアルゴリズムは、DFSが検出した各訪問済みノードがルートから現在探索されているノードへのパス上にあるという事実を利用します。


5
私はこの答えは27 upvotesを持っており、それが正確な方法でおよそ単に一般的な考えです2件の他の回答の合併である理由を理解することはできません...
nbro

37

マルチコアの世界で重要な1つのポイント:BFSははるかに簡単に並列化できます。これは直感的に合理的で(各子のスレッドを送信)、同様に証明できます。したがって、並列処理を利用できるシナリオがある場合、BFSが最適な方法です。


8
指定された設定でDFSが有利な場合は、十分なスレッドを生成してDFSを続行するまでBFSを適用できます。より具体的には、DFSを実行でき、下降して十分なスレッドがない場合はいつでも、次の兄弟のためにスレッドを生成します。
ラファエル

この答えは20の賛成に値しません。問題は、2つのアルゴリズムの一般的な使用に関するものであり、特定の使用に関するものではありません。
nbro

31

(これをコミュニティWikiにしました。お気軽に編集してください。)

もし

  • b
  • d
  • hdh

それから

  • ObhOh
  • ObdObd
  • ObdOd

選択する理由

  • DFS
    • とにかく木全体を見る必要があります
    • d
    • 答えがルートに最も近いかどうかは気にしません
  • BFS
    • 答えはルートに近い
    • あなたはルートに最も近い答えが欲しい
    • 複数のコア/プロセッサがあります
  • IDDFS
    • BFSが必要で、十分なメモリがありませんが、多少遅いことが許容されます

IDDFS = 反復深化深さ優先検索


1
これは素晴らしい答えです。質問はグラフについて尋ねているが、この答えは木に関するものであることに気づいた。ツリーはもちろんグラフであり、単語を置き換えることもできますがh、「ツリーの高さ」はどうでしょうか。それは「グラフの高さ」に直接変換されますか?
user2023370

IDDFSを使用するもう1つの理由は、使用方法に応じて、各反復後に可能な答えを得ることができることです(たとえば、最大値または最小値を検索する場合)。これは、答えが「十分」である場合はアルゴリズムを早期に終了できること、またはユーザー入力で終了できることを意味します(IDDFSを使用してチェスエンジンが最適なソリューションを見つけますが、プレイヤーが駒を動かすことによって中断されます)。
jedd.ahyoung

追加されるもう1つの点は、DFSはスタックを使用し、BFSはキューを使用することです。
カルティクBalaguru

17

正しいプログラムを取得するために他のシナリオを選択する必要があるシナリオ(既に説明した最短パスを見つけること以外)は、無限グラフになります。

たとえば、各ノードに有限数の子があるツリーを考えても、ツリーの高さが無限である場合、DFSは探しているノードを見つけられない可能性があります。見ているので、探しているのがその親の最初の子でなければ、そこに到達することはありません。ただし、BFSは有限時間でそれを見つけることが保証されています。

同様に、各ノードの子の数が無限であるツリーを考えても、ツリーの高さが有限である場合、BFSは終了しない可能性があります。ルートノードの子のみを訪問し、探しているノードが他のノードの子である場合、到達しません。この場合、DFSは有限時間でそれを見つけることが保証されています。


7
どちらも、無限グラフの半決定アルゴリズムのみを生成することは注目に値します。あなたは要素がある有限の時間内に決められないことができないツリー(明らかに)で。実際のアプリケーションについては、(概念的に)無限のデータ構造定義できることに注意してください(3.4項を参照)!
ラファエル

15

幅優先と深さ優先は、確かに同じ最悪の場合の振る舞いを持っています(目的のノードは最後に見つかったノードです)。グラフに関する情報がない場合、これは平均的なケースにも当てはまると思います。

幅優先検索の優れた利点の1つは、関心のある場合とそうでない場合がある最短パス(最も少ないエッジの意味で)を見つけることです。

平均ノードランク(近隣の数)がノードの数に比べて高い場合(つまり、グラフが密集している場合)、幅優先のキューは巨大になり、深さ優先のスタックは小さくなります。疎グラフでは、状況は逆になります。したがって、メモリが制限要因である場合、手元のグラフの形状は、検索戦略の選択を通知する必要がある場合があります。


bfsのキューの長さとdfsのスタックの高さは、実装に大きく依存します。dfsの場合、スタック上のネイバーフッド全体を常に展開すると、特にグラフが密集している場合に、大きくなります。dfsが再帰から戻ったときにどこに継続するかを示す参照のみをプッシュすると、多くのスペースを節約できます。
ウリ

3

上記のすべては正しいですが、BFSとDFSがツリーのトラバースに使用する順序に基づいて独自のツリーを作成することは注目に値します。これらのツリーにはそれぞれ独自のプロパティがあり、ある種の問題に役立つことがあります。

たとえば、BFSツリーにない元のグラフのすべてのエッジはクロスエッジです。BFSツリーの2つのブランチの間にあるエッジ。DFSツリーにない元のグラフのすべてのエッジはバックエッジです。DFSツリーのブランチ内の2つの頂点を接続するエッジ。このようなプロパティは、特殊な色付けなどの問題に役立ちます。


1

DFSとBFSツリーには、どちらも独自のプロパティがあり、グラフに関するより有用な情報を提供できます。たとえば、単一のDFSを使用すると、次のことができます。

  • ブリッジとアーティキュレーションポイントを見つける(無向グラフの場合)
  • サイクル検出
  • 強く接続されたコンポーネントを見つける(タージャンのアルゴリズム)

BFSを使用すると、ソースノードとグラフ内の他のノードとの間の最短パスを見つけることができます。

CLRSのグラフアルゴリズムの章では、DFSとBFSのこれらのプロパティを非常にうまくまとめています。


-2

いくつかのコード行を切り替えるだけで、いずれかのアルゴリズムが得られるように両方を書くのは面白いと思います。 。

私は個人的に、BFSが景観をflood濫させると解釈するのが好きです。低標高の地域が最初にflood濫し、その後に高標高の地域がflood濫します。地理学の本で見られるように、地形の標高を等値線と考えると、物理学と同じように、BFSが同じ等値線の下のすべての領域を同時に満たすことが容易にわかります。したがって、高度を距離またはスケーリングされたコストとして解釈すると、アルゴリズムの非常に直感的なアイデアが得られます。

これを念頭に置いて、幅優先探索の概念を簡単に適応させて、最小スパニングツリー、最短パス、および他の多くの最小化アルゴリズムを簡単に見つけることができます。

DFSの直観的な解釈はまだ見ていません(迷路に関する標準的なものだけですが、BFSのものと洪水ほど強力ではありません)ので、私にとっては、BFSは上記の物理現象とよりよく相関しているようですDFSは、合理的なシステム(つまり、チェスゲームで進むか迷路から出るかを決定する人またはコンピューター)の選択ディレマとの相関が高くなります。

したがって、私にとっての違いは、自然現象が実際の伝搬モデル(横断)と最もよく一致することにあります。


2
サイトへようこそ!しかし、これがどのように質問に答えているのかはわかりません。BFSとDFSについてのあなたの一般的な感情と直観のようですが、質問は感情と直観についてではなく、長所と短所について尋ねています。あなたの答えはそれをまったく解決していないようです。
デビッドリチャービー

質問に最も関連する部分は、アルゴリズムを適応させて、最小スパニングツリー、最短パスなどを見つけ、BFSによって一部の自然現象を再現できると言う一方で、DFSによる決定ツリー
-user5193682

1
問題は、BFSとDFSに関連するものを尋ねることではありません。スパニングツリーや最短パスを見つけることや、「自然現象を再現する方法」については問いません。
デビッドリチャービー

利点を求めている。一方が物理現象をモデル化でき、他方ができない場合、この現象をモデル化する必要がある場合に有利です。私は「アドバンテージ」という言葉を解釈するとき、アルゴリズム教科書の標準概念に固執していると思いますが、私はそうではありません
-user5193682
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.