《算法导论》笔记——第4章 递归式

第4章 递归式
ΘΟοΩω
本章介绍三种解递归式的方法,即找出解的渐近“Θ”和“Ο”界的方法。

代换法
用代换法解递归式需要两个步骤:
1.猜测解的形式。
2.用数学归纳法找出使解真正有效的常数。
对于T(n) = 2T(⌊n/2⌋) + n这个递归式,我们猜测它的解为Ο(nlgn)。先假设这个界对T(⌊n/2⌋)成立,
即T(⌊n/2⌋) ≤ c ⌊n/2⌋ lg(⌊n/2⌋)。然后替换到递归式中,可以得到:
T(n) = 2T(⌊n/2⌋) + n ≤ 2c⌊n/2⌋ lg(⌊n/2⌋) + n = cnlgn - cnlg2 + n = cnlgn - cn + n ≤ cnlgn(c≥1)

递归树方法
在递归树中,每个结点代表递归函数调用集合中一个子问题的代价。我们将树中的每一层内的代价相加得到一个每层代价的集合,再将每层代价相加得到递归式所有层次的总代价。当用递归式表示分治算法的运行时间时,递归树尤其有用。对于T(n) = 3T(n/4) + cn ^2这个递归式,我们以cn ^ 2为根结点,然后以3个T(n/4)都作为子结点。类似的,以c(n/4) ^2 作为父节点一直向下扩展递归树。通过写出和观察递归树,我们可以发现,问题规模n是每次以n/4不断分解的,所以第一层的结点与第0层的结点的区别是n ^2和(n/4) ^2所以当我们的问题规模减少到1时,即 n/ 4 ^i =1时,就可以算出树的层数i +1= log(4) n + 1。我们再看看每一层的代价,第0层是cn ^2,第一层是3/16cn ^2,第二层是(3/16) ^2 c n ^2,… , 第log(4)n - 1层是cn ^2 (3/16) ^log(4)n-1。
最后一层log(4)n的叶子数是3^log(4)n = n ^log(4)3,它们的代价为T(1),最后一层的代价为
n^log(4)3 T(1) = Θ(n ^log(4)3)。整棵树的代价为:T(n) = cn ^2 + (3/16)cn ^2 + (3/16) ^2 cn ^2 + … + cn ^2 (3/16) ^log(4)n-1 + Θ(n ^log(4)3)。用等比数列求和对前n - 1项求和:
公式:S(n) = ( a1 - anq ) / 1 - q
T(n) = {[ (3/16)^log(4)3 - 1 ] / 3/16 - 1 } cn ^2 + Θ(n ^log(4)3)
T(n) = Σ (3/16)^i cn ^2 (i=0…log(4)3) < Σ(3/16) ^i cn ^2(i=0…∞) = 1/(1 - 3/16)cn ^2 + Θ(n ^log(4)3) = 16/13 cn ^2 + Θ(n ^log(4)3) = Ο(n ^2)
对上式的解释:当i趋于无穷时,无限递减数列(3/16)^i趋于0,所以an
q = 0,( a1 - an*q ) / (1 - q)= 1 - 0 / 1 - 3/16 = 16 / 13。
至此得出 Ο(n ^2)是递归式的上界,我们可以用代换式来检验该结果的正确性:
设T(n/4) ≤ d(n/4) ^2,T(n) = 3T(n/4) + cn ^2 ≤ 3d(n/4) ^2 + cn ^2 = 3dn ^2 / 16 + cn ^2 ≤ dn ^2
当d ≥ (16/13)c成立。

主方法
主方法给出求解如下形式的递归式形式的方法:
T(n) = aT(n/b) + f(n),a≥1,b>1,a、b都是常数
递归式描述了将规模为n的问题划分成a个子问题的算法的运行时间,每个子问题的规模为n/b。
a个子问题被分别递归解决,时间各为T(n/b)。
主方法求解依赖主定理,有三种情况:
1.若对于某常数ℇ>0,有f(n)=Ο(n ^log(b)a - ℇ),则T(n)=Θ(n ^log(b)a);
2.若f(n) = Θ(n ^log(b)a),则T(n)=Θ(n ^log(b)a lgn);
3.若对某常数ℇ>0,有f(n)=Ω(n ^log(b)a + ℇ),且对常数c<1与所有足够大的n,有af(n/b) ≤ cf(n),则T(n)=Θ(f(n))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值