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にできないのですか?
最初の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)
になります。