算法分析之-主方法分析递归式
主方法
在算法分析中,我們主要使用代入法,遞歸樹法,和主方法來分析遞歸式
而主方法為如下形式的遞歸式提供了一套“菜譜”式解法:
T(n)=aT(nb)+f(n)T(n)=aT(\frac nb)+f(n)T(n)=aT(bn?)+f(n)
幾個主要形式:
1.
若對某個常數 ε>0\varepsilon \gt 0ε>0 有
f(n)=ο(nlog?ba?ε)f(n) = \omicron (n^{\log_b{a-\varepsilon} })f(n)=ο(nlogb?a?ε)
那么
T(n)=θ(nlogba)T(n) = \theta (n^{log_ba})T(n)=θ(nlogb?a)
2.
若
f(n)=θ(nlogba)f(n)=\theta(n^{log_ba})f(n)=θ(nlogb?a)
則
T(n)=θ(nlogbalg?n)T(n)=\theta(n^{log_ba}\lg n)T(n)=θ(nlogb?algn)
3.
若對某個常數 ε>0\varepsilon>0ε>0有
f(n)=Ω(nlog?ba+ε)f(n) = \Omega(n^{\log_b{a+\varepsilon} })f(n)=Ω(nlogb?a+ε)
且對于某個常數c<1和所有足夠大的n有
af(nb)≤cf(n)af(\frac nb)\le cf(n)af(bn?)≤cf(n)
則
T(n)=θ(f(n))T(n) = \theta(f(n))T(n)=θ(f(n))
將函數f(n)f(n)f(n)與函數nlogban^{log_b{a}}nlogb?a進行比較。直覺上,兩個函數較大者決定了遞歸式的解。
證明:
這個要死記硬背那可太難了,還是證明一下怎么來的比較好
T(N)=aT(Nb)+θ(Nk)T(N)=aT(\frac Nb) + \theta (N^k)T(N)=aT(bN?)+θ(Nk)
a表示一個問題分解成子問題的數目,N/b表示每個子問題的規模a表示一個問題分解成子問題的數目,N/b表示每個子問題的規模a表示一個問題分解成子問題的數目,N/b表示每個子問題的規模
不妨設N=bm,即大問題是子問題規模的m次冪,且T(1)=1不妨設N=b^m,即大問題是子問題規模的m次冪,且T(1)=1不妨設N=bm,即大問題是子問題規模的m次冪,且T(1)=1
于是原式有:T(bm)=aT(bm?1)+(bk)m于是原式有:T(b^m)=aT(b^{m-1})+(b^k)^m于是原式有:T(bm)=aT(bm?1)+(bk)m
左右同除am:T(bm)am=T(bm?1)am?1+(bka)m左右同除a^m:\frac {T(b^m)}{a^m}=\frac {T(b^{m-1})}{a^{m-1}}+(\frac {b^k}a)^m左右同除am:amT(bm)?=am?1T(bm?1)?+(abk?)m
于是我們的到了一個等差數列,初項設m=0,T(1)/1=1于是我們的到了一個等差數列,初項設m=0,T(1)/1=1于是我們的到了一個等差數列,初項設m=0,T(1)/1=1
求和之后得到:T(bm)am=∑i=0m(bka)i求和之后得到:\frac {T(b^m)}{a^m}=\displaystyle\sum_{i=0}^m(\frac {b^k}a)^i求和之后得到:amT(bm)?=i=0∑m?(abk?)i
即為:T(N)=am∑i=0m(bka)i即為:T(N)=a^m\displaystyle\sum_{i=0}^m(\frac {b^k}a)^i即為:T(N)=ami=0∑m?(abk?)i
1.當a>bk即k=logba?ε即f(n)=θ(Nk)=ο(nlog?ba?ε)1.當a>b^k \hspace3ex即k=log_ba- \varepsilon \hspace3ex即f(n) = \theta(N^k)=\omicron (n^{\log_b{a-\varepsilon} })1.當a>bk即k=logb?a?ε即f(n)=θ(Nk)=ο(nlogb?a?ε)
此時級數的和為一個小于無窮大的常數,于是T(N)=O(am)=O(alogbN)=O(Nlogba)此時級數的和為一個小于無窮大的常數,于是T(N)=\Omicron(a^m)=\Omicron(a^{log_bN})=\Omicron(N^{log_ba})此時級數的和為一個小于無窮大的常數,于是T(N)=O(am)=O(alogb?N)=O(Nlogb?a)
2.當a=bk即k=logba即f(n)=θ(Nk)=θ(Nlog?ba)2.當a=b^k \hspace3ex即k=log_ba \hspace3ex即f(n)=\theta(N^k)=\theta(N^{\log_ba })2.當a=bk即k=logb?a即f(n)=θ(Nk)=θ(Nlogb?a)
此時級數的和為m,于是T(N)=(m+1)am=O(Nlog?balogbN)此時級數的和為m,于是T(N)=(m+1)a^m=\Omicron(N^{\log_ba }log_bN)此時級數的和為m,于是T(N)=(m+1)am=O(Nlogb?alogb?N)
3.當a<bk即k=logba+ε即f(n)=θ(Nk)=Ω(nlog?ba?ε)3.當a<b^k \hspace3ex即k=log_ba+\varepsilon\hspace3ex即f(n)=\theta(N^k)=\Omega(n^{\log_b{a-\varepsilon} })3.當a<bk即k=logb?a+ε即f(n)=θ(Nk)=Ω(nlogb?a?ε)
此時級數的和為(bk/a)m?1bk/a?1,于是T(N)=am(bk/a)m?1bk/a?1=O(Nk)此時級數的和為\frac{(b^k/a)^m-1}{b^k/a-1},于是T(N)=a^m{\frac{(b^k/a)^m-1}{b^k/a-1}}=\Omicron(N^k)此時級數的和為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)=7T(N/2)+O(N^2)T(N)=7T(N/2)+O(N2)
有T(N)=O(Nlog27)=O(N2.81)有T(N)=O(N^{log_27})=O(N^{2.81})有T(N)=O(Nlog2?7)=O(N2.81)
很方便很炫酷有沒有!!!
總結
以上是生活随笔為你收集整理的算法分析之-主方法分析递归式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法分析之-渐进记号
- 下一篇: 动态加载技术