如何解决嵌套循环中模的时间复杂度
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),但我不确定这是如何达到的。
解决方法
既然我们知道 k
循环仅在 j
被 i
整除时才执行(这是模数的来源),我们可以计算出 {{1 }} 在每个 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,n - 1
)
项占主导地位并且除以 2 无关紧要,因此其时间复杂度与
i^3
哪个是 Sum(i^3,i=2,n - 1)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。