什么是嵌套循环的Big-Oh i = 0..n-2,j = i + 1..n-1?

时间:2013-05-27 09:53:23

标签: algorithm big-o

给出以下代码:

for (int i = 0; i < n-1; ++i)
{
    for (int j = i+1; j < n; ++j)
    {
        // Do work.
    }
}

它的Big-Oh值是多少(超过n)?我认为这是O(N ^ 2),但我不确定。

我在这里找到了类似的问题:complexity for nested loops

但我认为它并不完全相同。

3 个答案:

答案 0 :(得分:3)

应该可以这样检查。

int z = 0, n = 10; // try 20 etc
for (int i = 0; i < n-1; ++i)
{
    for (int j = i+1; j < n; ++j)
    {
        z++;
    }
}

现在,检查z的值。

With n = 10; z becomes 45
With n = 20; z becomes 190
With n = 40; z becomes 780

n 加倍导致 z 变为其值的4倍。因此,它约为O(n^2)

答案 1 :(得分:3)

是的,那是O(N^2)。在外循环的开头和结尾配对内循环的迭代,如下所示:

内循环将执行...

    在外循环的第一次迭代中
  • N-1次,在最后一次迭代中1
  • 在外循环的第二次迭代中
  • N-2次,在倒数第二次迭代中2
  • 在外循环的第三次迭代中
  • N-3次,在第三次到最后一次迭代时3
  • ......等等;你会有N/2对这样的人;当N为奇数时,最后一对不完整。

您可以看到每个对共执行N次,并且您有N/2个这样的对,总共N*(N-1)/2次。

公式的派生方式来自derivation of the formula for the sum of arithmetic progression,共同点1

答案 2 :(得分:0)

有条不紊地,使用Sigma表示法(经验验证),您可以获得确切的迭代次数加上增长复杂度的顺序:

enter image description here