我想知道像下面这样的空for循环的复杂度是否仍然是 O(n ^ 2)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
}
}
update:将height和width变量更改为n
答案 0 :(得分:6)
如果编译器无法对其进行优化,则复杂度仍将为O(n ^ 2)(或实际上为O(N * M))-即使循环体为空,条件检查和递增这两个计数器中的仍然是必须执行的有效操作。
答案 1 :(得分:3)
从1 .. n
开始的任何for循环的复杂度为O(n)
,即使它在其中没有做任何事情。因此,无论您在循环内做什么,在您的情况下,总是要O(n^2)
。
在您的示例中i
和j
一直运行到n
,因此分别取决于n
的值,使得嵌套的for循环的复杂度为{ {1}}
答案 2 :(得分:0)
请注意,除了i ++,您还可以做其他事情,例如乐趣(i)。
答案 3 :(得分:0)
基于我对算法时间复杂度的理解,我们假设存在一个或多个基本运算。使用while循环重新编写代码并扩展逻辑:
int i = 0, j = 0;
while(i < n)
{
while(j < n)
{
; //nop or no-operation
j = j + 1; // let jInc be alias for j + 1
}
i = i + 1; // let iInc be alias for i + 1
}
现在,如果您的目标是执行n次“ nop” n ^ 2次,则时间复杂度为O(0),其中“ nop”是基本操作。但是,如果目标是将2个计数器(“ i”和“ j”)从0迭代到n -1或计数n ^ 2次,则基本操作可以是加法运算(j + 1和i + 1),比较( i
答案 4 :(得分:0)
Big O只是评估算法中步数的近似值。 我们可以为算法中的步数提供精确的公式,但是它们很复杂并且难以实现实际的复杂性。
1)O(0.000 000001 * n ^ 2-1 000000000)= n ^ 2
2)O(1 000000000 * n)= n
尽管大O的第一种情况较少,例如N = 0..1 000 000
此外,它没有考虑特定步骤的速度。
因此,您的循环是O(n ^ 2)小于O(1)
的情况答案 5 :(得分:0)
嵌套循环执行常量O(1)n次,因此nO(1)= O(n)O(1)= O(n)。
外部循环执行上述O(n)次n次,因此nO(n)= O(n)O(n)= O(n ^ 2)。
一般来说:
答案 6 :(得分:0)
这取决于编译器。
从理论上讲,它是O(n)
,其中n
是循环数,即使循环中没有任务也是如此。
但是,对于某些编译器,编译器会优化循环,并且不会迭代n次。在这种情况下,复杂度为O(1)
。
对于上述循环,它既是O(n)
和O(n^2)
。但是,最好将O(n^2)
写为 Big O 覆盖上限。