次のコードスニペットがあります。
sum = 0;
for (i = 0; i < n; i++)
for (j = 0; j < i; j++)
sum++;
複雑さはO(n^2)
ですが、内部ループの複雑さについてもう少し掘り下げたい場合は、それでしょう(n (n-1))/2
か(n-1)!
?
次のコードスニペットがあります。
sum = 0;
for (i = 0; i < n; i++)
for (j = 0; j < i; j++)
sum++;
複雑さはO(n^2)
ですが、内部ループの複雑さについてもう少し掘り下げたい場合は、それでしょう(n (n-1))/2
か(n-1)!
?
はい、O(n ^ 2)ですが、実際には0 + 1 + ... + n-1 = n(n-1)/ 2 = O(n ^ 2)であり、(n-1)ではありません。
time = n*(n-1)/2
= (n*n - n)/2
big-O表記は上限であるため、低次の項(-n)と定数係数(1/2)の両方が削除され(時間の上限を表すのに重要ではないため)、big- O表記、O(n*n)
よく知られていO(n^2)
ます。
時間内に実行されるアルゴリズムを持つことができます
22222222222222 + 4444444444444*n + 9999999999999999999999999*n^2 steps
そしてそれはまだO(n ^ 2)です。
Oよりもアルゴリズム実行時間のより良い説明を見つけることは未解決の問題です。
まず第一に、を(n-1)!
意味し(n-1)(n-2)...(2)(1)
ます。これは明らかにあなたがここで望んでいることではありません。
実際の反復回数を数えると、それは0 + 1 + 2 + ... + (n-2) + (n-1)
です。n
合計には項があり、各ペアの平均値がであるようにそれらをペアにすることができることに注意してください(n-1)/2
。(最高と最低、2番目に高いと2番目に低いなどをペアにします。)n
奇数の場合、ペアにできないものが残りますが、便利なことにその値も(n-1)/2
です。したがって、項があり、n
すべての項の平均は(n-1)/2
、であるため、合計はn(n-1)/2
です。
さて、大きなO表記の場合、反復回数は正確には関係ありませんn
。非常に大きい場合の制限を知りたいだけです。反復回数は。と書くことができることに注意してください(1/2)n^2 - (1/2)n
。非常に大きいn
場合、n^2
用語は方法であり、用語よりもはるかに大きいため、n
用語を削除しn
ます。それは私たちにを残すだけですが(1/2)n^2
、大きなO表記の別の規則は、定数係数を気にしないということです。したがって、それはO(n ^ 2)であると書くだけです。
big-O表記に関する限り、定数は関係ありません。
計算(n(n-1)/2)
したのは、コードの正確な反復回数です。Oが大きいかどうかという観点から時間計算量を求められた場合、かかった時間を表すのに十分な大きさの見積もりを出します。
言い換えると、いくつかの場合、正確な反復回数よりも大きくなるようなものを見つけるTHE SMALLEST
power
必要があります。あなたの場合、たまたまそうです。次に、時間の複雑さです。n
k (k>0)
k * n^power
k
1
power
2
O(n^power)