分治法(Divide and Conquer)
1.定義
對於具備以下特點的問題:
- 原問題可以分解爲若干個與原問題性質相類似的子問題
- 問題的規模縮小到一定程度後可方便求出解
- 子問題的解可以合併得到原問題的解
- 分解出的各個子問題應相互獨立
當這類問題較複雜或規模較大時,將它分解爲若干子問題,通過合併子問題的解得到原問題的解。
2.適用條件分析
分治法所能解決的問題一般具有以下幾個特徵:
- 該問題的規模縮小到一定的程度就可以容易地解決
- 該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質
- 利用該問題分解出的子問題的解可以合併爲該問題的解
- 問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題
上述的第一條特徵絕大多數問題都可以滿足,第二條是分治法應用的前提,反映了遞歸思想的應用,
第三條特徵是關鍵,如果具備了第一條和第二條特徵,而不具備第三條特徵,則可以考慮貪心算法
或動態規劃算法;第四條特徵涉及到分治法的效率,如果各個子問題不是獨立的,則分治法要重複
地解公共子問題,動態規劃算法解決效率更高。動態規劃法=分治算法思想+解決子問題冗餘情況
3.步驟
- 分解
- 求解子問題
- 合併子問題的解
應用1:歸併排序
步驟
- 把具有n個元素的數組分解爲二個n/2大小的子數組
- 遞歸地分解子數組,直到子數組只包含一個元素爲止
- 合併已排好序的子數組使之成爲一個新的排好序的子數組,重複合併直到得到原問題的解
算法
算法分析
應用2:快速排序
基本思想
在當前的無序區A[p…r]中任取一個元素x作爲比較的基準,並用該基準將當前無序區分爲左右二個
較小的無序區A[p…q-1]和A[q+1…r],使得左邊的無序區A[p…q-1]中的元素均小於基準元素x,
右邊的無序區A[q+1…r]中的元素均大於x。
算法
quicksort(A,p,r)
if p<r
q=patition(A,p,r)
quicksort(A,p,q-1)
quicksort(A,q+1,r)
partition(A,p,r)
x=A[r]
i=p-1
for j=p to r-1
if A[j]≤x
i=i+1
exchange(A[i],A[j])
exchange(A[i+1],A[r])
return i+1
算法分析
partition算法時間爲: θ(n) --> Quicksort的時間:T(n) = T(q)+T(n-q-1)+ θ(n)
最壞情況:二個無序區的大小分別爲n-1和0,T(n) = θ(n^2)
最好情況:O(nlgn)
參考
《算法導論》