我写了一个函数来计算最长增长序列的长度。这里 arr [] 是长度为n的数组。并且 lisarr 的长度为n,用于存储元素i的长度。
我很难计算递归表达式,它是主定理的输入。
int findLIS(int n){
if(n==0)
return 1 ;
int res;
for(int i=0;i<n;i++){
res=findLIS(i);
if(arr[n]>arr[i] && res+1>lisarr[n])
lisarr[n]=res+1;
}
return lisarr[n];
}
请给出计算递归关系的方法。
应该是吗?
T(n)=O(n)+T(1)
?
答案 0 :(得分:2)
是O(2^n)
。让我们计算确切的迭代次数,并用f(n)
表示。递归关系为f(n) = 1 + f(n-1) + f(n-2) + .. + f(1) + f(0)
,其中f(1)=2
和f(0)=1
为f(n)=2*f(n-1)
,最后为f(n)=2^n
。
通过归纳证明:
基数n = 0 - >只有一次函数的迭代。
我们假设f(n)=2^n
。然后,对于输入n+1
,我们有f(n+1) = 1 + f(n) + f(n-1) + .. + f(1) + f(0) = 1 + (2^n + 2^(n-1) + .. + 2 + 1) = 1 + (2^(n+1) - 1)=2^(n+1).
。开头的第一个来自for
循环之外的部分,总和是for
循环的结果 - 你总是对i
中的{0,1,2,..,n}
进行一次递归调用1}}。