オーダー記法の伸び方:各計算量クラスが実際にいくらかかるか
あなたのデータ
二つのアルゴリズムを差し向かいで
定数とは、記法が捨ててしまうもの全部です。メモリ確保、キャッシュミス、一歩ごとの中身。片方に重い定数を与えて、それが効かなくなる地点を見てください。
このページはあなたのループを読みません。コードを読んで計算量を当てにいくのは、測定の衣をまとった当て推量です。ループは途中で抜けられますし、中のたった一つの呼び出しが本当の費用を隠すこともあり、再帰は見た目どおりに読めることのほうが少ない。クラスを選ぶのはあなたで、そこから先の計算は厳密です。
結果
| どこで逆転するか(要素数) | — |
| 上の大きさでの、それぞれの演算回数 | — |
このページの初期値では、逆転は 439 要素です。二百件のリストで「良いほうのクラス」に手を伸ばした人は、プログラムを遅くし、コードを難しくしただけです。記法は警告しません。記法が語るのは最終的にどうなるかであって、あなたに何が起きるかではないからです。
この大きさでの各クラス
| クラス | 演算回数 | 時間 | 入力が倍になったときの倍率 |
|---|
最後の列こそ、じっと見る値打ちがあります。誰も頭の中に持っていない列だからです。線形の仕事は倍になる。二乗の仕事は四倍になる。指数の仕事は二乗される。すでに千要素あるところで入力を倍にすると、費用は二の千乗倍、つまり三百二桁の数になります。
階乗の悪さは、倍にすることとは別の筋の悪さです。一つ足すだけで費用は新しい個数倍になります。つまり二十一個目は、二十個の問題まるごとの二十一倍です。だから二十都市の巡回セールスマンを厳密に解くと 2.4 の百万×百万×百万歩、一秒十億回でも七十七年になります。同じ二十都市が、二の n 乗なら千分の一秒で終わるのにです。
同じ理由で、クラスどうしの差は小さい規模では退屈で、大きい規模では容赦がありません。十要素では n log n と n の二乗の差は三倍で、利用者は誰も気づきません。千要素では百倍、百万要素では五万倍です。同じ二つのアルゴリズム、同じコード、変わったのは入力だけです。
つまり、計算量クラスを正直に読むなら、それは曲線の形についての約束であって、速さについての約束ではありません。入力が増えたとき費用がどう反応するかを述べるだけで、今日あなたの機械で、実際の大きさで速いかどうかについては何一つ述べていません。
計算量クラスが良いほど、プログラムは速いのですか。
あなたの規模では、必ずしもそうではありません。クラスが述べるのは、入力が増えたとき費用がどう反応するかだけです。一歩ごとの中身については何も言いませんし、その中身こそ記法が捨てているものです。
このページの初期値では、定数の軽い二乗のアルゴリズムが、定数五十の n log n に対して 439 要素未満のすべての入力で勝ちます。それを超えると良いクラスが前に出て、以後は差を返しません。
このページが私のコードを読まないのはなぜですか。
コードから計算量を当てにいくのは、測定の衣をまとった当て推量だからです。ループは途中で抜けられ、中の呼び出し一つが本当の費用を隠すこともあり、再帰は見た目どおりに読めることのほうが少ない。
ですからここでのクラスは、あなたの入力であって、ページの意見ではありません。そこから計算されるものはすべて厳密な算術であり、あなたのループが何をしているか知っているふりは、このページのどこにもありません。
入力が倍になると、実際には何が起きますか。
線形の仕事は倍になり、二乗の仕事は四倍になります。ここまでは多くの人が頭に入れています。指数の仕事は二乗されます。これを頭に入れている人はほとんどいません。千要素なら、入力を倍にすると費用は二の千乗倍になります。
階乗はそもそもその理屈で動きません。一つ足すだけで費用は新しい個数倍になり、二十一個目は二十個の問題まるごとの二十一倍になります。
| クラス | 千要素で入力が倍になったときの倍率 |
|---|---|
| O(n) | 2 |
| O(n log n) | 2,2 |
| O(n²) | 4 |
| O(n³) | 8 |
| O(2ⁿ) | 1,07 x 10^301 |
二十都市の巡回セールスマンを厳密に解くのが無理なのはなぜですか。
二十の階乗は 2.4 の百万×百万×百万歩で、一秒十億回の演算でも七十七年になるからです。同じ二十要素が、二の n 乗なら千分の一秒ほどで終わります。
これが指数と階乗の実務上の違いであり、両方をまとめて「不可能」の棚に入れず、分けて考える値打ちがある理由です。
反応
0
0 コメント
最初にコメントする