如何计算三个嵌套依赖循环的时间复杂度?

时间:2018-01-19 08:24:18

标签: algorithm time-complexity asymptotic-complexity

考虑代码:

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 )。我哪里错了?

2 个答案:

答案 0 :(得分:1)

这一行:     if(j%i == 0) 正在发挥作用。 例如,对于i = 3,j将运行9次。

和(j%i == 0)仅为3次。因此,k循环不会运行9次,而只会运行3次。

答案 1 :(得分:0)

只要ji的倍数,就会执行最里面的循环。 在此循环中,j将是ii次的倍数。

现在我们考虑每次i次迭代。只有i-1次,我们才会进行if检查。然后休息时间我们将运行内部循环ij次(我们也进行了循环检查)。

i次迭代的工作将是i+ijj1..i不同,因此ersult将为i^2+ (i^2*(i+1)/2)

现在,如果我们考虑外部循环,它将是i=1..n Sum(i^2+ (i^2*(i+1)/2)) ~ O(n^4)