Big O記法は、アルゴリズムを比較するための方法です。これは、あるアルゴリズムが入力サイズに対してどれだけの時間(実行時間)やどれだけのメモリ(空間)を必要とするかを概念的に表し、アルゴリズム同士を効率の観点で比較できるようにします。実際の実行時間は実装やハードウェアに依存しますが、Big Oは入力サイズが大きくなるときの成長のしかた(漸近的な振る舞い)に着目して評価します。

ビッグオー記法は、問題の複雑さのクラスとしても知られている、問題の複雑さを識別するためによく使用されます。歴史的には数学者のPaul Bachmann (1837–1920)が1896年に著書「Analytische Zahlentheorie」の第2版でこの表記を用い、後にエドマンド・ランドー(1877–1938)が普及させたため、日本語ではしばしばランドーの記号とも呼ばれます。

概念と名前の由来

「Big O」は関数の成長を表す「関数の順序(Order of a function)」に由来し、主に「上界(最悪ケース)」を表現するために使います。つまり、入力サイズ n が十分大きいときに、あるアルゴリズムの実行時間 f(n) が別の関数 g(n) の定数倍以下になる、という関係を示します。これにより、最悪のシナリオでどれだけ時間や資源を消費するかでアルゴリズムを分類できます。

正式な定義(簡潔に)

関数 f(n) と g(n) があり、g(n) が正で単調増加するとき、次が成り立てば「f(n) = O(g(n))」と書きます:ある正の定数 c と n0 が存在して、すべての n ≥ n0 に対して f(n) ≤ c · g(n) が成り立つ。直感的には「f は最終的に g の定数倍より大きくならない」ということです。

よく使われる時間計算量の例

  • O(1) — 定数時間:入力サイズによらず実行時間が一定(例:配列の特定インデックスへの単一アクセス)。
  • O(log n) — 対数時間:二分探索など、入力を毎回半分にするようなアルゴリズム。
  • O(n) — 線形時間:入力を一度ずつ処理するアルゴリズム(例:配列の全要素の合計)。
  • O(n log n) — ほとんどの効率的なソート(例:マージソート、ヒープソート)。
  • O(n^2) — 二重ループなど(例:単純な比較ソートの一部、挿入ソートの最悪ケース)。
  • O(2^n) — 指数時間:再帰的に多数の分岐をする問題(例:冪集合の列挙、ナイーブなフィボナッチ)。
  • O(n!) — 階乗時間:順列をすべて試すような問題(例:巡回セールスマン問題の全列挙)。

注意点・実務的な解釈

  • Big Oは漸近的な挙動を示すため、定数係数や低次の項は無視されます(例:1000n と n は両方 O(n))。
  • 最悪ケース(worst-case)の記述に使うことが多いですが、平均ケース(average-case)、最良ケース(best-case)も別に表現できます。
  • 時間計算量だけでなく、メモリ使用量(空間計算量)にも同じ記法を用います。
  • 実用上は、入力サイズが小さいときには定数因子や実装の工夫が重要になるため、Big O だけで選択するのは不十分な場合があります。

他の漸近記法

Big O は上界(最悪ケース)を表しますが、他にも漸近表記があります:Θ(シータ)は上界と下界の両方を表す(厳密な漸近的同値)、Ω(オメガ)は下界(最良・下限)を表します。アルゴリズム解析では状況に応じて使い分けます。

実例と直感

たとえば、配列の先頭要素へのアクセスはどんなに配列が大きくなってもほぼ一定時間で行えるため O(1) です。一方、配列内にある値を探す線形探索は最悪で配列全体を調べる必要があるため O(n) です。効率的なソートアルゴリズムは多くの場合 O(n log n) の平均/最悪性能を持ち、単純な二重ループのアルゴリズムは O(n^2) になります。

Big Oは、コンピュータ上でプログラムを実行しなくても、あるアルゴリズムがどれだけ効率的であるかを示す、最悪のシナリオの実行時間を求める式です。これは、コンピュータによってハードウェアが異なるため、プログラムを完成させるのに必要な時間が異なる場合にも有用です。Big Oは常に最悪のケースを想定しているので、速度の一貫した測定値を示すことができます:ハードウェアに関係なく、O ( 1 ) {\displaystyle O(1{\displaystyle O(1)})}は常にO ( n ! ) {\displaystyle O(n!)}{\displaystyle O(n!)}よりも速く完了するようになっています。

まとめ(実務へのアドバイス)

  • アルゴリズム選択ではまず漸近時間・空間計算量で大まかに評価する。大きな入力サイズが想定される場合、対数や線形に近い成長を持つ手法を優先する。
  • 小さな定数因子や実装の工夫も無視できないため、プロトタイプやベンチマークで実際の性能を確認すること。
  • 平均ケースと最悪ケースの違いを理解し、用途に応じて適切な解析(平均・最悪・空間)を行う。