考虑代码:
void foo(int n){
int s = 0;
for (i=1; i<=n; i++)
for(j=1;j<=i*i;j++)
if (j % i == 0){
for (k=1; k<=j; k++)
s++;
}
}
我们如何计算具有三个嵌套依赖循环的上述代码段的时间复杂度?
我想
i
将持续到n,
j
直到我 2 或n 2 ,
k
直到j
或n 2 。
因此,根据我,时间复杂度应为O(n * n 2 * n 2 )或O(n 5 )。但我知道它的O(n 4 )。我哪里错了?
答案 0 :(得分:1)
这一行: if(j%i == 0) 正在发挥作用。 例如,对于i = 3,j将运行9次。
和(j%i == 0)仅为3次。因此,k循环不会运行9次,而只会运行3次。
答案 1 :(得分:0)
只要j
是i
的倍数,就会执行最里面的循环。
在此循环中,j
将是i
,i
次的倍数。
现在我们考虑每次i
次迭代。只有i-1
次,我们才会进行if
检查。然后休息时间我们将运行内部循环ij
次(我们也进行了循环检查)。
i
次迭代的工作将是i+ij
。 j
与1..i
不同,因此ersult将为i^2+ (i^2*(i+1)/2)
。
现在,如果我们考虑外部循环,它将是i=1..n
Sum(i^2+ (i^2*(i+1)/2)) ~ O(n^4)
。