我有这样的代码:
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)。
这一切都正确吗?
答案 0 :(得分:0)
您导出的复杂性是正确的,但是您的等式中有两个错误,表示循环运行的次数:
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= i; j++)
{
f(); // constant operation
}
}
包含范围n + 1
到0
中有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
无关紧要。