1. 分治策略的基本思想算法
1.1例子數組
二分查找:在一個排好序的數組T[1..n]中查找x,若是x在T中,輸出x在T中的下標j;若是x不在T中,輸出j=0。使用下述二分查找算法。ide
算法1.1 BinarySearch(T,l,r,x)spa
輸入:數組T,下標從l到r;數x設計
輸出:jorm
l←1;r←n排序
while l≤r do遞歸
m←(l+r)/2ci
if T[m]=x then return xio
else if T[m]>x then r←m-1;
else l←m+1
return 0
經過x與數組T中元素的1次比較,T中須要檢索的範圍至少減半,所以檢索次數W(n)知足遞推方程:W(n)=W(n/2)+1,w(1)=1;解出W(n)=logn+1
二分歸併排序:將被排序的數組分紅兩個相等的子數組,而後使用一樣的方法對子數組排序,最後將兩個排好序的子數組歸併成一個數組。
算法1.2 MergeSort(A,p,r)
輸入:數組A[p..r]
輸出:按照遞增順序排好的數組A
if p<r then
q←(p+r)/2;
MergeSort(A,p,q)
MergeSort(A,q+1,r)
Merge(A,p,q,r)
算法1.3 Merge(A,p,q,r)
輸入:按照遞增順序排好序的數組A[p..q]與A[q+1,r]
輸出:將A[p..q]複製到B[1..x],將A[q+1,r]複製到C[1..y]
i←1,j←1,k←p
while i≤x and j≤y do
if B[i]≤C[j]
A[k]←B[j]
i←i+1;
k←k+1
if i>x then 將C[j..y]複製到A[k..r]
else 將B[i..x]複製到A[k..r]
W(n)知足遞歸方程:W(n)=2W(n/2)+n-1,W(1)=0,解得W(n)=O(nlogn)
上面兩個算法就是用分治策略設計的算法。它們的共同特色是:將規模爲n的原問題歸約成規模減半的子問題(能夠是一個字問題,也能夠是多個字問題)。分別求解每一個字問題,而後把字問題的解進行綜合,從而獲得原問題的解。
2.分治算法的通常性描述
把上面的思想加以歸納,能夠獲得分治算法的通常描述。高P是待求解的問題,|P|表明該問題的輸入規模,通常的分治算法Divide-and-Conquer的僞碼描述以下:
算法2.1 Divide-and-Conquer (P)
if |P|≤c then S(P)
divide P into P1,P2,…,Pk
for i=1 to k do
yi=Divide-and-Conquer (Pi)
return Merge(y1,y2,…,yk)
上述僞碼說明:若是問題的規模不超過c(在上述二分檢索和二分歸併算法中c=1),算法中止遞歸,直接求解P,S(P)就表明直接求解的過程;不然,將P歸約成k個彼此獨立的子問題P1,P2,…,Pk,而後遞歸地依次求解這此子問題,獲得解y1,y2,…,yk,最後將這k個解歸併獲得原問題的解,Merge表明歸併子問題的解的過程。
分治算法一般是遞歸算法,這種算法的時間複雜度分析一般須要求解遞推方程。若是原問題的輸入規模是n,根據上面的僞碼,分治算法時間複雜度的遞推方程和通常形式是:
W(n)=W(|P1|)+W(|P2|)+…+W(|Pk|)+f(n),W(c)=C;.
上面的C表明直接求解規模爲c的子問題的工做量,而f(n)表明將原問題歸約爲若干個子問題以及將子問題的解綜合爲原問題的解所須要的工做量。
3. 分治算法的分析技術
在分治算法中常見的遞推方程有下面兩類:
若是歸約後的子問題的規模比原問題呈現常數量級的減小,就會獲得第一類遞推方程。第一類方程能夠用迭代、換元、遞歸樹、嘗試等方法求解。
第二類遞推方程反映的是相似於二分檢索和二分歸併排序算法的分治算法,在均衡劃分的狀況下,a 表明歸約後的子問題個數,b表明子問題規模減小的倍數,d(n)表示歸約過程和綜合解過程的總工做量。這兩類方程的求解算法可使用迭代法、遞歸樹和主定理等,使用大O記號表示解,有以下幾種常見的方式:
當d(n)爲常數時,若是a=1,那麼符合主定理的第二種狀況,因而T(n)=O(logn);若是a≠1,不是常數,屬於主定理第一種狀況,T(n)=O(
)。
當d(n)=cn時,若是a>b,對應主定理第一種狀況,方程的解是=O();若是a=b,對就主定理第二種狀況,方程的解是O(nlogn);若是a<b,對應主定理的第三種狀況,方程的解是O(f(n))=O(n)。
利用上述結果,直接能夠獲得二分檢索算法的時間複雜度爲O(logn),二分歸併排序算法的時間複雜度爲O(nlogn)。