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

一、基本思想

將一個大規模的問題均等分爲多個獨立相同的規模更小的子問題,進行分別求解,分而治之,然後合併成大問題的解得到最終結果。

經研究證明,在使用分治法設計算法時,最好讓小問題的規模大致相同,這種思想爲“平衡子問題”思想,研究表明這樣做對算法的效果有很大的幫助。

二、基本步驟

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組的中位數組成集合,再排序取中位數,將其作爲劃分元

思路:利用快排,但只對劃分出的兩個子數組之一進行遞歸處理,利用上述方法選取中位數的中位數作劃分元進行排序。最後選出某一子數組中滿足要求的元素。

 

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