大O这三重嵌套循环?

时间:2019-01-31 06:46:26

标签: algorithm big-o

这是什么大事?

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++) {
                // Simple computation
            }
        }
    }
}

真的不能弄清楚。倾向于说为O(n ^ 4的log(n)),但觉得我错在这里。

2 个答案:

答案 0 :(得分:2)

这是一个令人困惑的分析,因此让我们将其一点一点地分解以使计算有意义:

最外面的循环运行n-1次迭代(因为1≤i 内部循环的下一个循环为外部循环的每个索引 i 进行(i²-1)迭代(因为1≤j

总的来说,这意味着这两个循环的迭代次数等于对每个1≤i computing the sum of the first n squares,并且是O(n³)的数量级。 注意取模运算符%需要花费恒定时间(O(1))来计算,因此,检查这两个循环的所有迭代的条件if (j % i == 0)不会影响O(n³)的运行时间。

现在让我们讨论条件内部的内部循环。
我们感兴趣的是查看条件条件为true时此次数(以及j的值),因为这将指示最内部的循环将运行多少次迭代。 实际上,如果j 注意,对于给定的数i,当且仅当i是j的除数时,(j%i == 0)。由于我们的范围是(1≤j 如果这令人困惑,请考虑以下示例:

让我们假设i =4。然后我们的索引j将遍历所有值1,..,15 =i², 和(j%i == 0)对于j = 4、8、12-恰好是(i-1)值是正确的。 因此,最里面的循环总共进行(12 + 8 + 4 = 24)次迭代。
因此,对于一般索引i,我们将求和:i + 2i + 3i + ... +(i-1)i,以指示最内层循环将进行的迭代次数。

这可以通过计算该算术级数的总和来概括。第一个值是i,最后一个值是(i-1)i,对于每个i值,k循环的(i³-i²)/ 2次迭代之和。反过来,可以通过计算立方和和平方和来计算所有i值的总和。-最内层循环的O(n⁴)次迭代的总运行时间( k循环)用于i的所有值。

因此,总的来说,该算法的运行时间将是我们上面计算的两个运行时间的总和。我们检查了if语句O(n³)次,并且最里面的循环运行了O(n inner),因此,假设// Simple computation在恒定时间内运行,我们的总运行时间将降为:

O(n³)+ O(n⁴)* O(1)= O(n⁴)

答案 1 :(得分:0)

让我们假设I = 2.然后J的特征可以[1,2,3] .The “K” 循环将对于j = 2只运行。 类似地,对于I = 3,J可以是[1,2,3,4,5,6,7,8] .hence中,k可以对于j = 3,6运行。您可以在此处看到一个模式,对于任何i值,'k'循环将运行(i-1)次。循环的长度将为[i,2 * i,3 * i,.... i * i]中。

因此k循环的时间复杂度是

  

= I +(2 * I)+(3 * I)+ ..... +(I * I)

     

=(i ^ 2)(i + 1)/ 2

因此,最终的复杂性将是

  

=(n ^ 3)(n + 3)/ 2