给出以下代码:
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
但我认为它并不完全相同。
答案 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表示法(经验验证),您可以获得确切的迭代次数加上增长复杂度的顺序: