web-dev-qa-db-ja.com

ネストされたforループの時間の複雑さ

私はこのようなループを持っています:

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に収束しているようですが、よくわかりません。

3
Brandon

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 を参照してください。==

14
user40980

外部ループの最初の反復(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
0
user2831683