Algorithm 计算递归程序的期望时间复杂度

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

我希望确定递归算法的平均处理时间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 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