主方法
在算法分析中,我們主要使用代入法,遞歸樹法,和主方法來分析遞歸式
而主方法爲如下形式的遞歸式提供了一套“菜譜”式解法:
T(n)=aT(bn)+f(n)
幾個主要形式:
1.
若對某個常數 ε>0 有
f(n)=ο(nlogba−ε)
那麼
T(n)=θ(nlogba)
2.
若
f(n)=θ(nlogba)
則
T(n)=θ(nlogbalgn)
3.
若對某個常數 ε>0有
f(n)=Ω(nlogba+ε)
且對於某個常數c<1和所有足夠大的n有
af(bn)≤cf(n)
則
T(n)=θ(f(n))
證明:
這個要死記硬背那可太難了,還是證明一下怎麼來的比較好
T(N)=aT(bN)+θ(Nk)
a表示一個問題分解成子問題的數目,N/b表示每個子問題的規模
不妨設N=bm,即大問題是子問題規模的m次冪,且T(1)=1
於是原式有:T(bm)=aT(bm−1)+(bk)m
左右同除am:amT(bm)=am−1T(bm−1)+(abk)m
於是我們的到了一個等差數列,初項設m=0,T(1)/1=1
求和之後得到:amT(bm)=i=0∑m(abk)i
即爲:T(N)=ami=0∑m(abk)i
1.當a>bk即k=logba−ε即f(n)=θ(Nk)=ο(nlogba−ε)
此時級數的和爲一個小於無窮大的常數,於是T(N)=O(am)=O(alogbN)=O(Nlogba)
2.當a=bk即k=logba即f(n)=θ(Nk)=θ(Nlogba)
此時級數的和爲m,於是T(N)=(m+1)am=O(NlogbalogbN)
3.當a<bk即k=logba+ε即f(n)=θ(Nk)=Ω(nlogba−ε)
此時級數的和爲bk/a−1(bk/a)m−1,於是T(N)=ambk/a−1(bk/a)m−1=O(Nk)
例如:矩陣相乘的Strassen算法:
T(N)=7T(N/2)+O(N2)
有T(N)=O(Nlog27)=O(N2.81)
很方便很炫酷有沒有!!!