第二十七节-递归树

什么是递归树

递归的思想,就是将大问题分解为小问题,再将小问题分解为小小问题。这样一层一层分解,直到问题的数据规模被分解得足够小,不用继续分解为止。

如果我们把这个一层一层分解的过程画成图,它其实就是一棵树。我们给这棵树起一个名字,叫做递归树

递归树

用递归树来分析递归算法的时间复杂度

以递推公式 f(n) = f(n-1) + f(n-2) 为例,它的时间复杂度递推公式为 T(n) = T(n-1) + T(n-2) + c

从出发到叶子节点,最短路径是一直走 n-2 这条递归路线,长度是 n/2;最长路径是一直走 n-1这条递归路线,长度是 n

每次分解需要做一次加法运算,我们把这次加法运算的时间复杂度记为常数 1。那么第一层需要消耗时间 1,第二层需要消耗时间 2,第三层需要消耗时间 2^2=4 ……。依次类推,第 k 层需要消耗 2^(k-1) 的时间。从第一层累加到第 k 层, 总共需要消耗 1 + 2 + 4 + …… + 2^(k-1) = 2^k -1 的时间。

然后回头看递归树的图,如果递归时都走 n-2,那么路径长度就是 2/n,如果整棵树的所有路径长度都是 n/2,那么整个算法的时间复杂度就是 O(2^(n/2) - 1) 。同理如果都是最长路径 n ,那么整个算法的时间复杂度就是 O(2^n -1)。当我们从图中可以看到,整个递归树是介于全部都是最短路径和全部都是最长路径之间的情况,所以时间复杂度也是在两者之间,但是我们可以看到两者 O(2^(n/2) - 1) 和 O(2^n -1) 都是指数级别的时间复杂度。故最后整个算法是指数级别的时间复杂度。

概况分析方法

  1. 画出递归树,递推公式。
  2. 分析每层需要消耗的时间
  3. 计算边界时间复杂度(都是最长路径、都是最短路径)
  4. 总复杂度就在边界复杂度之间。

你可能感兴趣的:(第二十七节-递归树)