計算量(time complexity)とは、アルゴリズムがデータ量に対してどれだけの処理時間を必要とするかを表す指標です。 「データ数 n が増えたとき、処理回数がどれくらい増えるか」を測ります。
計算量は O(n) や O(log n) のように Big-O(ビッグ・オー)記法で表します。 これは「n が大きくなったときの増え方」だけに着目した表現です。
| 記法 | 名称 | n=1,000,000 のとき |
|---|---|---|
O(1) | 定数時間 | 約 1 回 |
O(log n) | 対数時間 | 約 20 回 |
O(n) | 線形時間 | 1,000,000 回 |
O(n log n) | 準線形時間 | 約 2,000万 回 |
O(n²) | 二乗時間 | 1兆 回 |
O(2ⁿ) | 指数時間 | 計測不能 |
処理が 3n + 5 回なら → O(n) 処理が 100n 回でも → O(n)
n がとても大きいとき、定数倍は無視できる。係数や定数項は捨てて、最も支配的な項だけを残す。
n² + 3n + 5 → O(n²) n + log n → O(n)
n が大きくなると n² の方が圧倒的に大きくなるので、他の項は無視。
代入、比較、四則演算など、データ量に関係なく一定時間で終わるものは O(1)。
for ( i を 0 から n - 1 まで 1 ずつ増やす )
A[i] を出力 // O(1)
endfor
// 全体:n 回ループ × O(1) = O(n)
for ( i を 0 から n - 1 まで 1 ずつ増やす )
for ( j を 0 から n - 1 まで 1 ずつ増やす )
// 何か処理 // O(1)
endfor
endfor
// 全体:n × n × O(1) = O(n²)
while ( n が 1 より大きい )
n ← n div 2 // 半分にする
endwhile
// n が半分になるたびに 1 ステップ → 約 log₂(n) 回で 1 に到達 → O(log n)
| 処理 | 最良 | 平均 | 最悪 |
|---|---|---|---|
| 配列の添字アクセス(A[i]) | O(1) | O(1) | O(1) |
| 線形探索 | O(1) | O(n) | O(n) |
| 二分探索 | O(1) | O(log n) | O(log n) |
| バブルソート | O(n) | O(n²) | O(n²) |
| 選択ソート | O(n²) | O(n²) | O(n²) |
| クイックソート | O(n log n) | O(n log n) | O(n²) |
| マージソート | O(n log n) | O(n log n) | O(n log n) |
| ハッシュテーブルの検索 | O(1) | O(1) | O(n) |
| 二分探索木の検索 | O(log n) | O(log n) | O(n) |
時間ではなく使用するメモリ量に着目した指標を空間計算量といいます。 時間計算量と同じく Big-O 記法で表します。
| アルゴリズム | 空間計算量 |
|---|---|
| 線形探索 | O(1) |
| マージソート | O(n)(一時配列が必要) |
| 再帰関数(深さ n) | O(n)(スタックを n 段使う) |
次のコードの計算量はどれですか。
整数型: sum ← 0
for ( i を 1 から n まで 1 ずつ増やす )
sum ← sum + i
endfor
次のコードの計算量はどれですか。
for ( i を 1 から n まで 1 ずつ増やす )
for ( j を 1 から n まで 1 ずつ増やす )
A[i] と A[j] を比較
endfor
endfor
3n² + 100n + 500 の計算量を Big-O で表すとどれですか。
データ数 n=1,000,000 のとき、最も処理時間が短いのはどれですか。
n 個の要素がある配列から「目的の値」を探す。配列がソート済みのとき、最も効率的なアルゴリズムはどれですか。