算法导论:分治法(1)

时间:2021-02-10 11:08:48

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

算法导论:分治法(1)

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

(1)代换法

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

1)猜测解的形式。

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

(2)递归树方法

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

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


算法导论:分治法(1)

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

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)落在任一条“沟”中,或是第三种情况中规则性条件不成立,则主方法就不能用于解递归式。