【问题标题】:Time Complexity for Modulus in Nested Loops嵌套循环中模的时间复杂度
【发布时间】:2021-05-24 18:13:36
【问题描述】:
sum=0;
for(i=1; i<n;i++)
for( j = 1; j < i * i; j++ )
if( j % i == 0 )
for( k = 0; k < j; k++ )
sum++;
我知道最外面的循环执行 n 次,下一个循环执行 n^2 次,但是我如何将 j%i 与循环分解?正确答案是 O(N^4),但我不确定如何达到。
【问题讨论】:
标签:
java
for-loop
big-o
mod
【解决方案1】:
由于我们知道k 循环仅在j 可被i 整除时执行(这是取模的地方),我们可以计算出k 在每个i 循环的次数循环:
-
i = 2, j:1..4:循环 2 次 (j=2)。
-
i = 3, j:1..9:循环 3 + 6 次 (j=3,6)。
-
i = 4, j:1..16:循环 4 + 8 + 12 次 (j=4,8,12)。
- ...
-
i = n, j:1..n*n:循环n + 2n + ... (n - 1) * n
- 或
Sum(k * n, k = 1, n - 1) = n^2 * (n - 1) / 2 次。
我意识到这应该停止在i = n - 1,但这足以显示增长。
这意味着我们的复杂性是
2 + (3 + 6) + (4 + 8 + 12) + ... + (n^2 * (n - 1) / 2)
=Sum(
i^2 * (i - 1) / 2,
i = 2, n - 1
)
=Sum(
(i^3 - i^2) / 2,
i = 2, n - 1
)
由于 i^3 占主导地位,除以 2 无关紧要,因此它的时间复杂度与
Sum(i^3, i=2, n - 1)
这是O(n^4)。