我在这里有一个问题,循环是:
for (i=0; i < n; ++i)
for (j = 3; j < n; ++j)
{
...
}
我有点理解如何计算大哦但是我不完全确定如何去做。外循环执行n次,内循环对i的每个值执行i次。复杂性应该是N ^ 2(我认为)。你们能详细说明这是如何计算的吗?我理解其中的一部分,但不是全部。
答案 0 :(得分:9)
它是(n*(n-3)) = n²-3n
,对于非常大的n
,它接近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获取确切的迭代次数,从而确定增长的顺序。