关于二次运行时间的澄清

时间:2018-01-21 16:13:51

标签: algorithm big-o

我有这样的代码:

for (int i = 0; i <= n; i++)
{
    for (int j = 0; j <= i; j++)
    {
        f(); // constant operation
    }
}

f执行的次数似乎是:

n + n +(n-1)+(n-2)+(n-3)+ ... + 2 + 1 + 0 =(n * n)-n = n ^ 2-n

如果我们删除低阶项(-n),则大O将为O(n ^ 2)。

这一切都正确吗?

1 个答案:

答案 0 :(得分:0)

您导出的复杂性是正确的,但是您的等式中有两个错误,表示循环运行的次数:

for (int i = 0; i <= n; i++)
{
    for (int j = 0; j <= i; j++)
    {
        f(); // constant operation
    }
}

包含范围n + 10中有n个不同的值,因此您的内部循环将运行i + 1次迭代。因此,您的公式应为:

(n + 1) + n + (n - 1) + ... + 1 + 0 = n(n + 1)/2 = (n^2 + n)/2

因为它是arithmetic series。这仍然是O(n^2),因为n^2的增长速度比n快,而常数1/2无关紧要。