一、基本思想
將一個大規模的問題均等分爲多個獨立相同的規模更小的子問題,進行分別求解,分而治之,然後合併成大問題的解得到最終結果。
經研究證明,在使用分治法設計算法時,最好讓小問題的規模大致相同,這種思想爲“平衡子問題”思想,研究表明這樣做對算法的效果有很大的幫助。
二、基本步驟
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組的中位數組成集合,再排序取中位數,將其作爲劃分元
思路:利用快排,但只對劃分出的兩個子數組之一進行遞歸處理,利用上述方法選取中位數的中位數作劃分元進行排序。最後選出某一子數組中滿足要求的元素。