Java 空for循环的复杂性是什么?
我想知道下面这样的空for循环的复杂性是否仍然是O(n^2)Java 空for循环的复杂性是什么?,java,algorithm,Java,Algorithm,我想知道下面这样的空for循环的复杂性是否仍然是O(n^2) for(int i=0;i
for(int i=0;i
更新:将高度和宽度变量更改为n如果编译器无法对其进行优化,复杂性仍然是O(n^2)(或者实际上是O(n*M))-即使循环体为空,两个计数器的条件检查和增量仍然是必须执行的有效操作。请注意,你可以做除i++以外的事情,例如fun(i) 从
1.运行的任何for循环的复杂性。。n
是O(n)
,即使它内部没有做任何事情。所以在你的例子中,不管你在循环中做什么,它总是O(n^2)
在您的示例中,
i
和j
一直运行到n
,因此根据我对算法时间复杂度的理解,分别取决于n
的值,使嵌套for循环的复杂度为O(n^2)
,我们假设有一个或多个基本操作。使用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
}
inti=0,j=0;
而(i
现在,如果您的目标是执行'nop'n^2次,那么时间复杂度是O(0),其中'nop'是基本操作。然而,如果目标是将2个计数器('i'和'j')从0迭代到n-1或计数n^2次,则基本运算可以是加法(j+1和i+1)、比较(i
因此,当O(n^2)可能小于O(1)时,您的循环将执行O(1)n次的恒定功,因此nO(1)=O(n)O(1)=O(n) 外部环路执行上述O(n)功n次,因此nO(n)=O(n)O(n)=O(n^2) 一般而言:``
- f(n)∈ O(f(n))
- cf(n)∈ O(f(n))如果c是常数
- f(n)g(n)∈ O(f(n)g(n))
O(n)
,其中n
是循环的数量,即使循环中没有任务
但是,对于某些编译器,编译器会优化循环,并且不会迭代n次。在这种情况下,复杂性是O(1)
对于上面提到的循环,它既是
O(n)
又是O(n^2)
。但是,最好编写O(n^2)
,因为大O覆盖了上界。循环不是空的。计数器正在增加。复杂性是一个相当理论化的概念,这是一个相当反常的代码。最好不要太担心它。该代码不是O(n^2)。复杂性是O(高度*宽度)。默默地修改问题不是最好的主意。它使现有答案变得奇怪。@YvesDaoust notedb但智能编译器可以设置i=height-1;j=宽度-1
,并用它完成。否O(n^2)
。@HighPerformanceMark智能编译器不会什么都不输出吗?@HighPerformanceMark:或者干脆跳过,因为变量在循环的范围内不存在。是的,我的注释中的注释者。这个答案仍然有3张赞成票。@HighPerformanceMark他们说“如果编译器不能优化它”,所以它是正确的,这更有趣。:-)好的。。。哈哈
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
}