Menu
Coddy logo textTech

線形探索

最終更新

線形探索(逐次探索とも呼ばれます)は最も単純な探索アルゴリズムです。最初の要素から始めて、一致が見つかるか要素がなくなるまで、各要素を目的の値と比較していきます。データについて何の前提も置きません — 配列は未ソートでもよく、要素は等しいかどうかを比較できるものなら何でも構いません。

上のアニメーションは、走査が左から右へ進むにつれて各比較をハイライトし、目的の値が現れた瞬間に停止します。その単純さの代償は速度です。最悪の場合はすべての要素が確認されるため、実行時間は O(n) になります。データがソート済みなら、二分探索が同じ答えを O(log n) で見つけます — 先にソート済みのデータが必要ならマージソートを参照してください。

時間計算量と空間計算量

ケース計算量備考
最良ケースO(1)最初の要素が目的の値である場合。
平均ケースO(n)平均すると、ヒットするまでに要素の半分が確認される。
最悪ケースO(n)目的の値が最後にある — またはまったく存在しない。
空間O(1)現在のインデックスだけを保持する。

ステップごとの説明

ステップ何が起こるか
1配列の最初の要素であるインデックス0から始める。
2現在の要素を目的の値と比較する。
3等しければ現在のインデックスを返す — 発見。
4そうでなければ1つ右へ進み、繰り返す。
5一致がないまま配列の末尾に達したら、目的の値は存在しない(-1 を返す)。

具体例

[7, 3, 9, 1, 5, 8, 2] から 5 を探索する場合:

比較インデックス要素結果
1077 ≠ 5 — 走査を続ける。
2133 ≠ 5 — 走査を続ける。
3299 ≠ 5 — 走査を続ける。
4311 ≠ 5 — 走査を続ける。
5455 = 5 — インデックス4で発見。

線形探索を使うべき場面

使うべきとき避けるべきとき
データが未ソート、または絶えず変化しているときデータがソート済みのとき — 二分探索の方が指数関数的に速い
コレクションが小さく、単純さが勝るときデータセットが大きく、繰り返し探索されるとき
順次アクセスしかできないとき(ストリーム、連結リスト)O(1) の検索のためにインデックスやハッシュテーブルを用意できるとき

Linear Searchのコード

Python, JavaScript, Java, C++, C, Pseudocodeによるクリーンで実行可能なLinear Searchの実装です。言語を選んでコードをコピーするか、Coddyプレイグラウンドに読み込んだ状態で開けます。

PythonでのLinear Searchのコード

Python
1def linear_search(a, target):2    # Scan left to right until the target appears3    for i in range(len(a)):4        if a[i] == target:5            return i6    return -17
8
9nums = [7, 3, 9, 1, 5, 8, 2]10print("Index of 5:", linear_search(nums, 5))11print("Index of 4:", linear_search(nums, 4))
このコードをPythonプレイグラウンドで実行

線形探索のよくある質問

線形探索の時間計算量はどのくらいですか?
平均ケースと最悪ケースで O(n) です。走査がすべての要素を訪れる必要があるかもしれないためです。最初の要素が目的の値だった場合の最良ケースは O(1) です。追加空間は O(1) です。
線形探索にはソート済みのデータが必要ですか?
いいえ — それこそが最大の利点です。線形探索は各要素を等しいかどうかで確認するため、完全に未ソートのデータでも動作します。順序は一切関係ありません。対照的に、二分探索はソート済みの配列でしか動作しません。
線形探索が二分探索より優れているのはどんなときですか?
データが未ソートで1回しか探索しないとき(先にソートすると O(n log n) かかります)、コレクションがごく小さいとき、あるいはストリームや連結リストのように順次アクセスしかできないときです。ソート済み配列での繰り返しの検索なら二分探索が勝ちます。
線形探索と逐次探索は同じものですか?
はい — 2つの名前は同じアルゴリズムを指します。目的の値が見つかるか、コレクションが終わるまで、要素を順番に走査します。
線形探索は平均で何回比較しますか?
目的の値が存在し、どの位置にも同じ確率であるなら、平均で約 n/2 回の比較になります。存在しない場合はちょうど n 回です。この線形の増加こそが「線形探索」と呼ばれる理由です。
Coddy programming languages illustration

Coddy でアルゴリズムをマスターしよう

始める