Warm tip: This article is reproduced from serverfault.com, please click

big o-嵌套for循环的时间复杂度

(big o - Time complexity of nested for-loop)

发布于 2009-02-09 00:05:05

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

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

O(n ^ 2)吗?

Questioner
yyy
Viewed
1
66.5k 2018-04-11 03:35:33

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

通常(但并非总是如此),一个循环嵌套在另一个循环中会导致O(n²)。

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

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

因此,我们可以说代码执行次数超过n次(下限)来限制代码执行的次数,但是就n而言,我们执行代码多少次?

好吧,在数学上我们可以说它将执行不超过n²次,这给了我们最坏的情况,因此我们的O(n²)的Big-Oh边界。(有关我们如何用数学的眼光看待幂级数的更多信息

Big-Oh并不总是准确地衡量要完成的工作量,但通常会给出最坏情况的可靠估计。


4年后编辑:因为此帖子似乎获得了大量访问量。我想更全面地说明我们如何使用幂级数将执行绑定到O(n²)

从网站上:1 + 2 + 3 + 4 ... + n =(n²+ n)/ 2 =n²/ 2 + n / 2。那么,如何将其转换为O(n²)?我们(基本上)在说的是n²> =n²/ 2 + n / 2。这是真的?让我们做一些简单的代数。

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

应该清楚的是,假设n始终是整数,则n²> = n(由于n = 0或1的情况,所以不严格大于n)。

Big O的实际复杂度与我刚才所说的略有不同,但这就是要点。实际上,对于具有足够大的输入量,Big O复杂性询问是否可以将一个常数应用到一个函数,使其大于另一个函数(请参见Wikipedia页面)