void mystery2 (int n)
{
int i;
for (i = 1; i <= n; i++) {
double x = i;
double delta = 1 / (double)i;
while ( x > 0 )
x -= delta;
}
return 0;
}
为什么是BIG O,这个函数的时间复杂度是O(n ^ 3)而不是O(n ^ 2)?
我做的是当i = 1 ==&gt; 1次迭代,i = 2 ==&gt; 2个(同时)i = 3 ==&gt; 3次迭代........ i = n ==&gt; n迭代,如果我们总结所有迭代,我们得到1 + 2 + 3 + 4 .... + n = n *(n + 1)/ 2。那我在这里错过了什么?
答案 0 :(得分:5)
这是因为内部循环像这样运行。
For i=1, inner loop runs 1 time,
For i=2, inner loop runs 4 time,
//because x=2 and delta=0.5 so for x to become 0 it has to iterate 4 time
For i=3, inner loop runs 9 time
//because x=3 and delta=0.33 so for x to become 0 it has to iterate 9(atleast) time
and so on..
所以内循环运行i^2
时间,等式变为1^2+2^2+3^2+...+n^2=n(n+1)(2n+1)/6
,等于O(n ^ 3)复杂度。
答案 1 :(得分:1)
我认为你把它看作一个标准的整数递减循环,我最初也做了,但是这个数字是双精度的,delta
不是1
但实际上是1 / (double)i
,因此完全递减x
所需的内循环迭代次数不会随着n
的增加而线性增加,但会更加明显,因为delta
会随n
变小而变小大。