一、什麼是分治
有很多演算法是遞迴的:為了解決乙個給定的問題,演算法要一次或多次遞迴呼叫其自身來解決的子問題。這些演算法通常採用分治策略:將原問題劃分為n個規模較小而結構與原問題相似的子問題;遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解。
習慣上,在正文中至少含有兩個遞迴呼叫的例程叫作分治演算法,而正文中只含有乙個遞迴呼叫的例程不是分治演算法。
二、分治演算法的三個步驟
分治模式中,我們遞迴地求解乙個問題,在每層遞迴中應用如下三個步驟:
分解(divide)步驟將問題劃分為一些子問題,子問題的形式與原問題一樣,只是規模更小。
解決(conquer)步驟遞迴地求解出子問題。如果子問題規模足夠小,則停止遞迴,直接求解。
合併(combine)步驟將子問題的解合併為原問題的解。
當子問題足夠大,需要遞迴求解時,我們稱之為遞迴情況(recursive case)。當子問題變得足夠小,不再需要遞迴時,我們說遞迴已經」觸底「,進入了基本情況(base case)。有時,除了與原問題形式完全一樣的規模更小的子問題外,還需要求解與原問題不完全一樣的子問題。我們將這些子問題的求解看做合併步驟的一部分。
三、分治演算法的應用場景
1、該問題的規模縮小到一定的程度就可以容易的解決;
2、該問題可以分解為若干規模較小相同的問題,即該問題具有最小最優子結構。
3、該問題分解出的子問題的解可以合併成為該問題的解。
4、該問題所分解出的各子問題是相互獨立的,即子問題之間不包括公共的子問題。
第一條特徵是絕大多數問題都可以滿足的,因為問題的計算複雜性一般是隨著問題規模的增加而增加;
第二條特徵是應用分治法的前提,它也是絕大多數問題可以滿足的,此特徵反映了遞迴思想的應用
第三條特徵是關鍵,能否利用分治法完全取決於問題是否具有第三條特徵,如果具備了第一條和第二條而不具備第三條,則可以
考慮用貪心法或動態規劃法。
第四條特徵涉及到分治法的效率,如果各子問題是不獨立的則分治法要做許多不必要的工作,重複地解決公共的子問題,此時雖然可用分治法,但一般用動態規劃法要好。
四、可使用分治法解決的問題
(1)二分搜尋
(2)大整數乘法
(3)strassen矩陣乘法
(4)棋盤覆蓋
(5)合併排序
(6)快速排序
(7)線性時間選擇
(8)最接近點對問題
(9)迴圈賽日程表
(10)漢諾塔
五、其他比較好的資料
演算法導論 分治策略
最大非空陣列問題 1.分解 將問題劃分為規模更小的自問題。2.解決 遞迴的地解出子問題。3.合併 將子問題的解組合成原問題的解。1.代入法 2.遞迴樹法 3.主方法找出陣列的最大連續非空子陣列複雜度 n 2 偽 max subarry a max infinity for i 0 to a.leng...
遞迴演算法與分治策略
關於遞迴的學習 1 遞迴演算法的基本思想是 把規模大的 較難解決的問題變成規模較小的的問題。規模較小的問題又變成規模更小的問題,並且小到一定程度可以直接得出它的解,從而得到原來問題的解。遞迴是一種直接或間接呼叫自身的函式的一種演算法,很常用,一般用於解決三類問題 資料的定義按遞迴定義的。fibona...
演算法思想之分治遞迴策略
摘自 鄒恒明 演算法之道 採取分治策略解決問題有三個步驟 1 將問題分解為若干個小的子問題。每個子問題和大問題同型,但規模更小。2 遞迴解決這些問題。3 將子問題的解答合併,並獲得大問題的解答。第二步中 遞迴解決這些子問題 指的是按照同樣的分治策略進行求解,即通過將這些子問題分解到更小的孫子問題來進...