算法导论复习(五)| 求解递归式

文章目录

    • 分治法时间复杂度的求解
    • 代换法
      • 猜测递归式解的一些技巧
    • 递归树法
      • 递归树
      • 基于递归树的时间分析
    • 主方法
      • 适用范围
      • 主定理
      • 主方法的失效

分治法时间复杂度的求解

设开始时,问题的规模为n,之后被分解为两个子问题,子问题的规模分别n1n2
T(n)表示对规模为n时问题求解的时间,则规模分别为n1n2的子问题的求解时间可表示为T(n1)T(n2)

一般地,T(n)T(n1)T(n2)的关系可表示为:T(n) =T(n1)+T(n2)+f(n),其中f(n)是指除子问题递归求解以外的、其它必要处理所花费的时间。

因此,分治算法的计算时间表达式也往往是递归式。
算法导论复习(五)| 求解递归式_第1张图片

三种常用的递归式求解方法:

  • 代换法
  • 递归树法
  • 主方法

代换法

基本思想:
先猜测解的形式,然后用数学归纳法求出解中的常数,并证明解是正确的。
此时,用猜测的解作为归纳假设,在推论证明时作为较小值代入函数,然后证明推论的正确性。
步骤:

  • 猜测解的形式
  • 用数学归纳法求出解中的常数,并证明猜测的正确性

例题:
算法导论复习(五)| 求解递归式_第2张图片
在使用代换法求解递归式时,只需要考虑当n足够大时猜测解的正确性,对于边界条件一般不需要考虑。
化简递归式时,最后T(n)的形式应该与猜测解的形式完全相同。
另一个例题:

证明:T(n)=T(⌈n/2⌉)+1**的解为 O(lgn).

T(n)≤clg(⌈n/2⌉−a)+1
​	≤clg((n+1)/2−a)+1
​	=clg((n+1−2a)/2)+1
​	=clg(n+1−2a)−clg2+1	(c≥1)
​	≤clg(n+1−2a)		(a≥1)
​	≤clg(n−a)

猜测递归式解的一些技巧

算法导论复习(五)| 求解递归式_第3张图片
算法导论复习(五)| 求解递归式_第4张图片
例题:
算法导论复习(五)| 求解递归式_第5张图片
设S(m) = T(2m),得以下形式递归式:S(m)<=2S(m/2)+m

注意:此时右侧余项m不能变为logm,因为对S(m)的代换只是改变了函数的形式,而m本身没有被换元。

算法导论复习(五)| 求解递归式_第6张图片


递归树法

递归树

反应递归的执行过程。每个节点表示一个单一子问题的代价,子问题对应某次递归调用,根节点代表顶层调用的代价,子节点分别代表各层递归调用的代价。

基于递归树的时间分析

  • 节点代价:在递归树中,每个节点有求解相应(子)问题的代价。
  • 层代价:每一层各节点代价之和。
  • 总代价:整棵树的各层代价之和。

利用树的性质,获取对递归式解的猜测,然后用代换法或其它方法加以验证。

例题:
算法导论复习(五)| 求解递归式_第7张图片
T(n)的演化过程:
算法导论复习(五)| 求解递归式_第8张图片扩展直到递归的最底层,得到如下形式的递归树:
算法导论复习(五)| 求解递归式_第9张图片
完全扩展的递归树,高度为log-4-n(共log-4-n+1层)。
算法导论复习(五)| 求解递归式_第10张图片
代价计算
算法导论复习(五)| 求解递归式_第11张图片
算法导论复习(五)| 求解递归式_第12张图片
算法导论复习(五)| 求解递归式_第13张图片

注意:此时获得的T(n)的解只是一个猜测,需要通过代换法进行验证。

算法导论复习(五)| 求解递归式_第14张图片
具体的证明方法和文字描述可以参考《算法导论》52页第5段。


主方法

适用范围

如果递归式有如下形式,在满足一定的条件下,可以用主方法直接给出渐近界:
T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
其中,a、b是常数,且a≥1,b>1;f(n)是一个渐近正的函数。

主定理

算法导论复习(五)| 求解递归式_第15张图片
考题:
算法导论复习(五)| 求解递归式_第16张图片
例题:

求解递推关系式() = 16 (4) + 2

解:a=16,b=4,f(n)=n2
logba=2,f(n)=n2=nlogba
∴T(n)=Θ(n2logn)

主方法的失效

算法导论复习(五)| 求解递归式_第17张图片
例题:

算法导论复习(五)| 求解递归式_第18张图片
算法导论复习(五)| 求解递归式_第19张图片

注意上述两种情况的比较。


你可能感兴趣的:(算法,算法)