这是什么大事?
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)),但觉得我错在这里。
答案 0 :(得分:2)
这是一个令人困惑的分析,因此让我们将其一点一点地分解以使计算有意义:
最外面的循环运行n-1次迭代(因为1≤i
总的来说,这意味着这两个循环的迭代次数等于对每个1≤i 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