「検索アルゴリズム」とは、データの中から特定の情報を探すための方法 です。
たとえば、大量の名簿の中から 「田中さん」を探す や 5000冊の本から「AIの本」を見つける など、現実でもプログラムでも欠かせない技術です。
でも、検索って「ただ探せばいいんでしょ?」と思うかもしれません。
実は 検索方法によって、速さや効率が全然違う のです!
ここでは、迷子のペンギンを探す話をしながら、検索アルゴリズムを 楽しく、わかりやすく 解説していきます!🐧✨
迷子のペンギンを探せ!
あなたは南極でペンギンの群れを管理している研究者です。
ある日、一羽のペンギン「ポッキー」が迷子になりました!😱
仲間のペンギンたち(1000羽)がいる中から ポッキーを見つける方法 を考えましょう!
1. 線形探索(リニアサーチ)〜片っ端から探せ!〜
どうやるの?
ペンギンの群れを 1羽ずつ確認 して、ポッキーを見つける方法です。
つまり、リストの 最初から順番に1つずつ見ていく というシンプルなやり方。
def linear_search(penguins, target):
for index, penguin in enumerate(penguins):
if penguin == target:
return index # 見つかった位置を返す
return -1 # 見つからなかった場合
penguins = ["タロウ", "ジロー", "ポッキー", "サブロー"]
print(linear_search(penguins, "ポッキー")) # → 2(インデックス2で発見!)
データが多いと遅い(最大でn回のチェックが必要)
🐧 現実世界での例
- 名前順になっていないクラスの出席簿から、特定の生徒を探す
- スーパーの棚で、好きなジュースを1つずつ確認する
2. 二分探索(バイナリサーチ)〜並んでるなら真ん中から!〜
どうやるの?
ポッキーがいるペンギンのリストが 名前順で並んでいる としたら、もっと速く探せます。
真ん中のペンギンを見る → 目的のペンギンが左か右か判断 → 残り半分だけ調べる!
def binary_search(penguins, target):
left, right = 0, len(penguins) - 1
while left <= right:
mid = (left + right) // 2 # 中央のインデックス
if penguins[mid] == target:
return mid
elif penguins[mid] < target:
left = mid + 1 # 右側を探す
else:
right = mid - 1 # 左側を探す
return -1 # 見つからなかった場合
# 名前順に並んだペンギンリスト
sorted_penguins = ["アキラ", "サブロー", "タロウ", "ポッキー", "マサル"]
print(binary_search(sorted_penguins, "ポッキー")) # → 3(インデックス3で発見!)
ソートされていないと使えない(事前に並べる必要あり)
🐧 現実世界での例
- 辞書や電話帳で、名前順に並んでいるデータから探す
- 本屋で「あいうえお順」に並んでいる本を探す
3. ハッシュ検索(爆速検索!)
どうやるの?
データを 「鍵」→「値」 のペアにしておけば、一瞬で探せます!
例えば、「ポッキー」の 専用の棚番号 を持っていれば、
もう1つずつペンギンを調べなくても、ダイレクトに場所がわかる!
penguin_dict = {
"タロウ": 1,
"ジロー": 2,
"ポッキー": 3,
"サブロー": 4
}
print(penguin_dict["ポッキー"]) # → 3(インデックス3で発見!)
メモリを多く使う(データが増えるとハッシュ管理が大変)
🐧 現実世界での例
- 図書館の本を「バーコード」で管理する
- スーパーマーケットの商品コードを使ってレジでスキャン
🎯 どの検索方法を使うべき?
条件 | おすすめの検索方法 |
---|---|
データが少ない(100件以下) | 線形探索(リニアサーチ) |
データが大量にある(1000件以上) | 二分探索(バイナリサーチ) |
データがソートされていない | 線形探索 |
データがソートされている | 二分探索 |
キーと値がはっきり分かれている | ハッシュ検索 |
検索アルゴリズムごとのチェック回数(計算量)
検索アルゴリズムごとに、データ数 n に対して 最大何回チェックが必要か を比較した表です。
検索アルゴリズム | 計算量(Big-O) | データ数 n = 10 | データ数 n = 100 | データ数 n = 1,000 | データ数 n = 1,000,000 |
---|---|---|---|---|---|
線形探索(リニアサーチ) | O(n)(最悪 n回) | 最大 10回 | 最大 100回 | 最大 1,000回 | 最大 1,000,000回 |
二分探索(バイナリサーチ) | O(log n)(最悪 log₂(n)回) | 4回 | 7回 | 10回 | 20回 |
ハッシュ検索(辞書型検索) | O(1)(1回で見つかる) | 1回 | 1回 | 1回 | 1回 |
どの検索方法が何回チェックするのか?
1. 線形探索(リニアサーチ)
- 最悪、全データを1つずつチェック する必要がある(最大 n回)。
- n = 1,000,000 の場合、100万回チェック することもあり、遅い。
2. 二分探索(バイナリサーチ)
- データを半分ずつ減らして検索 するので、log₂(n)回 で見つかる。
- n = 1,000,000 でも 20回以内 で検索完了!✨
3. ハッシュ検索(辞書型検索)
- 常に1回で検索完了(O(1))(例外的に衝突が発生すると遅くなることもある)。
- データ数がどれだけ増えても1回で探せる ので爆速。🚀
🎯 検索回数のイメージ
データ数(n) | 線形探索(最悪) | 二分探索(最悪) | ハッシュ検索 |
---|---|---|---|
10 | 10回 | 4回 | 1回 |
100 | 100回 | 7回 | 1回 |
1,000 | 1,000回 | 10回 | 1回 |
10,000 | 10,000回 | 14回 | 1回 |
1,000,000 | 1,000,000回 | 20回 | 1回 |
🏆 まとめ:迷子のペンギンを速く見つけるには?
- データが少ないなら → 片っ端から調べる(線形探索)
- データが並んでいるなら → 真ん中から探す(二分探索)
- データを事前に管理できるなら → 一発検索(ハッシュ検索)
検索アルゴリズムを使いこなせば、迷子のペンギンも、探している情報も 最速で見つけられる ようになります!🐧✨
さあ、あなたも 最適な検索方法を選んで、爆速検索マスター になりましょう!🚀