empty for循环的复杂性是什么?

时间:2018-11-02 16:36:47

标签: java algorithm

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

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

update:将height和width变量更改为n

7 个答案:

答案 0 :(得分:6)

如果编译器无法对其进行优化,则复杂度仍将为O(n ^ 2)(或实际上为O(N * M))-即使循环体为空,条件检查和递增这两个计数器中的仍然是必须执行的有效操作。

答案 1 :(得分:3)

1 .. n开始的任何for循环的复杂度为O(n),即使它在其中没有做任何事情。因此,无论您在循环内做什么,在您的情况下,总是要O(n^2)

在您的示例中ij一直运行到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)。

一般来说:

  • f(n)∈O(f(n))
  • cf(n)∈O(f(n))如果c为常数
  • f(n)g(n)∈O(f(n)g(n))

答案 6 :(得分:0)

这取决于编译器。 从理论上讲,它是O(n),其中n是循环数,即使循环中没有任务也是如此。

但是,对于某些编译器,编译器会优化循环,并且不会迭代n次。在这种情况下,复杂度为O(1)

对于上述循环,它既是O(n)O(n^2)。但是,最好将O(n^2)写为 Big O 覆盖上限。