如何确定这个c程序的时间复杂度

时间:2013-02-28 15:43:55

标签: c algorithm time-complexity

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;
}

如何使用此处http://pages.cs.wisc.edu/~vernon/cs367/notes/3.COMPLEXITY.html#application之类的跟踪表来确定此程序的时间复杂度,而不是通过猜测?

2 个答案:

答案 0 :(得分:3)

对于每次迭代,最初您有x=i,然后x每次递减1/i。所以这将重复i/(1/i)==i^2次。

因此,对于for(i=1;i<n;++i)的每次迭代,内部部分的复杂度为O(i^2)。当i从1增加到n时,就像添加(1^2+2^2+3^2+...+n^2)一样,大致为n^3/6。因此它是O(n^3)


    Outer loop(for)          Inner Loop
    I=1                      1
    I=2                      4
    I=3                      9
    ...                      ..
    I=N                      N^2
 TOTAL_                      ~N^3/6

答案 1 :(得分:2)

这是相对简单的:您需要确定两个嵌套循环中每个循环执行的次数,并一起考虑复杂性。

外环是一个普通的for循环;它执行n次。

内循环需要更多注意:它会一直从1/i减去i,直到它变为零或变为负数。很容易看出,i循环的while次迭代需要从1中减去x。由于x最初设置为i,因此内循环所用的总时间为i^2

因此,xx之间1的总和为n平方。

Wolfram Alpha tells us that the answer to this is n*(n+1)*(2n+1)/6

这会扩展为n^3/3 + n^2/2 +n/6多项式,其复杂度为O(n^3)