我在期中遇到了这个问题而且我不确定我的答案,这是O(n ^ 2)我想要答案和解释,谢谢。
int recursiveFun1(int n)
{ for(i=0;i<n;i+=1)
do something;
if (n <= 0)
return 1;
else
return 1 + recursiveFun1(n-1);}
答案 0 :(得分:3)
首先,我将您的代码用另一个缩进
int recursiveFun1(int n)
{
for(i=0;i<n;i+=1) // this is bounded by O(n)
do something; // I assume this part is O(1)
if (n <= 0)
return 1;
else
return 1 + recursiveFun1(n-1);
}
首先要说的是,每次recursiveFun1()
被称为O(n)
都需要付费for
。虽然每次通话时n
都会减少,但时间仍受O(n)
限制。
第二件事是计算recursiveFun1()
被调用的次数。显然(对我来说)它将被称为n + 1
次,直到参数n
达到零值。
所以时间n + (n-1) + (n - 2) + ... + 1 + 0
为((n+1)n)/2
O(n^2)
。
答案 1 :(得分:2)
由SELECT tmp.type, tmp.token ...
表示此递归函数对输入Field
的执行时间。然后,如果R(n)
大于0,则执行以下操作:
n
次n
- 假设“某事”具有不断的运行时间,则会消耗n
时间do something
c1*n
- 一次。运行时间为c2
(根据定义)所以
n-1
此等式有一个解决方案,即R(n-1)
。你可以通过归纳证明它,或者只是通过猜测R(n) = c1*n + c2 + R(n-1)
形式的解决方案来证明它。
注意:我认为“做某事”有持续的运行时间。这看似合理。但是,如果它不是真的(例如它包含一个递归调用),那么你的复杂性会更大 - 可能会更大,这取决于“某事”的作用。