計算量オーダーと計算時間の関係性 ~オーダー記法の注意点~
実計算時間をオーダー記法(ランダウ記号)で見積もる上での問題点
1.記事の概要・対象読者
計算時間の比較には
読者としては計算量のオーダー記法が何を表しているかは理解していて、かつプログラムの計算時間に関心のある方を対象としてしています。
2.定義・前提知識
今後の議論でオーダー記法を多用するため、その定義を簡単にまとめておきます。
通常オーダー記法とは数学のランダウ記号を使う計算量の表記法を指し、計算量が
を満たす定数
ただし
3.オーダー記法の基本的な使い方
与えられたデータの大きさ
他にもオーダー記法はあるアルゴリズムの計算時間を見積もる際にも利用されます。例えば
4.オーダー記法の限界
オーダー記法は上のように計算時間の比較や推定に使えるわけですが、実際にはこのようにして推定した計算量が実測値と合わないことが頻発します。ここではそのずれが起きる原因と、ずれが起きる例を挙げて見ていきます。
4.1 係数の影響
オーダー記法で計算量を表現する際、(1)の
アルゴリズム | A | B |
---|---|---|
計算量(計算時間)/秒 | ||
計算オーダー | ||
8秒 | 0.69秒 | |
13分 | 4.0分 | |
22時間 | 13時間 | |
93日 | 80日 | |
2.3年 | 2.3年 | |
25年 | 29年 |
これを見ると、オーダー記法上では
オーダー記法ではAの方が速いアルゴリズムですが、実用上速いアルゴリズムはBとなります。
特に素直な実装よりも速いとされるアルゴリズムは係数
あなたが計算速度を評価する立場ならば、この係数も計測することでその影響を正しく評価できます。 実際に測定を行えば係数を求めることは比較的容易なので、それを用いてどの位の
しかしハードウェアの進化に伴い実運用で扱う
あなたがプログラムを高速化する立場ならば、定数倍の高速化を重視することが係数が大きい場合の対処法です。 オーダーが変化するような高速化には大規模なアルゴリズム変更が必要なことが多いですが、係数を変えるような定数倍の高速化なら小規模な改修で済むことが多いです。他には分割統治法を用いたアルゴリズムなら、
現実的には一定の範囲内の
4.2 低次の計算量の影響
計算量オーダーで評価できるのはあくまで最高次のみです。もしそれ以外の項の寄与が大きければ、計算量全体に与える影響も無視できなくなります。
アルゴリズム | C | D |
---|---|---|
計算量(計算時間)/秒 | ||
計算オーダー | ||
最高次の係数 |
1 | 2 |
3.4時間 | 3.3分 | |
2.8日 | 5.5時間 | |
52日 | 23日 | |
1.1年 | 1.1年 | |
4.6年 | 6.3年 |
これを見ると、計算量オーダーは
さらに計算時間の逆転が起きない範囲であっても、低次の計算量を無視できるわけではありません。 実際Cの方が速い
あなたが計算速度を評価する立場ならば、計算量オーダーの理論値と実測値を比較し、同じ挙動を示しているのかを確認するべきです 低次の項の寄与が大きい場合、計算量オーダーの挙動はそちらに引っ張られるはずです。すると理論値と実測値に挙動のずれが生じ、低次の項の効果が無視できないことが示唆されます。それをもとに計算速度の式を修正し、速度評価をより正確にできます。
あなたがプログラムを高速化する立場ならば、高速化するべきコードをきちんと特定するべきです。 低次の寄与が大きい場合、通常ボトルネックになる計算の核部分ではなく、前後処理や補助処理に時間がかかっている可能性があります。それぞれにかかっている時間を詳しく測り、原因を調べなければ、せっかく各部分を改良したのに効果が薄いとなりかねません。
4.3 並列化の影響
並列化可能率の違いにより、計算量オーダーが大きくとも計算時間が小さくなることがあります。
計算がアムダールの法則にしたがうとし、並列化できる割合を
アルゴリズム | E | F |
---|---|---|
計算量(計算時間)/秒 | ||
計算オーダー | ||
並列化可能割合 |
0.3 | 0.95 |
12日 | 80日 | |
9.8日 | 42日 | |
9.0日 | 23日 | |
8.5日 | 13日 | |
8.3日 | 8.7日 | |
8.2日 | 6.4日 | |
8.2日 | 5.2日 | |
8.1日 | 4.6日 |
これをみると、計算量としては
あなたが計算速度を評価する立場ならば、計算に使用するコア数を変えることで並列化の影響を評価できます。 今回のようにアムダールの法則に従うのであれば、これにより
実際には並列化の影響はもっと複雑な挙動を示すので、パラメータを増やして近似する必要があります。
あなたがプログラムを高速化する立場ならば、実行するハードを考慮して高速化を行うべきです。 あなたが想定すべき実行環境が家庭用のノートPCなのか、それともスパコンなのかでE,Fいずれを採用するべきかは変わりますし、そんな極端な例でなくともCPUで実行するなら計算量の少ないEを、GPUで実行するなら並列化しやすいFを使うというような使い分けだってありえます。
すなわち計算時間を短くするため、ハードの特徴に合わせ計算量の多いアルゴリズムを採用することも検討するべきです。
4.4 メモリの影響
通常計算速度の指標として用いるのは「計算量」オーダーです。しかし実際のプログラムでは「計算」だけではなく「読み書き」も大量に行っており、後者の影響が顕著に表れる場合もあります。
アルゴリズム | G | H |
---|---|---|
計算量(計算時間)/秒 | ||
メモリアクセス量/秒 | ||
計算オーダー | ||
11秒 | 33秒 | |
3.3分 | 9.3分 | |
80分 | 80分 | |
3.1時間 | 2.2時間 | |
11.7日 | 1.2日 |
これをみると計算量ではGの方が小さいですが、
今回は極端な例を用意しましたが、実際の環境においてもキャッシュミスによって大きな
あなたが計算速度を評価する立場ならば、メモリアクセスが処理時間に大きく影響しうることを頭に入れておかなければなりません。 特にキャッシュミスに伴うアクセス時間の増加は
あなたがプログラムを高速化する立場ならば、使っているメモリ量を意識して高速化を行うべきです。 キャッシュミスは当然キャッシュ量付近から起き始めるので、L1~L3キャッシュの量である1コア当たり数百KB~数MB付近からメモリアクセスの影響が出始めます。これを頭に入れておけば、
5.そもそも計算時間を調べるのにオーダー記法は向いてない
ここまで計算量オーダーだけでは計算量や計算時間を正しく評価できない例を挙げてきましたが、元も子もないことを言えばオーダー記法は計算時間を単独で評価するのに適切な評価軸ではありません。
「2.定義・前提知識」で述べたように、もともとランダウ記号は数学で用いられてきた記号であり、変数
しかし
ゆえにオーダー記法が計算量の評価として適切であるのはあくまで両者を満足するような範囲の
ただオーダー記法自体は理論の面では適切な評価方法であり、動作環境に左右されない評価方法であることが強みです。 上で挙げたものはいずれも演算能力の限界や、ハードウェアに依存して現れる現象なので、長期的な運用や様々な動作環境を見据えるのなら、信頼性の高い評価方法であることに間違いはありません。
6.まとめ
以上のことから、実計算時間を評価する際に、オーダー記法のみでは十分な評価方法とは呼べません。現実では係数や低次の項の影響が無視できない場合が多く、オーダー記法だけでは並列化可能割合やキャッシュヒット率なども評価できないために、最もよく見られる計算量評価の方法であるにも関わらず現実に即していないこともあります。しかしながら一般性の高い評価方法であることもまた事実です。
オーダー記法の問題点はあくまで広く使われている一方で、実運用で利用する際には留意すべき点が多いという点です。それらの注意点が頭に入っていれば、実計算時間とのずれに遭遇しても原因分析は難しくありません。
ゆえにオーダー記法を実際の評価に用いる際には上に挙げたような影響を考慮に入れつつ、計算速度の実測値と比較しながら用いることで、有用な評価軸の1つとして扱うことができるはずです。
7.参考文献
[1] 「ランダウの記号」(Wikipedia)
(2025/08/10 参照)[2] 「アムダールの法則」(Wikipedia)
(2025/08/10 参照)
Discussion