算法设计中经常会用到递归,利用递归式的方法可以清晰地显示算法的整个过程,而对于分析算法的复杂度,解递归式就有了用处,这里的方法来自于《算法导论》。
1. 代换法
代换法只能用于解那种很容易猜的情形,它可用来确定一个递归式的“O”和“Ω”界。
举例,确定递归式 T(n) = 2*T(└n/2┘) + n 的一个“O”界
1.1 先猜测有某个界存在
由于这个递归式与合并排序的计算时间复杂度的递归式很相似,所以我们猜测其解为 T(n) = O( n*log(n) )
1.2 然后用数学归纳法证明该猜测的正确性
要让猜测成立,我们需要证明 T(n) <= c*n*log(n),其中c是某个 >0 的常数。
先假设这个界对└n/2┘成立,即 T(└n/2┘) <= c*└n/2┘*log(└n/2┘)。
对递归式作替换:
T(n) = 2*T(└n/2┘) + n -> T(n) <= 2*(c*└n/2┘*log(└n/2┘)) + n ->
T(n) <= c*n*log(└n/2┘) + n -> T(n) <= c*n*log(n) - c*n*log(2) + n ->
T(n) <= c*n*log(n) - c*n + n -> T(n) <= c*n*log(n) +(1-c)*n
只要是c >= 1,有 T(n) <= c*n*log(n),所以就有: T(n) = O( n*log(n) )
接下来应用数学归纳法证明对边界条件也成立
注意对于此递归式,要将n=1的特殊情况,与n=2,3 ...等普遍情况分开。
2、 递归树
参考:http://blog.csdn.net/woniu317/article/details/22145047
例T(n) = 3T(n/4) + O(n2),其递归树如图3-1所示。图中结点中的数字表示合并问题解的代价,因此该递归式的解为图中所有结点中数字之和。易得该递归树最多有log4n+1层,如图中左侧所示;另外图右侧表明了每层的数字之和,则递归式T(n) = 3T(n/4) + O(n2)的解为T(n) = Ο(n2),详细结算过程如下:
3、 主方法
给出递归形式: T(n) = a * T(n/b) + f(n) 的界,其中a>=1,b>1,f(n)是给定的函数
这种方法要记忆三种情况,做到了这点,就可以很容易地确定很多简单的递归式的界了