オーダー記法の伸び方:各計算量クラスが実際にいくらかかるか

あなたのデータ

二つのアルゴリズムを差し向かいで

定数とは、記法が捨ててしまうもの全部です。メモリ確保、キャッシュミス、一歩ごとの中身。片方に重い定数を与えて、それが効かなくなる地点を見てください。

このページはあなたのループを読みません。コードを読んで計算量を当てにいくのは、測定の衣をまとった当て推量です。ループは途中で抜けられますし、中のたった一つの呼び出しが本当の費用を隠すこともあり、再帰は見た目どおりに読めることのほうが少ない。クラスを選ぶのはあなたで、そこから先の計算は厳密です。

結果

どこで逆転するか(要素数)
上の大きさでの、それぞれの演算回数

このページの初期値では、逆転は 439 要素です。二百件のリストで「良いほうのクラス」に手を伸ばした人は、プログラムを遅くし、コードを難しくしただけです。記法は警告しません。記法が語るのは最終的にどうなるかであって、あなたに何が起きるかではないからです。

この大きさでの各クラス

クラス演算回数時間入力が倍になったときの倍率

最後の列こそ、じっと見る値打ちがあります。誰も頭の中に持っていない列だからです。線形の仕事は倍になる。二乗の仕事は四倍になる。指数の仕事は二乗される。すでに千要素あるところで入力を倍にすると、費用は二の千乗倍、つまり三百二桁の数になります。

階乗の悪さは、倍にすることとは別の筋の悪さです。一つ足すだけで費用は新しい個数倍になります。つまり二十一個目は、二十個の問題まるごとの二十一倍です。だから二十都市の巡回セールスマンを厳密に解くと 2.4 の百万×百万×百万歩、一秒十億回でも七十七年になります。同じ二十都市が、二の n 乗なら千分の一秒で終わるのにです。

同じ理由で、クラスどうしの差は小さい規模では退屈で、大きい規模では容赦がありません。十要素では n log n と n の二乗の差は三倍で、利用者は誰も気づきません。千要素では百倍、百万要素では五万倍です。同じ二つのアルゴリズム、同じコード、変わったのは入力だけです。

つまり、計算量クラスを正直に読むなら、それは曲線の形についての約束であって、速さについての約束ではありません。入力が増えたとき費用がどう反応するかを述べるだけで、今日あなたの機械で、実際の大きさで速いかどうかについては何一つ述べていません。

反応

0

0 コメント

User profile image

最初にコメントする

計算量クラスが良いほど、プログラムは速いのですか。

あなたの規模では、必ずしもそうではありません。クラスが述べるのは、入力が増えたとき費用がどう反応するかだけです。一歩ごとの中身については何も言いませんし、その中身こそ記法が捨てているものです。

このページの初期値では、定数の軽い二乗のアルゴリズムが、定数五十の 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 乗なら千分の一秒ほどで終わります。

これが指数と階乗の実務上の違いであり、両方をまとめて「不可能」の棚に入れず、分けて考える値打ちがある理由です。