このアルゴリズムの大規模な複雑さはO(n^2)
であることは知っていますが、その理由はわかりません。
int sum = 0;
int i = 1; j = n * n;
while (i++ < j--)
sum++;
最初にj = n * n
を設定していても、各反復中にiをインクリメントし、jをデクリメントします。そのため、結果の反復数はn*n
よりもずっと少ないはずではありませんか?
すべての反復中に、i
をインクリメントし、j
を2だけインクリメントするのと同じi
をデクリメントします。したがって、反復の総数はn ^ 2/2であり、それでもO(n ^ 2)。
big-Oの複雑さは係数を無視します。例:O(n)
、O(2n)
、およびO(1000n)
はすべて同じですO(n)
実行時間。同様に、O(n^2)
とO(0.5n^2)
は両方ともO(n^2)
実行時間です。
あなたの状況では、基本的に、ループを通るたびにループカウンターを2ずつ増やしています(_j--
_は_i++
_と同じ効果があるため)。したがって、実行時間はO(0.5n^2)
ですが、係数を削除するときはO(n^2)
と同じです。
正確に_n*n/2
_ループの繰り返しがあります(n
が奇数の場合は_(n*n-1)/2
_)。大きなO表記では、定数係数は「カウントしない」ためO((n*n-1)/2) = O(n*n/2) = O(n*n)
があります。
あなたのアルゴリズムは
_while (i += 2 < n*n)
...
_
これはO(n^2/2)
です。これはO(n^2)
と同じです。なぜなら、Oの大きな複雑さは定数を気にしないからです。
はい、このアルゴリズムはO(n ^ 2)です。
複雑さを計算するために、複雑さのテーブルがあります:
O(1) O(log n) O(n) O(n log n)
O(n²)O(n ^ a)O(a ^ n)O(n!)
各行はアルゴリズムのセットを表します。 O(1)にあるアルゴリズムのセット、O(n)、O(n ^ 2)などにもありますが、逆ではありません。したがって、アルゴリズムはn * n/2文を実現します。
O(n) < O(nlogn) < O(n*n/2) < O(n²)
したがって、アルゴリズムの複雑さを含むアルゴリズムのセットはO(n²)です。なぜなら、O(n)およびO(nlogn) 。
例:To n = 100、sum = 5000。=> 100 O(n) <200 O(n・logn)<5000(n * n/2)<10000(n ^ 2)
私の英語がすみません。
実行される反復回数をmとします。次に、
i + m = n ^ 2-m
与える
m =(n ^ 2-i)/ 2
Big-O表記では、これはO(n ^ 2)の複雑さを意味します。
最初にj = n * nを設定していても、各反復中にiをインクリメントし、jをデクリメントします。そのため、結果の反復数はn * nよりもはるかに少なくないはずです。
はい!それがO(n ^ 2)である理由です。同じロジックで、それはn * n * n
より小さいlotであり、O(n ^ 3)になります。同様のロジックにより、O(6 ^ n)でもあります。
big-Oは、上限に関する情報を提供します。
複雑さがなぜtheta(n)またはomega(n)なのかを尋ねようとしていると思いますが、big-Oとは何かを理解しようとしている場合は、本当にそれを理解する必要があります上限関数を何よりも優先します。