这个函数“循环”的复杂性/大O是多少

时间:2018-03-12 21:43:41

标签: c loops time-complexity big-o complexity-theory

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。那我在这里错过了什么?

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变小而变小大。