主定理的作用:求解遞推方程。使用主定理,就可以不用迭代法。
條件:得判斷是否滿足3個條件中的一個。
T(n)=aT(n/b)+f(n)
- n:解的規模
- a:子問題的個數
- n/b:歸約后子問題的規模
- f(n):除了子問題,要求解另外增加的計算代價,不參加遞歸。
定理:設a>=1,b>=1,為常數,f(n)為函數,T(n)為非負整數,且T(n)=aT(n/b)+f(n),則有3個條件:
下面是主定理的三大條件:
1.f(n)=O(nlogba-ε)
存在ε>0,就是當nlogba的階高於f(n)時,可以存在ε使得nlogba-ε和f(n)的階相同。
此時取T(n)=θ(nlogba)。
2.f(n)=Θ(nlogba)
注意這時nlogba的階和f(n)的階相同,不需要ε。
此時取T(n)=Θ(nlogbalogn)。
3.f(n)=Ω(nlogba+ε)
首先得存在ε>0,就是當nlogba的階低於f(n)時,可以存在ε使得nlogba+ε和f(n)的階相同。
第二個要滿足的條件是:af(n/b)<=cf(n), c<1。
此時取T(n)=Θ(f(n))。
來幾道例題:
例一:求解遞推方程T(n)=9T(n/3)+n。
a=9,b=3,f(n)=n。
先判斷nlogba=nlog39=n2,階數高於n,存在f(n)=O(nlogba-ε)=O(n2-1),ε=1。
滿足主定理的條件1,所以T(n)=Θ(nlogba)=Θ(n2)。
例二:求解遞推方程T(n)=T(2n/3)+1。
a=1,b=3/2,f(n)=1。
先判斷nlogba=nlog3/21=n0=1,和f(n)同階。
滿足主定理的條件2,所以T(n)=Θ(nlogbalogn)=Θ(logn)。
例三:求解遞推方程T(n)=3T(n/4)+nlogn。
a=3,b=4,f(n)=nlogn。
先判斷nlogba=nlog43≈n0.793,階數低於nlogn,存在f(n)=Ω(n0.793+ε),給ε取0.2。
還得判斷是否滿足不等式:af(n/b)<=cf(n),代入f(n)=nlogn,
3n/4log(n/4)和cnlog(n),只要c>=3/4即可滿足<=的關系。
即滿足主定理的條件3,所以T(n)=Θ(f(n))=Θ(nlogn)。
總結一下,上面3例分別是主定理的3種滿足條件的遞推方程。實際上一直在判斷nlogba和f(n)的階,誰高,就取誰。同階取Θ(nlogbalogn)。
還有不能使用主定理的例子,這里就不列舉了。這3個例子的來源是 算法設計與分析 屈婉玲教授 的課上舉的例子。
