いいえ。時間計算量は時間を漸近的に表すことを考慮してください。時間計算量が低いほど高いものに吸収されます。
O(n²)
k × n² + c
それが非常に低いと想定されてc
いるため、私たちがそれを気にしないことを意味します。
これらは、一定の効果、全体に対する一定量のオーバーヘッド(c)、および複雑さが何であれ、一定量のコストです。あるn²
アルゴリズムが他のn²
アルゴリズムよりも低いk
場合、またはそれらが等しい場合は、より低いアルゴリズムを打ち負かしますc
。また、O(n²)は、nの値が十分に低い場合はO(1)と同じです(通常は気にしませんが、k
それぞれの値が大きく異なる可能性があります。また、各m回実行すると、O( n²m)はO(m)を上回りますが、nが低い場合、実際に比較されるものではありません)。
とにかく、これは意図的な過度の単純化です。なぜならk
、c
実際には一定ではなく、一定と同じくらい良いからです。したがって、何かが本当にあった場合O(n² + log(n))
、私たちはそれを呼ぶでしょうO(n²)
、なぜなら私たちが心配しlog(n)
ているときに誰がその小さなことを気にしないのn²
ですか?
それで。あなたのケースを見てください。外側のループをn
何度も実行します。それらのそれぞれについて、内部ループn-1
時間を実行します。これらの内部ループのそれぞれについて、最初の印刷(コストの変動はまったく関係がないn
ため、本質的に一定)とテストを実行します。テストは約半分の時間で成功するため、2回目の印刷のコストが頻繁に発生します。
したがって、総コストは次のようになります。
cost of setting up everything +
n × cost of looping +
(n - 1) × cost of loop +
(n × (n - 1)) × cost of print +
(n × (n - 1)) × cost of test +
(n × (n - 1)) / 2 × cost of print.
上記の定数に値を割り当てると、次のようになります。
k +
n × a +
(n - 1) × b +
(n × (n - 1)) × c +
(n × (n - 1)) × d +
(n × (n - 1)) / 2 × e.
=
k +
n × a +
(n - 1) × b +
(n × (n - 1)) × (c + d + (e / 2))
さて、c + d + e / 2
はそれ自体が一定なので、次のようになります。
n × a + (n - 1) × b + (n × (n - 1)) × c + k
または、最初に上位順に並べ替えるには、次のようにします。
(n × (n - 1)) × c + (n - 1) × b + n × a + k
nが十分に高い場合、nはn-1に比例して非常に近いため、同じと見なすことができます(時間計算量の別の側面では、nが∞に近づくため、 n²と(n×(n-1))の差は0)に近づきます。したがって:
n² × c + n × b + n × a = n² × c + n × (b + a) + k
繰り返しますが、b + aはそれ自体が定数であるため、次のようになります。
n² × k + n × c + a
そして今、私たちは、気にかけている、より低い時間の注文を吸収することについて前述したことをします、気n × c
にしないでください?nが私たちがまったく気にするのに十分高い場合、それはすべて約n²
です。比較すると、全体的なオーバーヘッドとの違いをノイズと見なし、次のように扱うことができます。
n² × k + c
または、言い換えると、次のようになります。
O(n²)
そうです、そもそもあなたはそれを強打していました、そしてifステートメントは複雑さに影響を与えません。
これを考慮すると、時間の複雑さが私たちが本当に気にかけていることを隠す可能性があることに注意することができます。たとえば、O(n²)アルゴリズムがあり、この種の分析で、時間コストn² × k + n × c
kが200µs、cが15sであることがわかった場合、nが750000を超えるまで、実際にはnビットあたりのコストになります。 n²ごとのビットではなく。nが低いほど、O(n²)よりもO(n)に期待する値に近くなります。
時間計算量が有用である理由は、非常に大きな視差がまれであり、時間、したがって時間計算量について、nが高くなるとより多くなることの組み合わせです(恐ろしいO(n!)の怪物を隠すことができます)あなたが青い月に一度呼び出すあなたのコードでは、3つの要素があり、気にしないでください)。したがって、実際の改善をもたらすには、理想的には時間計算量を減らすか、失敗すると最高レベルの定数kが減ります(つまり、n²回ではなくn log n回実行できる場合は、それ以外の場合は実行します)。他のことをn回行うのではなく、n²回行うことのコストを削減します)。
言い換えれば、それは私たちが通常マットなものに集中するのに役立ちます。