計算量(オーダー)の比較ツール

アルゴリズムの計算量(オーダー記法)が違うと、データが増えたときの処理時間がどれほど違うのかを、具体的な回数と時間で示します。データ数と、コンピュータが1秒間に処理できる回数を入れると、各オーダーでかかる時間が分かります。データ数を変えたときの処理時間の見積もりもできます。

データ数と処理の速さ

データ数を変えたときの見積もり

手順の回数の比
–
新しい処理時間の目安
–

オーダーごとの回数と時間

データ数と手順の回数(縦軸は対数)

手順の回数は、係数や定数項を無視したオーダーの式そのもの(log は2を底)で計算しています。実際の時間は、係数、メモリやキャッシュの速さ、入力の並び方などで変わるので、目安として使ってください。グラフはデータ数60までを表示し、10¹²回より上は切っています。

オーダー記法とは

オーダー記法(O記法、ビッグオー記法)は、データ数 n が大きくなったときに、アルゴリズムの手順の回数がどのような割合で増えるかを表します。たとえば 3n² + 5n + 2 回の手順がかかるなら、n が大きいときは n² の項が支配的になるので、係数と小さい項を無視して O(n²) と書きます。これにより、コンピュータの速さや細かい実装によらずに、アルゴリズムどうしの効率を比べられます。

オーダーの違いが生む差

1秒に1億回処理できるとすると、n = 100万のとき、O(n) なら0.01秒、O(n log n) なら約0.2秒ですが、O(n²) では1万秒(約2.8時間)かかります。O(2ⁿ) では n = 50 でも約130日かかり、n が1増えるごとに時間が2倍になります。データ数が少ないうちはどれも一瞬で終わるので差が見えにくく、データが増えて初めて問題になります。データ数を1000、100万、10億と変えて、表の時間の列を見比べてください。

処理時間の見積もり

計算量が分かっていれば、データ数が変わったときの処理時間を見積もれます。O(n²) のプログラムがデータ数1000で0.5秒かかったなら、データ数4000では回数が (4000 ÷ 1000)² = 16倍になるので、約8秒と見積もれます。O(n log n) なら、4000 × log₂ 4000 ÷ (1000 × log₂ 1000) ≒ 4.8倍で、約2.4秒です。試験では、このような見積もりや、どのオーダーが速いかの順番を問う問題がよく出ます。

よく使われるアルゴリズムの計算量

二分探索は、調べる範囲を毎回半分にするので O(log n) です。比較によるソートは、最悪の場合でも O(n log n) より速くはできないことが知られていて、マージソートやヒープソートはこの限界に達します。行列の積を素直に計算すると、n × n の行列で O(n³) になります。O(2ⁿ) や O(n!) のような指数時間のアルゴリズムは、n が数十を超えると現実的な時間で終わらないので、動的計画法や近似アルゴリズムなどで回数を減らします。

アルゴリズムの問題を解く

要素数 n の配列で、異なる2つの要素の組をすべて1回ずつ比べる処理(i 番目の要素を、それより後ろにあるすべての要素と比べることを、i を1つずつ進めて繰り返す二重ループ)の計算量はどれか。

  1. AO(n)
  2. BO(n log n)
  3. CO(n²)
答えと解説を見る

正解:C. O(n²)

比べる組の数は (n−1) + (n−2) + … + 1 = n(n−1)/2 で、n = 10 なら45回、n = 1000 なら499,500回です。計算量のオーダーは n が大きくなったときの増え方だけを見るので、係数の1/2や低い次数の項を省いて O(n²) と表します。n が2倍になると回数はおよそ4倍になります。O(n) は全要素を1回ずつ見るだけの処理、O(n log n) はマージソートのように半分に分けることを繰り返す処理の計算量です。

計算量が O(n²) のプログラムで、データ数が1,000のときに処理時間が0.5秒だった。データ数を4,000にすると、処理時間はおよそ何秒になるか。

  1. A2秒
  2. B8秒
  3. C32秒
答えと解説を見る

正解:B. 8秒

O(n²) では処理時間がデータ数の2乗に比例するので、データ数が4倍になると処理時間は 4² = 16倍になり、0.5秒 × 16 = 8秒です。2秒はデータ数に比例する O(n) の場合、32秒は3乗に比例する O(n³) の場合(4³ = 64倍)の値です。実際には、データがキャッシュに入りきらなくなるなどの影響で、これより遅くなることもあります。

異なる100個の値が入った配列から、先頭から順に1つずつ比べる線形探索で目的の値を探す。目的の値は必ず配列の中にあり、どの位置にある確率も等しいとき、比較の回数の平均はいくらか。

  1. A約7回
  2. B50.5回
  3. C100回
答えと解説を見る

正解:B. 50.5回

目的の値が k 番目にあれば比較は k 回なので、平均は (1 + 2 + … + 100) / 100 = 50.5回、一般には (n + 1)/2 回です。最良の場合(先頭にある)は1回、最悪の場合(末尾にある)は100回で、平均も最悪も n に比例するので計算量は O(n) です。約7回は log₂ 100 ≈ 6.6 に当たる二分探索の回数で、データが整列されていなければ使えません。

昇順に整列された異なる1,000個の値から二分探索で値を探す。1回の比較で「一致・より小さい・より大きい」が分かるものとすると、見つかる場合も見つからない場合も含めて、比較の回数は最大で何回か。

  1. A10回
  2. B32回
  3. C500回
答えと解説を見る

正解:A. 10回

1回の比較で探す範囲がほぼ半分になり、2¹⁰ = 1024 ≥ 1000 なので、最大でも10回で範囲がなくなります(⌊log₂ 1000⌋ + 1 = 10)。計算量は O(log n) で、100万個でも最大20回で済みます。32回は √1000 ≈ 31.6 に当たる値で、500回は線形探索の平均(約 n/2)に近い値です。ただし、二分探索を使うにはデータが整列されている必要があり、整列にかかる O(n log n) の手間も考える必要があります。

よくある質問

O(log n) の log の底は何ですか?

オーダー記法では、底が違っても定数倍の違いにしかならないので、底を書かないのが普通です。このツールでは、二分探索などの手順の回数に合わせて2を底にしています。

O(n²) のアルゴリズムは、いつも O(n log n) より遅いのですか?

データ数が小さいときは、係数が小さい O(n²) のアルゴリズムのほうが速いこともあります。そのため、実際のソートの実装では、短い部分の並べ替えに挿入ソートを使うことがあります。データ数が大きくなると、オーダーの小さいほうが必ず有利になります。

空間計算量とは何ですか?

アルゴリズムが使う記憶領域(メモリ)の量の増え方を表すものです。たとえばマージソートは、作業用に n 個分の領域を使うので空間計算量は O(n)、ヒープソートは配列の中で並べ替えるので O(1) です。

試験ではどのように問われますか?

基本情報技術者試験などでは、データ数を変えたときの処理時間の見積もり、アルゴリズムの計算量を選ぶ問題、オーダーの大小の順番を問う問題がよく出ます。下の「見積もり」の欄で、問題文の数値を入れて確かめられます。

関連する用語

計算量 二分探索 動的計画法

関連する計算ツール

半導体・電子回路・情報の計算ツール →