1. exists at index 4
  2. exists at first index
  3. exists at last index
  4. not found
  5. duplicates return first occurrence
  6. single element match
コース一覧
コンピューターサイエンス入門:理論編
線形探索 (O(n))

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

線形探索 (O(n))

並んでいる順に、当たるまで聞くしかない

名簿がバラバラの順で並んでいるとき、「田中さんは何番目にいますか」に答える方法は 1 つしかありません。先頭から 1 人ずつ名前を見ていくことです。並び順に規則が無い以上、どこを飛ばしても見落としの可能性が残ります。

この素朴な探し方が 線形探索 です。配列を先頭から順に見て、目的の値と一致したらその位置を答え、最後まで見て見つからなければ無かったと答えます。地味ですが、並べ替えも下準備もいらないので、どんな配列にも使えます。

当たったら、その場でやめる

大事なのは、見つかった瞬間に打ち切ることです。最後までまわしてしまうと時間が無駄になるだけでなく、同じ値が 2 回出てくる配列で「最後に出てきた位置」を答えてしまいます。

ループを途中で抜ける道具が break と return です。

Python

for i in range(5): print(i) if i == 2: break # 0 # 1 # 2

i が 2 になった時点でループごと終わっています。関数の中なら return でも抜けられ、こちらは値を持ち帰りながら抜けられます。

何回比べることになるのか

比較の回数は、目的の値がどこにあるかで変わります。

Python

names = ["sato", "suzuki", "takahashi", "tanaka"] for i in range(len(names)): print(i, names[i], names[i] == "tanaka") # 0 sato False # 1 suzuki False # 2 takahashi False # 3 tanaka True

先頭にあれば 1 回で終わります。末尾にあれば n 回、そもそも入っていなければ、やはり n 回まで見てから諦めることになります。平均するとおよそ n / 2 回ですが、定数倍は無視するので O(n) です。100 万件なら、最悪 100 万回の比較になります。

見つからなかったことを、どう伝えるか

「無かった」は異常ではなく、正常な結果の 1 つです。ここを設計し忘れると、呼び出した側が判断できません。位置を返す関数では、絶対に正しい位置になりえない -1 を「無かった」の合図に使うのが慣例です。

0 を使ってはいけません。0 は先頭という立派な位置なので、「先頭で見つかった」と「見つからなかった」の区別がつかなくなります。

比較には、型変換を伴わない厳密な等価を使ってください。

JavaScript

console.log("5" == 5); // true console.log("5" === 5); // false

上の行のような比較を許すと、文字列の "5" を探していないのに見つけたことになります。

解説

数十件しか無い配列なら、線形探索で十分です。凝った探し方は下準備を要求するので、その手間のほうが高くつくことがあります。

要件

  1. 先頭から末尾まで順に比較する線形探索で実装すること
  2. 見つかった場合は最初に一致した位置 (0-indexed) を返す
  3. 見つからない場合は -1 を返す

入出力例

linearSearch([3,1,4,1,5,9,2,6], 5) → 4 linearSearch([7,1,2,3], 7) → 0 linearSearch([1,2,3,4], 4) → 3 linearSearch([1,2,3,4], 99) → -1 linearSearch([1,2,3,2,1], 2) → 1 linearSearch([42], 42) → 0

ヒント

for ループでインデックス i を 0 から len(arr)-1 まで動かす

一致したら即座に return i でループを抜ける

ループを抜けたあと return -1 を忘れない

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 二分探索 (O(log n))

    ソート済み配列に対して中央から半分ずつ範囲を狭める二分探索を実装し、O(log n) の威力を理解する。

  • バブルソート

    隣り合う要素を比較・交換していくバブルソートを実装し、O(n^2) の整列アルゴリズムを体感する。

  • 配列の最大と最小

    配列の最大値と最小値を 1 回のスキャンで求める。O(n) で全要素を見る典型例。

  • 累積和で範囲合計

    累積和 (prefix sum) を作っておくことで、範囲合計のクエリを O(1) で答えられる仕組みを学ぶ。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 線形探索先頭から順に1つずつ照合する探索
  • 配列サイズ固定の同型データの集まり
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • 関数処理に名前を付けて再利用できる単位
  • 設計何をどう作るかを決める前工程
  • 判断YES/NO 分岐を表す菱形
  • 型変換あるデータ型を別の型に変換すること。
main.py
学習モード
エディタを読み込んでいます

メモ

線形探索 (O(n))

⌘S で保存