首先认识一个递推式: 算法
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)。