分治算法Divide-and-Conquer§ //求解问题P
1. if |P|≤c then S(P) //当P的规模足够小,不超过C的时候,有一个直接求解的算法S
2. divide P into P,P,.... Pk //P大时,把P规约划分成子问题
3. for i←1 to k // 从第一个到第k个子问题
4. yi< -Divide-and-Conquer(P;) //递归地求解各个子问题
5. Return Merge (Yy2...) //综合得出原始问题的解
主要步骤: 划分→求解子问题→综合解
设计要点
●原问题可以划分或者归约为规模较小的子问题
子问题与原问题具有相同的性质
子问题的求解彼此独立
划分时子问题的规模尽可能均衡
●子问题规模足够小时可直接求解
●子问题的解综合得到原问题的解.
●算法实现:递归或迭代
分治算法时间分析
时间复杂度函数的递推方程
W(n)=W(|P1|)+ W(|P2|)+…+W(|Pk|)+f(n)
W©=C
●P1,P2,…,Pk为划分后产生的子问题
●f(n)为划分子问题以及将子问题的解
综合得到原问题解的总工作量
●规模为c的最小子问题的工作量为C
两类常见的递推方程
(1)f(n)= ∑(k,i=1) ai f(n-i)+g(n) //子问题变成 n-1,n-2……这类的问题(子问题规模递减),ai是子问题的个数,求和得出的是子问题全部的工作量;g(n)表示分解子问题以及把这些子问题的解综合起来的工作量
(2)f(n)=a f(n/b)+d(n) //子问题按倍数缩小,缩小到原来的n/b,d(n)是分解过程和综合解过程的工作量
例子: ,
Hanoi塔, W(n)= 2W(n-1)+1 //第一类
二分检索,W(n)=W(n/2)+1 .//第二类 一个子问题
归并排序,W(n)=2W(n/2)+ n-1 //第二类 两个子问题
//a是子问题的个数