Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 空for循环的复杂性是什么?_Java_Algorithm - Fatal编程技术网

Java 空for循环的复杂性是什么?

Java 空for循环的复杂性是什么?,java,algorithm,Java,Algorithm,我想知道下面这样的空for循环的复杂性是否仍然是O(n^2) for(int i=0;i

我想知道下面这样的空for循环的复杂性是否仍然是O(n^2)

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只是计算算法中步数的近似值。 我们可以在算法中得到精确的步数公式,但它们很复杂,很难实现实际的复杂性

1) O(0.000 000 001*n^2-1 000 000)=n^2

2) O(1 000*n)=n

尽管存在大O,但第一种情况较少,例如N=0..1 000 000

更重要的是,它没有考虑到特定步骤的速度


因此,当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
}