【でぃーえふえす】

DFS(深さ優先探索) とは?

最終更新:
💡 行けるところまで突き進んで、行き止まりになったら引き返す探索法

グラフや木を探索する方法の一つ。未訪問の隣接する頂点へできるだけ深く進み、進めなくなったら戻って別の枝を調べる。

📌 このページのポイント
深く進み、戻って次の枝へ A B C D E F 深く進む 戻って 次の枝へ 初めて訪問する順序(左の子から) A → B → C → D → E → F Cの後はBへ戻ってからDを調べる
左の子から探索する例。下の順序は初めて訪問する順番で、存在しない辺を移動する意味ではない。
ひよこ ひよこ
DFSってBFSと何が違うの?
ペンギン先生 ペンギン先生
BFSが始点から浅いところを順に調べるのに対して、DFSは未訪問の隣接頂点へできるだけ深く進むよ。先へ進めなくなったら戻り、まだ調べていない枝へ進むんだ。
ひよこ ひよこ
迷路で進んで、ダメなら引き返す感じ?
ペンギン先生 ペンギン先生
そうだね。再帰呼び出しや、後入れ先出しのスタックで実装できる。グラフに同じ頂点へ戻る経路があるときは、訪問済みかどうかも記録して、同じ場所を際限なく調べないようにするんだ。
ひよこ ひよこ
どんな用途があるの?
ペンギン先生 ペンギン先生
グラフのサイクル検出や、閉路のない有向グラフを依存関係に沿って並べるトポロジカルソートなどに使えるよ。通常のDFSは頂点を訪問する方法で、それだけで全経路を列挙するわけではない。経路の列挙には、経路ごとの状態管理などを組み合わせるんだ。
ひよこ ひよこ
BFSよりメモリが少なくて済む?
ペンギン先生 ペンギン先生
いつでもそうとは限らないよ。広い木ではDFSの探索用スタックがBFSの待ち行列より小さくなる場合があるけれど、深い探索ではスタックが大きくなる。グラフでは頂点数に応じた訪問済み情報も必要なので、経路の深さだけで全体のメモリは決まらないんだ。
ひよこ ひよこ
DFSに弱点はあるの?
ペンギン先生 ペンギン先生
最初に見つけた経路が最短とは限らないよ。探索が非常に深いと、再帰呼び出しの上限なども問題になる。深さに上限を設けたり明示的なスタックを使ったりする方法はあるけれど、目的に合う探索方法と終了条件を決める必要があるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「DFS」って出てきたら「深く進んでから戻り、別の枝を調べる探索法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Depth-First Search」 = 深さ優先探索
💬 Depth(深さ)を優先して探索するからこの名前なんだよ

参考資料

← 用語集にもどる