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

Big o 嵌套for循环的时间复杂度,big-o,complexity-theory,time-complexity,Big O,Complexity Theory,Time Complexity,我需要计算以下代码的时间复杂度: for (i = 1; i <= n; i++) { for(j = 1; j <= i; j++) { // Some code } } for(i=1;i的确,它是O(n^2)。另请参见一个具有相同运行时的非常类似的示例。是的,嵌套循环是快速获得大O表示法的一种方法 通常(但并非总是)一个循环嵌套在另一个循环中会导致O(n²) 想想看,对于i的每个值,内部循环执行i次。 外部循环执行n次 因此,您可以看到这样的执行模式: 1+

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

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

for(i=1;i的确,它是O(n^2)。另请参见一个具有相同运行时的非常类似的示例。

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

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

想想看,对于i的每个值,内部循环执行i次。 外部循环执行n次

因此,您可以看到这样的执行模式: 1+2+3+4+…+n次

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

从数学上讲,我们可以说它的执行次数不超过n²,这给了我们一个最坏的情况,因此我们得到了O(n²)的大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=0或1的情况,严格来说不大于),假设n始终是一个整数


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

首先考虑循环内循环的次数与外环索引的值无关,例如:

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

外部循环执行N次。每次外部循环执行,内部循环执行M次。因此,内部循环中的语句总共执行N*M次。因此,两个循环的总复杂性为O(N2)。

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

如果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

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

在外循环(i=1)的第一次迭代中,内循环将迭代1次 在外循环(i=2)的第二次迭代中,内循环将迭代2次 在外循环的第三次迭代(i=3)中,内循环将迭代3次


在外循环(i=n)的最终迭代中,内循环将 迭代n次

因此,内部循环中的语句将被执行的总次数 将等于从1到n的整数之和,即:

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

是的,这个问题的时间复杂度是O(n^2)。

我认为最简单的思考方法是:

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


类似地,外循环运行n次,而在每次迭代中,内循环最多运行n次。因此,内循环迭代的总数最多为n2。也就是O(n2).

我的问题的副本与您链接的问题并不完全相同,但这是一个常见的问题,所以我猜它有多种形式。相关:这回答了您的问题吗?感谢您最终帮助我理解了内部循环是如何遵循摩尔定律的,我们可以假设算法的执行速度大约每秒钟翻一番18个月。因此,在分析算法时,我们可以降低系数,只关注n的算法。基本上O(n^2)将取O(1/2 n^2)在18个月内。随着n的增长,运行时间呈指数增长,而对于线性时间算法,它随着n的增长而增长。所以,你的意思是,当计算大Oh符号时,1/2乘1/2(n^2)是不重要的,部分原因是系数随着时间的推移变得不相关?这个术语的重要部分——同样,在大Oh方面——是二次型的,而不是二次型的减半?是的,没错。而且运行时间呈指数增长。当数据从100点到10000到10000000点时,您的算法无法使用,因为运行时无法随输入进行缩放。我可以在这里问一个小问题吗?如果“//some code”部分是带有O(N)的计算怎么办复杂性,结果是如何计算的?我认为这是一个函数调用另一个函数并将后者视为具有规范提供的某种复杂性的黑盒的常见情况?@ShawnLe:深刻的观察。在大多数假设中,是的,我们假设
//某些代码
是O(1),因此不会被分解成大的O复杂度。如果它实际上是O(N),那么我们的整体复杂度就变成了O(N^3)。把它想象成乘法(因为它是)。对于~N个外循环迭代,内循环迭代~N次,每次迭代执行~N个工作。N次N次N=N^3。不要忘记堆化是两个嵌套循环(在构建堆时),但它是O(N)。你能将证明写入N*M=N^2吗?以帮助更好地理解它。
((n)*n) / 2 = (n^2)/2 = O(n^2) times