探索アルゴリズム(BFS・DFS・2分)とは?探索はデータの中から目的のものを見つける処理

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

探索アルゴリズムとは(全体像)

探索は、たくさんのデータから「目的のもの」を見つけ出す処理。見つけ方(アルゴリズム)にはいくつもあり、速さや前提条件が違う。

大きく2つの場面に分けて押さえる。

配列では、先頭から順に見る線形探索(O(n))が一番単純。これを大幅に速くしたのが2分探索(O(log n))だが、使うには条件がある——というのが第一のポイントだ。


詳しく:2分探索の前提とBFS・DFSだけ覚えれば戦える

ここが記事の心臓部。まずは配列の探索

配列の探索

探索速さ前提
線形探索O(n)(遅い)なし(並んでいなくてOK)
2分探索O(log n)(速い)並べ替え済み(ソート済み)が必須

2分探索は、まん中の要素と比べて「探すものは右半分か左半分か」を判断し、毎回範囲を半分に絞る。とても速い(O(log n))が、並べ替え済みでないと使えない——ここが最頻出のひっかけだ。

次に、グラフの探索BFSとDFS

BFSとDFSの違い

BFS(幅優先)DFS(深さ優先)
進み方近い順に広げる奥まで進んで戻る
使う構造キュースタック(や再帰)
最短経路保証する保証しない

BFS(幅優先探索)は、出発点に近いところから順に広げていく。だから「最も少ないステップでたどり着く道(最短経路)」を保証する(キューを使う)。DFS(深さ優先探索)は、行けるところまで奥へ進んでから戻る(スタックや再帰を使う)。

ここが頻出ポイントで、最短経路を保証するのはBFS。DFSは奥へ進むため、必ずしも最短にならない。「最短ならBFS」と覚える。つまり、目的が最短経路かどうかでBFSとDFSを選び分ける、というわけだね。

なお、ハッシュ表を使えば平均O(1)でほぼ一発で探せる(ハッシュ探索)。

わかりやすく言い換えると

要するに、探索は「見つけ方の選び方」だ。

2分探索 … 辞書引き。まん中を開いて「もっと前か後か」を判断し、半分に絞る。ただし五十音順に並んでいるから使える(バラバラの紙束では無理)。

BFS(幅優先) … 池に石を落として広がる波紋のように、近い順に探す。だから最短の道が見つかる。

DFS(深さ優先) … 迷路で「まっすぐ進めるところまで進んで、行き止まりで戻る」やり方。

「最短経路がほしいならBFS、奥まで一気に調べたいならDFS」と、目的で選ぶ、というわけだね。


試験のツボ

🔴 一番出る:2分探索の前提

①2分探索は範囲を半分ずつ絞ってO(log n)と速い

②ただし並べ替え済み(ソート済み)でないと使えない

🔴 次に出る:BFSとDFSの違い

①BFS=幅優先・キュー・最短経路を保証

②DFS=深さ優先・スタック(や再帰)・奥まで進む

🟡 押さえると安定:探索の速さ

①線形探索=O(n)(前提なし)

②ハッシュ探索=平均O(1)(ハッシュ表を使う)


よくある間違い

「2分探索は並べ替えていないデータでも使える」→ ✗  2分探索は並べ替え済み(ソート済み)が前提。並んでいないなら使えない。

「最短経路を保証するのは深さ優先探索(DFS)である」→ ✗  最短経路を保証するのはBFS(幅優先)。DFSは奥へ進むので保証しない。

「BFSはスタック、DFSはキューを使う」→ ✗  逆。BFSはキュー、DFSはスタック(や再帰)を使う。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(2分探索の前提)

📝 オリジナル問題 1 2分探索の前提

2分探索に関する次の記述のうち、正しいものはどれか。

  1. 2分探索は並べ替えていないデータでも、範囲を半分ずつ絞って速く探せる
  2. 2分探索は並べ替え済みのデータで、半分ずつ絞ってO(log n)で探す
  3. 2分探索は先頭から1つずつ順に確認する、O(n)で遅い探索のことである
  4. 2分探索はデータの個数によらず、つねにO(1)で一発で探せるものである
オーエスペン
オーエスペン 解答・解説

解答は 2 だよ。

2分探索は並べ替え済みのデータで使え、まん中と比べて範囲を半分ずつ絞ってO(log n)で探すんだ。辞書引きのイメージだね。

選択肢1は「並べ替えていなくても使える」が誤り(ソート済みが前提)。選択肢3は線形探索の説明。選択肢4は「O(1)」が誤りだよ。

選択肢判定理由
1並べ替え済みが前提
2ソート済み・半分ずつ絞ってO(log n)
3それは線形探索
4O(log n)であってO(1)ではない

オリジナル問題2(最短経路)

📝 オリジナル問題 2 最短経路の保証

グラフ探索で最短経路(最も少ないステップの道)を保証する探索として、正しいものはどれか。

  1. 深さ優先探索(DFS)は近い順に広げるため、最短経路を必ず保証している
  2. 線形探索が最短経路を保証し、BFSやDFSは経路の長さとは無関係である
  3. DFSもBFSも最短経路を保証しないので、最短はどちらでも求められない
  4. 幅優先探索(BFS)は出発点から近い順に広げるため、最短経路を保証する
オーエスペン
オーエスペン 解答・解説

解答は 4 だよ。

幅優先探索(BFS)は出発点に近い順に広げるから、最短経路を保証するんだ。池の波紋のように、近いところから探していくイメージだね。

選択肢1はDFSを「最短保証」とする誤り(保証するのはBFS)。選択肢2は線形探索を最短とする誤り。選択肢3は「どちらも保証しない」が誤りだよ。

選択肢判定理由
1最短を保証するのはBFS
2最短保証はBFS
3BFSは最短を保証する
4BFSは近い順に広げ最短を保証

オリジナル問題3(BFSとDFSの構造)

📝 オリジナル問題 3 BFSとDFSが使う構造

BFSとDFSが使うデータ構造に関する次の記述のうち、正しいものはどれか。

  1. BFSもDFSもスタックを使うので、進み方にとくに違いはないものである
  2. BFSはスタックを使って近い順に、DFSはキューを使って奥へ進むものだ
  3. BFSはキューを使って近い順に広げ、DFSはスタックを使って奥へ進む
  4. BFSもDFSもデータ構造を使わず、ランダムに探索を進めるものである
オーエスペン
オーエスペン 解答・解説

解答は 3 だよ。

BFSはキューを使って近い順に広げ、DFSはスタック(や再帰)を使って奥へ進むんだ。「近い順のBFSはキュー、奥へ進むDFSはスタック」とセットで覚えてね。

選択肢1は「ともにスタック」が誤り。選択肢2はBFSとDFSの構造が逆。選択肢4は「使わない」が誤りだよ。

選択肢判定理由
1BFSはキューを使う
2BFSとDFSの構造が逆
3BFS=キュー・DFS=スタック
4それぞれデータ構造を使う

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る