web-dev-qa-db-ja.com

なぜ計算量はO(n ^ 4)ですか?

int sum = 0;
for(int i = 1; i < n; i++) {
    for(int j = 1; j < i * i; j++) {
        if(j % i == 0) {
            for(int k = 0; k < j; k++) {
                sum++;
            }
        }
    }
}

J = i、2i、3iの場合、最後のforループがn回実行される方法がわかりません。 ifステートメントに基づいてどのようにしてその結論に至ったのか、私には理解できないと思います。

編集:最後のループがmod演算子に基づいてi回実行される理由を除いて、すべてのループの複雑さを計算する方法を知っています...基本的に、なぜjではなく、i * iにできないのですか?

51
user11452926

最初の2つのループを見てみましょう。

最初のものは単純で、1からnまでループします。 2つ目はより興味深いものです。 1から2乗します。いくつかの例を見てみましょう:

_e.g. n = 4    
i = 1  
j loops from 1 to 1^2  
i = 2  
j loops from 1 to 2^2  
i = 3  
j loops from 1 to 3^2  
_

合計すると、_i and j loops_の合計は_1^2 + 2^2 + 3^2_になります。
最初のn平方の合計n * (n+1) * (2n + 1) / 6の式があり、これはおおよそO(n^3)です。

_k loop_の場合に限り、最後の_j % i == 0_が0からjにループします。 jは1から_i^2_に変わるため、i回にわたって_j % i == 0_がtrueになります。 _i loop_はnを反復処理するため、O(n)が1つ追加されます。

つまり、_i and j loops_からのO(n^3)と_k loop_からの別のO(n)があり、合計でO(n^4)になります。

0
Silviu Burcea