6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

検索アルゴリズムを極めよう!〜迷子のペンギンを探せ!🐧〜

Posted at

「検索アルゴリズム」とは、データの中から特定の情報を探すための方法 です。
たとえば、大量の名簿の中から 「田中さん」を探す5000冊の本から「AIの本」を見つける など、現実でもプログラムでも欠かせない技術です。

でも、検索って「ただ探せばいいんでしょ?」と思うかもしれません。
実は 検索方法によって、速さや効率が全然違う のです!

ここでは、迷子のペンギンを探す話をしながら、検索アルゴリズムを 楽しく、わかりやすく 解説していきます!🐧✨

迷子のペンギンを探せ!

あなたは南極でペンギンの群れを管理している研究者です。
ある日、一羽のペンギン「ポッキー」が迷子になりました!😱
仲間のペンギンたち(1000羽)がいる中から ポッキーを見つける方法 を考えましょう!

DALL·E 2025-02-09 23.53.29 - A detailed illustration of a large colony of 1,000 penguins in Antarctica, with icy landscapes and a frozen ocean in the background. Among them, one uのコピー.png

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で発見!)

特徴

  • めちゃくちゃ速い!(半分ずつ減らせるので最大 log(n) 回のチェックで済む)
  • データが多くても効率的に探せる

ソートされていないと使えない(事前に並べる必要あり)

🐧 現実世界での例

  • 辞書や電話帳で、名前順に並んでいるデータから探す
  • 本屋で「あいうえお順」に並んでいる本を探す

3. ハッシュ検索(爆速検索!)

どうやるの?

データを 「鍵」→「値」 のペアにしておけば、一瞬で探せます!
例えば、「ポッキー」の 専用の棚番号 を持っていれば、
もう1つずつペンギンを調べなくても、ダイレクトに場所がわかる!

penguin_dict = {
    "タロウ": 1,
    "ジロー": 2,
    "ポッキー": 3,
    "サブロー": 4
}

print(penguin_dict["ポッキー"])  # → 3(インデックス3で発見!)

特徴

  • 最速!O(1) の計算量で検索できる
  • データが並んでいなくてもOK

メモリを多く使う(データが増えるとハッシュ管理が大変)

🐧 現実世界での例

  • 図書館の本を「バーコード」で管理する
  • スーパーマーケットの商品コードを使ってレジでスキャン

🎯 どの検索方法を使うべき?

条件 おすすめの検索方法
データが少ない(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回

🏆 まとめ:迷子のペンギンを速く見つけるには?

  1. データが少ないなら → 片っ端から調べる(線形探索)
  2. データが並んでいるなら → 真ん中から探す(二分探索)
  3. データを事前に管理できるなら → 一発検索(ハッシュ検索)

検索アルゴリズムを使いこなせば、迷子のペンギンも、探している情報も 最速で見つけられる ようになります!🐧✨

さあ、あなたも 最適な検索方法を選んで、爆速検索マスター になりましょう!🚀

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?