算法导论:分治法(1)

算法导论第一讲的前半段讲了课上课下的相关事宜以及算法的重要性,后半段讲了几个渐进符号的用法和插入排序,归并排序的伪代码。第二讲就开始从最基础的数学知识开始讲起,首先用了半讲课的时间讲了渐进符号’θ‘,’O‘,‘Ω’的定义,这些定义有点抽象,我不知道其他看过的人有没有看懂,反正我没看懂,不过书上有三幅图简单明了的表达了它们的意思。


后半讲讲的是三种解递归式的方法,即找出解的渐进“θ”和“O”的方法

(1)代换法

这个方法我看了半天也不是特懂,而且感觉也不太好用,因为它需要“上帝的启示”,万一上帝不眷顾我了,那这个方法对我就没用了,用代换法解递归式需要两个步骤:

1)猜测解的形式。

2)用数学归纳法找出使解真正有效的常数

(2)递归树方法

虽然代换法给递归式的解的正确性提供了一种简单的证明方法,但是有的时候很难得到一个好的猜测,而画出一个递归树是一种得到好猜测的直接方法。在递归树中,每一个结点都代表递归函数调用集合中一个子问题的代价。将树中每一层内的代价相加的带一个每层代价的集合,再将每层代价相加得到递归是所以层次的总代价。

如T(n)=3T(n/4)+cn^2,可以构造出如下的递归树。



现在将所有层次的代价相加得到整棵树的代价:

T(n)=c*n^2+3/16*c*n^2+(3/16)^2*c*n^2+...+(3/16)^(log4(n-1))*c*n^2+θ(n^log4(3))

这样最终得出的式子有点乱,可以将量适当放松,用无限递减等比级数作为上界,则有

T(n)=16/13c*n^2+θ(n^log4(3))=O(n^2)

(3)主方法

主方法依赖主定理

主定理:设a>=1和b>1为常数。设f(n)为一函数,T(n)由递归式T(n)=aT(n/b)+f(n),那么可能有如下的渐进界:

1)若对于某常数ε>0,有f(n)=O(n^logb(a-ε)),则T(n)=θ(n^logb(a));

2)若f(n)=θ(n^logb(a)),则T(n)=θ(n^logb(a)*lgn);

3)若对某常数ε>0,有f(n)=Ω(n^logb(a)+ε),且对常数c<1与所有足够大的n,有a*f(n/b)<=c*f(n),则T(n)=θ(f(n))。

要注意的是这三种情况并没有覆盖所有可能的f(n)。三种情况之间存在着“沟”。如果f(n)落在任一条“沟”中,或是第三种情况中规则性条件不成立,则主方法就不能用于解递归式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值