【はばゆうせんたんさく】

幅優先探索(BFS) とは?

最終更新:
💡 近くから順に、じわじわ広がる探索の波

グラフや木を探索するアルゴリズム。出発点から通る辺の数が少ない順に、到達できるノードを調べる。辺に重みがない場合、最少の辺で届く経路を求められる。

📌 このページのポイント
辺の数が少ない順に探索 A B C D E F G 0本 1本 2本 キュー:左から取り出す Aの後 B C Bの後 C D E Cの後 D E F G 追加するときに探索済みを記録する 例の探索順:A → B → C → D → E → F → G
重みなしグラフの例。近さは通る辺の数で考え、同じ距離の点の順番は隣接点を調べる順に依存する。
ひよこ ひよこ
幅優先探索ってどういう探し方なの?
ペンギン先生 ペンギン先生
出発点から辺を1本で届く点、2本で届く点という順に調べるよ。波のように広がるイメージだけれど、画面上の距離ではなく、通る辺の数で近さを考える。出発点からつながっていない点には届かないんだ。
ひよこ ひよこ
具体的にはどう動くの?
ペンギン先生 ペンギン先生
出発点を探索済みにしてキューへ入れる。先頭から点を取り出し、その隣の点で未探索のものを探索済みにして末尾へ追加する。キューが空になるまで繰り返すよ。追加時の記録があれば、同じ点を何度も入れたり、循環で終わらなくなったりするのを防げるんだ。
ひよこ ひよこ
どんな場面で使うの?
ペンギン先生 ペンギン先生
1回の移動の費用が同じ迷路で、最少の移動回数を調べる例があるよ。SNSで何本の友達リンクをたどれば届くかを調べることもできる。道路ごとの所要時間のように重みが違う場合は、BFSの辺の数が最少でも時間が最短とは限らないね。
ひよこ ひよこ
深さ優先探索と使い分けるポイントは?
ペンギン先生 ペンギン先生
DFSは1本の道を深くたどり、BFSは同じ距離の点を先に調べるよ。どちらも到達できる点を調べられるけれど、重みなしの最短経路を求めるならBFSが使える。同じ距離の点が多いとキューが大きくなる。探索済みの管理はDFSでも必要になるね。
ひよこ ひよこ
計算量はどのくらいなの?
ペンギン先生 ペンギン先生
隣接リストでグラフを表し、キューの追加・取り出しを一定時間で行う実装なら、ノード数Vと辺の数Eに対してO(V+E)だよ。無向グラフでは1本の辺を両端から確認することがあるけれど、この計算量は変わらない。探索済みやキューなどに使う追加の空間はO(V)だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「幅優先探索」って出てきたら「つながる点を、通る辺が少ない順に探す方法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Breadth-First Search」 = 幅優先探索
💬 「breadth(幅)」を「first(最初に)」探索するという名前で、横に広がりながら調べていくイメージだよ

参考資料

← 用語集にもどる