[转]: 五大基本算法——分治法

一、基本思想

将一个大规模的问题均等分为多个独立相同的规模更小的子问题,进行分别求解,分而治之,然后合并成大问题的解得到最终结果。

经研究证明,在使用分治法设计算法时,最好让小问题的规模大致相同,这种思想为“平衡子问题”思想,研究表明这样做对算法的效果有很大的帮助。

二、基本步骤

1、分解:将一个难以解决的大问题分割成一系列规模较小的子问题,这些子问题相互独立,且与原问题相同。

2、求解:递归求解子问题,当问题足够小时则直接求解。(规模缩小到一个或者两个时)

3、合并:将子问题的解合并为原问题的解。

三、分治法的适用条件

在以下四种情况都满足的情况下,最好考虑分治算法:

1、该问题可以分解为若干个规模较小的子问题。(才能用步骤一,分解)

2、该问题所分解出的子问题是相互独立的。(才能用步骤一,分解)

3、该问题规模缩小到一定的规模时可以直接求解。(才能用步骤二,求解)

4、利用子问题的解可以合并为原问题的解(才能用步骤三,合并)

四、分治法解题模式

(P)   //表示问题的规模

1. if |P|<n                                                           //当问题小于一个阈值,就可以直接解决了

2. then return (Adhoc(p))

3. 将问题P分解为较小的子问题p1,p2,...pk               //否则继续分解

4. for i- 1 to k                                                   //分解每一个问题带进方法去解

5. do yi  Divide-and-Conquer(Pi)                     //递归解决Pi

6. T - Merge(y1,y2,..yk)                                     //合并子问题

7. return (T)

 

总结:

1. 一定是要找到最小规模的解决办法

2. 找到求解的递归函数式后(各种规模或因子),设计递归程序即可。

五、分治法与快速排序

分治法可以运用于快速排序中,作为一种改进策略。(选取划分元)

利用分治法可选取非常合理、平衡的划分元

1:将元素个数n除以5进行分组,分得n/5组
2:5组分别排序,取中位数
3:将5组的中位数组成集合,再排序取中位数,将其作为划分元

思路:利用快排,但只对划分出的两个子数组之一进行递归处理,利用上述方法选取中位数的中位数作划分元进行排序。最后选出某一子数组中满足要求的元素。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章