首先認識一個遞推式: 算法
T(n) = aT(n/b)+f(n) (1.0) spa
這就是通用分治遞推式了,其中 排序
T(n)表示算法的運行時間,這樣aT(n/b)就不難理解爲把規模爲n的實例劃分b個規模爲n/b的實例,其中有a個須要求解的實例,f(n)表示將分解的結果合併起來所消耗的時間,聽起來拗口的話,那就先看個實例先吧. 效率
爲了方面後面的求解,咱們先了解一下下面的定理先吧,具體證實過程就略過啦,之後有機會再補上。 im
主定理 :若是在式(1.0)中f(n)∈O(nd),其中d≥0,那麼: 時間
當a《bd時,T(n)=O(nd) ; a=bd時,T(n)=O(ndlogn) ;a>bd,T(n)=O(nlogba). 實例
合併排序情景分析:
當n>1時,C(n) = 2C(n/2)+Cm(n) ,C(1) = 0;
C(n)就是要求的時間效率,2C(n/2)表示把原問題分解成兩個子問題(b=2),這兩個子問題都要求解(a=2),Cm(n)就是要把左右兩個有序序列合併的效率(f(n)).
在最壞的狀況下,Cm(n) = n-1.
根據主定理,由d=1,a=2,b=2,能夠得出T(n) = O(nlogn)。