外环为O(n),第二环为O(n ^ 2),第三环也为O(n ^ 2),但第三环是有条件的。
这是否意味着第三次循环仅发生1 / n次(每n次1次),因此总的大O为O(n ^ 4)?
for (int i = 1; i < n; i++) {
for (int j = 1; j < (n*n); j++) {
if (j % i == 0) {
for (int k = 1; k < (n*n); k++) {
// Simple computation
}
}
}
}
答案 0 :(得分:3)
对于介于1和 n 之间的任何给定值 i ,这部分的复杂性:
for (int j = 1; j < (n*n); j++) {
if (j % i == 0) {
for (int k = 1; k < (n*n); k++) {
// Simple computation
}
}
}
是 O ( n 4 / i ),因为{ {1}}-条件在时间的第 i 次为真。 (请注意:如果 i 可以大于 n ,那么我们需要编写 O ( n 4 / i + n 2 )以包含循环迭代的成本,其中if
条件为假;但由于已知 i 足够小,因此 n 4 / i ≥ n 2 ,我们不必为此担心。)
因此,将 i 的所有值上不同的循环迭代加在一起的代码总复杂度为 O ( n 4 / 1 + n 4 / 2 + n 4 / 3 +⋯+ n 4 / n )́ = O ( n < sup> 4 ·(( 1 / 1 ++ 1 / 2 + 1 < / sup> / 3 +⋯+ 1 / n )))= O < / em>( n 4 log n )。
(最后一点依赖于这样的事实,因为ln( n )是 1 / x < / sub>从1到 n ,并且 1 / x 在该间隔内减小,我们有ln( n )<< ln( n +1)<((sup> 1 / 1 ++ sup> 1 / 2 + 1 / 3 +⋯+ 1 / n )<< 1 + ln( n )。)