主方法
在算法分析中,我们主要使用代入法,递归树法,和主方法来分析递归式
而主方法为如下形式的递归式提供了一套“菜谱”式解法:
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)=ο(nlogba−ε)f(n) = \omicron (n^{\log_b{a-\varepsilon} })f(n)=ο(nlogba−ε)
那么
T(n)=θ(nlogba)T(n) = \theta (n^{log_ba})T(n)=θ(nlogba)
2.
若
f(n)=θ(nlogba)f(n)=\theta(n^{log_ba})f(n)=θ(nlogba)
则
T(n)=θ(nlogbalgn)T(n)=\theta(n^{log_ba}\lg n)T(n)=θ(nlogbalgn)
3.
若对某个常数 ε>0\varepsilon>0ε>0有
f(n)=Ω(nlogba+ε)f(n) = \Omega(n^{\log_b{a+\varepsilon} })f(n)=Ω(nlogba+ε)
且对于某个常数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}}nlogba进行比较。直觉上,两个函数较大者决定了递归式的解。
证明:
这个要死记硬背那可太难了,还是证明一下怎么来的比较好
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)=ο(nlogba−ε)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=logba−ε即f(n)=θ(Nk)=ο(nlogba−ε)
此时级数的和为一个小于无穷大的常数,于是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(alogbN)=O(Nlogba)
2.当a=bk即k=logba即f(n)=θ(Nk)=θ(Nlogba)2.当a=b^k \hspace3ex即k=log_ba \hspace3ex即f(n)=\theta(N^k)=\theta(N^{\log_ba })2.当a=bk即k=logba即f(n)=θ(Nk)=θ(Nlogba)
此时级数的和为m,于是T(N)=(m+1)am=O(NlogbalogbN)此时级数的和为m,于是T(N)=(m+1)a^m=\Omicron(N^{\log_ba }log_bN)此时级数的和为m,于是T(N)=(m+1)am=O(NlogbalogbN)
3.当a<bk即k=logba+ε即f(n)=θ(Nk)=Ω(nlogba−ε)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=logba+ε即f(n)=θ(Nk)=Ω(nlogba−ε)
此时级数的和为(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(Nlog27)=O(N2.81)
很方便很炫酷有没有!!!
本文介绍了算法分析中用于解决特定形式递归式的主要方法——主方法,详细阐述了其三种情况的应用条件及解的形式,并通过矩阵相乘的Strassen算法实例展示了其应用过程。
4846

被折叠的 条评论
为什么被折叠?



