嵌套for循环的时间复杂度

时间:2009-02-09 00:05:06

标签: big-o complexity-theory time-complexity

我需要计算以下代码的时间复杂度:

for (i = 1; i <= n; i++)
{
  for(j = 1; j <= i; j++)
  {
   // Some code
  }
}

O(n ^ 2)

7 个答案:

答案 0 :(得分:42)

是的,嵌套循环是快速获得大O符号的一种方法。

通常(但不总是)一个嵌套在另一个循环中的循环将导致O(n²)。

考虑一下,内部循环执行i次,执行i 的每个值。 外循环执行n次。

因此你会看到这样的执行模式: 1 + 2 + 3 + 4 + ... + n次

因此,我们可以通过声明它执行的次数超过n次(下限)来约束代码执行次数,但就n而言,我们执行代码的次数是多少次?

嗯,从数学角度来说,我们可以说它的执行时间不会超过n²次,这给我们带来了最糟糕的情况,因此我们的O(n²)的Big-Oh界限也是如此。 (有关我们如何以数学方式说明Power Series

的更多信息

Big-Oh并不总是能够确切地测量完成了多少工作,但通常会给出最坏情况下的可靠近似值。


4年后编辑:因为这篇文章似乎获得了相当多的流量。我想更全面地解释如何使用幂级列

将执行限制为O(n²)

从网站:1 + 2 + 3 + 4 ... + n =(n²+ n)/ 2 =n²/ 2 + n / 2。那我们怎么把它变成O(n²)?我们(基本上)说的是n 2> = n 2/2 + n / 2。这是真的?我们来做一些简单的代数。

  • 将两边乘以2得到:2n²> =n²+ n?
  • 展开2n²得到:n 2 + n 2> = n 2 + n?
  • 从两侧减去n²得到:n²> = n?

应该清楚的是,n 2> = n(由于n = 0或1的情况,不严格地大于n),假设n总是一个整数。

实际的Big O复杂性与我刚才所说的略有不同,但这是它的要点。实际上,Big O复杂性会询问是否有一个常量我们可以应用于一个函数,使得它比另一个函数更大,对于足够大的输入(参见wikipedia页面)

答案 1 :(得分:23)

解释这一点的一种快速方法是将其可视化。

如果i和j都是从0到N,则很容易看到O(N ^ 2)

O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O

在这种情况下,它是:

O
O O
O O O
O O O O
O O O O O
O O O O O O
O O O O O O O
O O O O O O O O

这是N ^ 2的1/2,仍然是O(N ^ 2)

答案 2 :(得分:9)

实际上,它是O(n ^ 2)。另请参见具有相同运行时here的非常相似的示例。

答案 3 :(得分:0)

首先,我们考虑循环,其中内循环的迭代次数与外循环索引的值无关。例如:

 for (i = 0; i < N; i++) {
     for (j = 0; j < M; j++) {
         sequence of statements
      }
  }

外循环执行N次。每次外循环执行时,内循环执行M次。结果,内循环中的语句总共执行N * M次。因此,两个循环的总复杂度是O(N2)。

答案 4 :(得分:0)

在外环(I = 1)的第一迭代中,内环将迭代1次 在外环(I = 2)的第二迭代中,内环将迭代2时间 在外环(I = 3)的第三迭代中,内环将迭代的3倍


在外循环的最后一次迭代(i = n)时,内环将 迭代n次

所以,总次数在内部循环的语句将被执行 将等于所述整数的从1到n的总和,这是:

((n)*n) / 2 = (n^2)/2 = O(n^2) times 

答案 5 :(得分:0)

是的,时间复杂度为O(n ^ 2)。

答案 6 :(得分:0)

我认为最简单的思考方式是这样的:

外循环运行 n 次,对于 至少 n/2 次迭代,内循环运行 至少 n/2 次。因此,内循环迭代的总数至少为 n2/4。这是 O(n2)

同理,外循环运行n次,每次迭代,内循环最多运行n次。因此,内循环迭代的总数最多为 n2。这也是 O(n2).

相关问题