markdown
計算量の基本
lecture/information/algorithm/foundation/計算量の基本-講義.n.md
計算量の基本
algorithmfoundationundergraduatelecture
導入
この講義で最重要なのは、アルゴリズムの速さは、1 回の実行時間ではなく、入力サイズが大きくなったときにどう増えるかで見ることです。
同じ問題を解くアルゴリズムでも、入力が小さいうちは差が目立たなくても、大きくなると急激に差が開くことがあります。この増え方を見るのが計算量です。
用語と定義
時間計算量 とは、入力サイズ n に対して、処理回数がどう増えるかを表したものです。
空間計算量 とは、追加で必要になるメモリがどう増えるかを表したものです。
方針
まず、実際に何回繰り返すかに注目します。そのあと、定数倍や低次の項を無視して、増え方の本質だけを残します。
直感的な説明
線形探索は、最悪だと先頭から末尾まで全部見るので、入力が 2 倍になれば仕事量もだいたい 2 倍になります。これが O(n) です。
二分探索は、1 回の比較で候補を半分にするので、入力がかなり増えても比較回数はゆっくりしか増えません。これが O(\log n) です。
厳密な説明
1. ビッグ O
T(n)=3n+5
のような処理回数は、大きな n では n の項が支配的なので
T(n)=O(n)
と書きます。
2. 代表的な増え方
- O(1) : 一定時間
- O(\log n) : 対数的
- O(n) : 線形
- O(n^2) : 二次
3. 空間計算量
配列をそのまま読むだけなら追加メモリは小さいですが、別に同じ大きさの配列を作れば O(n) の空間計算量が必要です。
見分け方
- 1 重ループならまず O(n) を疑います。
- 2 重ループならまず O(n^2) を疑います。
- 範囲を半分ずつに削るなら O(\log n) です。
- 配列や表を追加でどれだけ作るかを見ると、空間計算量の見当がつきます。
最終形
\boxed{3n+5=O(n)}
\boxed{\text{半分に削る} \Rightarrow O(\log n)}
一言でいうと
- 計算量は、入力が大きくなったときの増え方でアルゴリズムを比べる道具です。