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之类的跟踪表来确定此程序的时间复杂度,而不是通过猜测?
答案 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
。
因此,x
与x
之间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)
。