DFSとBFSの基本
algorithmsearchundergraduatelecture
1導入
この講義では、深さ優先探索と幅優先探索を候補頂点の管理方法から定義し、訪問済み集合が必要な理由、到達可能性に関する正当性、計算量、BFSが無重み最短距離を求める理由を説明する。
線形探索と二分探索は配列から目標値を探索した。これに対し、この講義ではグラフの頂点を辺に沿って列挙する探索を扱う。
グラフの頂点・辺・隣接・道・距離を前提とする。未確認の場合は、先にグラフの基本を参照する。
data/lecture/information/graph/graph-basics.lecture.n.md
data/lecture/information/algorithm/data-structures/stack-and-queue-basics.lecture.n.md
2共通の探索枠組み
グラフ G=(V,E) と始点 s\in V を考える。探索では、発見済みだが隣接頂点の調査を終えていない頂点を候補として保持する。
- 訪問済み集合を S=\{s\} とし、候補へ s を追加する。
- 候補が空でない間、頂点 v を一つ取り出す。
- v の各隣接頂点 u\in N(v) について、u\notin S なら u を S と候補へ追加する。
頂点を候補へ追加すると同時に訪問済みにすることが重要である。取り出した時点まで記録を遅らせると、同じ頂点が複数の辺から重複して追加される。
3DFS
深さ優先探索(depth-first search; DFS)は候補をスタックで管理し、最後に追加した候補を優先する。再帰版では、ある頂点の未探索の隣接頂点を一つ選んで再帰呼出しを完了してから次を選ぶため、一つの道を延長してから戻る。
再帰による実装では、関数呼出しのスタックが候補スタックの役割を担う。再帰版でも、循環を含むグラフで停止するには訪問済み集合が必要である。
4BFS
幅優先探索(breadth-first search; BFS)は候補をキューで管理する。先に追加した頂点を先に取り出す。
BFSで頂点 u を初めて発見したとき、その親を v として
\ell[u]=\ell[v]+1
と記録する。初期値は \ell[s]=0 である。まず \ell を探索のレベルと呼び、最短距離との一致は次に証明する。
5BFS最短性の根拠
親を順にたどると、レベル \ell[u] の頂点 u には長さ \ell[u] の道が存在する。したがって真の最短距離を \delta(s,u) とすれば、\delta(s,u)\leq\ell[u] である。
レベル k の頂点から追加される頂点のレベルは k+1 であり、それまでにキューへ追加された頂点より前には置かれない。したがってFIFO順序により、キューからはレベルの非減少順に頂点が取り出される。
逆向きの不等式を、真の距離に関する帰納法で示す。\delta(s,u)=0 なら u=s であり \ell[u]=0 である。\delta(s,u)=r>0 とし、最短の道で u の直前にある頂点を w とする。\delta(s,w)=r-1 なので、帰納法の仮定により \ell[w]=r-1 である。w はレベル r の頂点より前に処理され、そのとき u が未発見なら \ell[u]=r として発見される。すでに発見済みなら、そのレベルは r 以下である。ゆえに \ell[u]\leq r=\delta(s,u) である。両方の不等式から \ell[u]=\delta(s,u) が成立する。
この主張は各辺の費用が等しい無重みグラフに限られる。辺ごとに異なる非負の重みがある場合は、Dijkstra法など別の方法が必要である。
6到達可能性と停止性
探索中に訪問済みとなる頂点は、既知の道を一辺だけ延長して発見されるため、必ず始点から到達可能である。逆に、長さ r の道で到達できる頂点が発見されることを r に関する帰納法で示す。r=0 は始点である。r>0 では、直前の頂点は帰納法の仮定により発見され、有限個の候補が順次処理されるため、やがて取り出されて次の頂点を発見する。したがって、DFSとBFSはいずれも到達可能な頂点をちょうど一度ずつ訪問する。
有限グラフでは各頂点を候補へ高々一度しか追加しないので、探索は必ず停止する。
7計算量
隣接リストを用いる場合、各頂点は一度処理され、無向グラフの各辺は両端から高々一度ずつ調べられる。したがってDFSとBFSの時間計算量は
O(|V|+|E|)
であり、訪問済み集合と候補に必要な追加領域は O(|V|) である。
8使い分け
- 到達可能性や連結成分の列挙には、DFSとBFSのどちらも使用できる。
- 無重み最短距離や最小手数にはBFSを使用する。
- 再帰的な構造の調査、帰りがけの処理、深い候補の優先にはDFSが適する。
- 重み付き最短距離にBFSをそのまま使用してはならない。
9まとめ
data/exercise/information/algorithm/search/graph-traversal-and-unweighted-distance.exercise.n.md
- DFSとBFSの本質的な差は、候補をスタックとキューのどちらで管理するかにある。
- 訪問済み記録は、循環による非停止と候補の重複を防ぐ。
- 両者は到達可能な頂点をちょうど一度ずつ訪問し、隣接リストでは O(|V|+|E|) 時間で動作する。
- BFSは層を距離順に処理するため、無重みグラフの最短距離を求める。