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

Computing expected time complexity of recursive program

我想确定递归算法的平均处理时间T(n):

int myTest( int n ) {
  if ( n <= 0 ) {
    return 0;
  }
  else {
    int i = random( n - 1 );
    return myTest( i ) + myTest( n - 1 - i );
  }
}

假设算法 random( int n ) 花费一个时间单位到 return 在 [0, n] 范围内均匀分布的随机整数值,而 所有其他指令花费的时间都可以忽略不计(例如,T(0) = 0)。

这肯定不是更简单的形式 T(n) = a * T(n/b) + c 所以我不知道如何写它。我无法弄清楚如何编写它,因为我每次都从 0 到 n-1 范围内取一个随机数,并将它提供给函数两次,并要求这两个调用的总和。

递推关系为:

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) for 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+1)T(n-1) + 1) / n

这有解 T(n) = n,您可以通过伸缩级数来推导出它,或者通过猜测解然后代入它来证明它有效。