私はこのようなループを持っています:
for(int i = 0; i < n; i++) {
for(int j = 0; j < i; j++) {
sum += 1;
}
}
O(n *)ですが、j <iループが何であるかわかりません。
実行したテストがいくつかありますが、
n = 10, runs = 45
n = 20, runs = 190
n = 40, runs = 780
n = 80, runs = 3160
n = 10, runs = 12720
.5 * n ^ 2に収束しているようですが、よくわかりません。
1からnまでの数値を合計し、そのたびに値を1ずつ増やします。これは基本的には古典的な ガウス合計 です。
sum(1 .. n) = (n * n-1)/2
これはたまたまループを通過する回数でもあります。
(n^2 - n) / 2
(n^2)/2 - n/2
Big O を表す場合、最高のパワーを持つ項のみが使用され、定数は破棄されるため、答えはO(n2)。
この特定の問題の詳細については、 CS.SEBig O:Nested For Loop With Dependence を参照してください。==
外部ループの最初の反復(i = 0)では、内部ループが0回反復します(外部ループの2回目の反復(i = 1)、内部ループでは、3回目の反復で1回反復します) (i = 2)、内部ループは2回繰り返されます
。
。
外部ループの最終的な反復(i == n-1)では、内部ループがn-1回繰り返されます
したがって、内部ループ内のステートメントが実行される合計回数は、1からnまでの整数の合計と等しくなります。つまり、次のとおりです。
((n ‐ 1)*n) / 2 = (n^2)/2 ‐ n/2 = O(n^2) times