ビッグO記法の増加率
入力
| 入力サイズ n | 20 |
|---|
ビッグO記法の増加率
入力サイズ n を入力して、代表的な時間計算量クラス(O(log n) から O(n!) まで)が必要とする演算数を比較します。
入力
入力サイズ
結果
値を入力すると計算結果が表示されます。
代表的な計算量
爆発的な増加
ビッグO記法の増加率
ビッグO記法は、アルゴリズムのリソース消費が入力サイズに対してどのように拡大するかを分類する記法です。特定のマシンで何秒かかるかを測るのではなく、増加の形状を捉えます。n が 2 倍になったとき、処理量も 2 倍になるのか、それとも 4 倍になるのか。以下の 6 つの計算量クラスは、教科書や技術面接で最もよく登場するものです。
6 つの代表的な計算量クラス
O(log n) — 対数時間。 各ステップで残りの処理の一定割合が除去されます。10 億件の要素を持つソート済み配列に対する二分探索は、毎回探索範囲を半分に絞り込むため、比較は 30 回で済みます。平衡 BST の検索や、多くの分割統治アルゴリズムの再帰がここに該当します。
O(n) — 線形時間。 処理量が入力サイズに正比例して増加します。配列を一度走査して最大値を求める線形探索、文字列の文字数カウント、リストの全要素の読み取りなどが該当します。線形時間アルゴリズムは一般に効率的とみなされます。
O(n log n) — 準線形時間。 ソートで最もよく見られる計算量です。マージソート、ヒープソート、Python と Java で採用されている Timsort はいずれも O(n log n) を達成しており、これは比較ベースのソートの理論的下限でもあります。 の場合、演算数はおよそ 2,000 万回であり、実用的には十分高速です。
O(n²) — 二乗時間。 入力に対する二重ループ。バブルソート、挿入ソート、素朴な行列積はいずれも最悪ケースで O(n²) です。 では 1 億回、 では 1 兆回となり、大量データには不向きです。
O(2ⁿ) — 指数時間。 要素が 1 つ増えるごとに処理量が 2 倍になります。再帰的なフィボナッチの素朴な実装は部分問題を指数的に再計算し、集合の部分集合を全列挙するブルートフォースも で増加します。n = 40 で演算数は 1 兆を超えます。
O(n!) — 階乗時間。 日常的なアルゴリズム解析で最も急速に増加するクラスです。巡回セールスマン問題への総当たり解法は考えられるすべての経路(順列)を調べ、その総数は 通りになります。n = 20 の時点で演算数は 200 京を超えます。
n = 20 での計算例
n = 20 における O(n log n) と O(n!) の比はおよそ 倍です。高速なソートと宇宙の年齢よりも長い待ち時間の差と言えます。
実践的な指針
n が小さいうちは定数係数とキャッシュ効率が重要ですが、n が大きくなると計算量が支配的になります。おおよそ n = 10,000 を境に、O(n²) は現代のハードウェアでも(単純な演算を想定した場合)扱いにくくなり始めます。n が を超えると、O(n log n) 以上に優れたアルゴリズムが実質的に必須となります。指数時間・階乗時間のアルゴリズムは、実世界の入力に対しては近似アルゴリズム、動的計画法、または枝刈り戦略が必要です。
基数変換ツール は、入力空間の二進表現を扱う際に役立ちます。
よくある質問 (FAQ)
ビッグO記法は何を表しているのですか?
ビッグO記法は、入力サイズ n が大きくなるにつれてアルゴリズムの実行時間(またはメモリ使用量)がどのように増加するかの上限を表します。定数係数や低次の項は n が大きくなるほど影響が小さくなるため、意図的に無視します。O(n²) のアルゴリズムは、ハードウェアの速度に関係なく、十分に大きな n では必ず O(n log n) のアルゴリズムを上回ります。ビッグO記法はアルゴリズムの設計を比較するためのツールであり、実際の実行時間を正確に予測するものではありません。
対数の底はなぜ 2 なのですか?
二分探索やマージソート、平衡 BST などの分割統治アルゴリズムの多くは、各ステップで処理を半分に分割します。そのため分割の深さは log₂ n になります。ビッグO解析では対数の底は定数係数にすぎず、計算量クラスを変えません。log₂ n と log₁₀ n は定数倍しか違わないためです。ただし、二進分割を用いるアルゴリズムが多いことから、コンピュータサイエンスでは底 2 が慣習となっています。このツールもその慣習に従って底 2 を使用しています。
入力サイズがどのくらいになると計算量が重要になりますか?
n が 50 程度の小さな入力では、定数オーバーヘッドが小さくキャッシュ効率の良い O(n²) アルゴリズムが、理論的により速い O(n log n) アルゴリズムを上回ることがあります。計算量が支配的になるのは、n が数百から数千の規模になってからです。
n = 1,000 の場合、O(n log n) のソートは約 10,000 回の比較で済むのに対し、O(n²) のソートは 1,000,000 回必要です。n = 1,000,000 になるとその差は 10 億対 1 兆になり、計算量だけが実質的な決定要因となります。
O(n!) のアルゴリズムは実際に使われますか?
O(n!) アルゴリズムは、ごく小さな入力を除いて実用的ではありません。n = 20 の時点で n! は 200 京を超える演算数となり、いかなるコンピュータも人の一生の間に処理を終えることはできません。
実際には、巡回セールスマン問題のような NP 困難問題は、すべての順列を列挙しない近似アルゴリズム、ヒューリスティクス、または動的計画法で解かれます。このツールの階乗列は、そうした近似手法が存在する理由を示す指標として機能します。