Algorithm 计算递归程序的期望时间复杂度
我希望确定递归算法的平均处理时间T(n):Algorithm 计算递归程序的期望时间复杂度,algorithm,recurrence,Algorithm,Recurrence,我希望确定递归算法的平均处理时间T(n): int myTest( int n ) { if ( n <= 0 ) { return 0; } else { int i = random( n - 1 ); return myTest( i ) + myTest( n - 1 - i ); } } int-myTest(int-n){ 如果(n),则递推关系为: T(0) = 0 T(n) = 1 + sum(T(i) + T(n-1-i) for
int myTest( int n ) {
if ( n <= 0 ) {
return 0;
}
else {
int i = random( n - 1 );
return myTest( i ) + myTest( n - 1 - i );
}
}
int-myTest(int-n){
如果(n),则递推关系为:
T(0) = 0
T(n) = 1 + sum(T(i) + T(n-1-i) for i = 0..n-1) / n
第二个可以简化为:
T(n) = 1 + 2*sum(T(i) for i = 0..n-1) / n
乘以n:
n T(n) = n + 2*sum(T(i) for i = 0..n-1)
注意到(n-1)T(n-1)=n-1+2*sum(T(i)表示i=0..n-2)
,我们得到:
n T(n) = (n-1) T(n-1) + 1 + 2T(n-1)
= (n+1) T(n-1) + 1
或:
这就是解T(n)=n,你可以通过伸缩序列或猜测解,然后替换它来证明它是有效的。根据规范,我确信T(0)
存在。但是当你从步骤1移动到步骤2时,你可以假设I>0
的值T(I)
存在。我们如何证明这一点?因为如果它是无限的,那么下面的证明步骤就没有资金了。@fjardon没有无限——编写代码时,递归调用总是在一个较小的输入上,这个输入限制了调用堆栈的高度。也就是说,如果myTest(n)
调用myTest(i)
,然后0@Paul你能解释一下我们是如何达到这一步的吗?nT(n)=(n-1)T(n-1)+1+2T(n-1)=(n+1)T(n-1)+1。我不明白这一点。省略的步骤是重新排列nT(n)=n+2sum(T(I)表示I=0..n-1)=n-1+2sum(T(I)表示I=0..n-2)+1+2T(n-1)。然后注意n-1+2sum(T)表示I=0..n-1)@PaulHankin感谢您的澄清。
T(n) = ((n+1)T(n-1) + 1) / n