嵌套for循环的大时间复杂性

时间:2010-06-20 17:20:34

标签: big-o

我在这里有一个问题,循环是:

for (i=0; i < n; ++i)
   for (j = 3; j < n; ++j)
           {
            ...
           }

我有点理解如何计算大哦但是我不完全确定如何去做。外循环执行n次,内循环对i的每个值执行i次。复杂性应该是N ^ 2(我认为)。你们能详细说明这是如何计算的吗?我理解其中的一部分,但不是全部。

6 个答案:

答案 0 :(得分:9)

它是(n*(n-3)) = n²-3n,对于非常大的n,它接近。因此,对于Big-Oh表示法,我会写O(n²),因为可以忽略-3n


只是对问题中的测试进行了更正:外部循环执行n次,外部循环上每次迭代的内部(n-3)次。

答案 1 :(得分:4)

复杂性不一定是O(n ^ 2)。它实际上取决于“......”中发生的事情。如果内循环中的东西具有O(1)复杂度,则是,整体复杂度为O(n ^ 2)。 原因是因为在外循环的任何迭代中,你都有内循环的n-3次迭代。内循环的每次迭代都有1个主体的执行,我们假设它是O(1)。所以,你最终得到身体的n *(n-3)次执行。如果我们假设主体是O(1),那么整个事物的复杂性就是O(n *(n-3))= O(n ^ 2)。

答案 2 :(得分:1)

记住Crom所说的:它取决于省略号中的内容。我可能会滥用这种符号,但我认为你可以说这是 O(mn 2 ,其中 m 是一个限制的函数省略号中任何内容的增长(它可能与 n 有关,但我们不知道这一点。)

您没有具体询问此部分,但请确保您清楚 n 2 - 3n O(n 2 。看看big-O的定义,它说 n 2 - 3n≤cn 2 ,其中 c 是我们选择的常数。当 c = 2 时,我们可以重写为 n 2 - 3n≤n 2 + n 2 ,这显然是正确的。

答案 3 :(得分:1)

通常,嵌套for循环的构造是O(n ^ 2),但也有一些例外。在计算机图形学中,通常会看到如下内容:

for (int x=0; x < width; x++) {
  for (int y=0; y < height; y++) {
    // Do something on a specific pixel in the image in constant time
  }
}

并且在O(n ^ 2)上看到它被称为O(n),因为假设n是某些上下文中的像素数,而不是图像的线性大小。因此,“n ^ 2”已被考虑在内。可能存在其他特定于域的上下文,其中“n”的接受定义可能不会立即从查看代码中立即显现出来。

答案 4 :(得分:0)

感谢回复,我现在可以看到内部循环执行n-3次,因为j从3开始。外部循环像往常一样执行n次。对于那些我把问题写得不好而感到困惑的人来说,问题是如何给出的。我三重检查,它正是我写它的方式。非常感谢您的帮助!

答案 5 :(得分:0)

形式上,您可以使用Sigma Notation获取确切的迭代次数,从而确定增长的顺序。

enter image description here