計算量とO記法 — Nが増えると何が起きるか
同じ「正しい」プログラムでも、データが増えたときに一瞬で終わるものと宇宙が終わっても終わらないものがある。その差を測る物差しが計算量、書き方がO記法です。数式より先に、まず「増え方」を目で見てしまいましょう。
1. 計算の競走 — 増え方はこんなに違う
入力サイズ N を1つ選ぶと、アルゴリズムの種類ごとに「必要な手数(ステップ数)」が決まります。下は6種類の代表的な増え方(オーダー)の競走です。スタートの合図で全員いっせいに走り出しますが、速く増えるものは一瞬で壁に激突します。
N のスライダーを大きくしてみてください。まず O(2ⁿ) が、続いて O(n²) が壁を突き破って画面外へ吹き飛びます。一方で O(1) や O(log n) はほとんど動きません。
2. 成長曲線を並べて見る
競走を横から見ると、手数を N の関数として描いた成長曲線になります。線形の目盛りだと、速く伸びるものは画面の上へすぐ消えてしまう(それが現実です)。「対数目盛」にチェックを入れると、全員を1画面に収めて傾きの違いとして比べられます。
3. なぜ定数や小さい項を捨てるのか
O記法は 50n や 3n+7 をぜんぶ「O(n)」と書きます。細かい係数や小さい項を捨てるのです。「乱暴では?」と感じますが、これはN が十分大きいときの勝負だけを見る、という約束。下で確かめましょう。
アルゴリズムA は係数の大きい線形 c×n、アルゴリズムB は係数1の二乗 n²。c を大きくしても、ある地点(交差点 n=c)を超えたら n² は必ず c×n に追い抜かれます。定数は「追い抜かれる地点を遅らせる」だけで、勝敗そのものは変えられません。
4. どれくらい待つのか — 手数を時間に換算する
最後に、手数を実際の待ち時間に変えてみます。今どきのCPUを大まかに「1秒間に10億ステップ(10⁹)」として、各オーダーの所要時間を並べたのが下の図です。時間軸は対数(1目盛りで10倍)なので、桁違いの差が横幅の差として見えます。
5. まとめ — オーダーで世界を見る
- 計算量は「N が増えたとき手数がどう増えるか」を測る。定数や小さい項は捨て、増え方の性格だけを O記法で表す。
- 速い順のだいたいの序列:O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ)。境目の O(n log n)(速いソートなど)までが「実用の壁」。
- O(n²) は大きな N でつらく、O(2ⁿ)(総当たり)は小さな N ですら破綻する。だからアルゴリズムを工夫してオーダーそのものを下げることに価値がある。