在算法分析中,我们主要使用代入法,递归树法,和主方法来分析递归式
而主方法为如下形式的递归式提供了一套“菜谱”式解法:
T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac nb)+f(n) T(n)=aT(bn)+f(n)
若对某个常数 ε > 0 \varepsilon \gt 0 ε>0 有
f ( n ) = ο ( n log b a − ε ) f(n) = \omicron (n^{\log_b{a-\varepsilon} }) f(n)=ο(nlogba−ε)
那么
T ( n ) = θ ( n l o g b a ) T(n) = \theta (n^{log_ba}) T(n)=θ(nlogba)
若
f ( n ) = θ ( n l o g b a ) f(n)=\theta(n^{log_ba}) f(n)=θ(nlogba)
则
T ( n ) = θ ( n l o g b a lg n ) T(n)=\theta(n^{log_ba}\lg n) T(n)=θ(nlogbalgn)
若对某个常数 ε > 0 \varepsilon>0 ε>0有
f ( n ) = Ω ( n log b a + ε ) f(n) = \Omega(n^{\log_b{a+\varepsilon} }) f(n)=Ω(nlogba+ε)
且对于某个常数c<1和所有足够大的n有
a f ( n b ) ≤ c f ( n ) af(\frac nb)\le cf(n) af(bn)≤cf(n)
则
T ( n ) = θ ( f ( n ) ) T(n) = \theta(f(n)) T(n)=θ(f(n))
这个要死记硬背那可太难了,还是证明一下怎么来的比较好
T ( N ) = a T ( N b ) + θ ( N k ) T(N)=aT(\frac Nb) + \theta (N^k) T(N)=aT(bN)+θ(Nk)
a 表 示 一 个 问 题 分 解 成 子 问 题 的 数 目 , N / b 表 示 每 个 子 问 题 的 规 模 a表示一个问题分解成子问题的数目,N/b表示每个子问题的规模 a表示一个问题分解成子问题的数目,N/b表示每个子问题的规模
不 妨 设 N = b m , 即 大 问 题 是 子 问 题 规 模 的 m 次 幂 , 且 T ( 1 ) = 1 不妨设N=b^m,即大问题是子问题规模的m次幂,且T(1)=1 不妨设N=bm,即大问题是子问题规模的m次幂,且T(1)=1
于 是 原 式 有 : T ( b m ) = a T ( b m − 1 ) + ( b k ) m 于是原式有:T(b^m)=aT(b^{m-1})+(b^k)^m 于是原式有:T(bm)=aT(bm−1)+(bk)m
左 右 同 除 a m : T ( b m ) a m = T ( b m − 1 ) a m − 1 + ( b k a ) 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 ( b m ) a m = ∑ i = 0 m ( b k a ) 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 ) = a m ∑ i = 0 m ( b k a ) i 即为:T(N)=a^m\displaystyle\sum_{i=0}^m(\frac {b^k}a)^i 即为:T(N)=ami=0∑m(abk)i
1. 当 a > b k 即 k = l o g b a − ε 即 f ( n ) = θ ( N k ) = ο ( n log b a − ε ) 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 ( a m ) = O ( a l o g b N ) = O ( N l o g b a ) 此时级数的和为一个小于无穷大的常数,于是T(N)=\Omicron(a^m)=\Omicron(a^{log_bN})=\Omicron(N^{log_ba}) 此时级数的和为一个小于无穷大的常数,于是T(N)=O(am)=O(alogbN)=O(Nlogba)
2. 当 a = b k 即 k = l o g b a 即 f ( n ) = θ ( N k ) = θ ( N log b a ) 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 ) a m = O ( N log b a l o g b N ) 此时级数的和为m,于是T(N)=(m+1)a^m=\Omicron(N^{\log_ba }log_bN) 此时级数的和为m,于是T(N)=(m+1)am=O(NlogbalogbN)
3. 当 a < b k 即 k = l o g b a + ε 即 f ( n ) = θ ( N k ) = Ω ( n log b a − ε ) 3.当a3.当a<bk即k=logba+ε即f(n)=θ(Nk)=Ω(nlogba−ε)
此 时 级 数 的 和 为 ( b k / a ) m − 1 b k / a − 1 , 于 是 T ( N ) = a m ( b k / a ) m − 1 b k / a − 1 = O ( N k ) 此时级数的和为\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 ) = 7 T ( N / 2 ) + O ( N 2 ) T(N)=7T(N/2)+O(N^2) T(N)=7T(N/2)+O(N2)
有 T ( N ) = O ( N l o g 2 7 ) = O ( N 2.81 ) 有T(N)=O(N^{log_27})=O(N^{2.81}) 有T(N)=O(Nlog27)=O(N2.81)
很方便很炫酷有没有!!!