嵌套循环的大O(int j = 0; j <i * i; ++ j)

时间:2020-01-23 06:13:09

标签: time-complexity big-o

问题1

for (i = 0; i < n; i++) {
  for (j = 0; j < i * i ; j++){

  }
}
Answer: O(n^3)

乍看之下,O(n ^ 3)对我来说很有意义,但我记得我以前做过的一个问题:

问题2

for (int i = n; i > 0; i /= 2) {
   for (int j = 0; j < i; j++) {
     //statement
   }
}
Answer: O(n)

对于问题2,外循环为O(log n),内循环为O(2n / log n),得出O(n)。内部循环为O(2n / log n),因为-参见此处的说明:Big O of Nested Loop (int j = 0; j < i; j++)


为什么我们不像问题2那样做问题1,因为在问题1中,j也取决于i,这意味着我们实际上应该取内部迭代次数的平均值。循环(就像我们在问题2中一样)。

我的答案是:外循环为O(n),内循环为O(n ^ 2 / n),这导致问题1的O(n ^ 2)。

3 个答案:

答案 0 :(得分:2)

您的回答是错误的。代码是Θ(n³)

要注意的是,内部循环最多执行步骤,但对于外部循环来说,迭代的一半至少为(n/2)² = n²/4

因此,内部迭代的总数最多为n * n² = n³,但至少为n/2 * n²/4 = n³/8


您的考虑是错误的,因为内部循环平均与多次迭代成正比,而不是n² / n

答案 1 :(得分:1)

内部for循环与外部for循环一起正在执行的操作是计算i^2的总和。如果写出来,您将添加以下术语:

1 + 4 + 9 + 16 + ...

The result of that(2n^3+3n^2+n)/6。如果要计算内部for循环的迭代次数的平均值,则将其除以n,因为这是外部for循环的迭代数。因此,按照Big O表示法,您将得到(2n^2+3n+1)/6。有了它,您什么​​都没有。您尚未获得任何新信息,因为您已经知道内部O(n^2)循环的复杂性为forO(n^2)运行O(n^2)次使您n的总体复杂性,您已经知道...

因此,您可以计算内部O(n^3)循环的平均值迭代次数,但不会获得任何新信息。重复步骤的数量没有您上一个问题(for的内容)减少。

答案 2 :(得分:0)

void fun(int n, int k) 
{ 
    for (int i=1; i<=n; i++) 
    { 
      int p = pow(i, k);  
      for (int j=1; j<=p; j++) 
      { 
          // Some O(1) work 
      } 
    } 
} 

上述功能的时间复杂度可以写为1k + 2k + 3k +…n1k。

在您的情况下,k = 2

Sum = 12 + 22 + 32 + ... n12.
    = n(n+1)(2n+1)/6
    = n3/3 + n2/2 + n/6