算法分析之-主方法分析递归式

主方法

在算法分析中,我们主要使用代入法,递归树法,和主方法来分析递归式
而主方法为如下形式的递归式提供了一套“菜谱”式解法:

T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac nb)+f(n) T(n)=aT(bn)+f(n)


几个主要形式:

1.

若对某个常数 ε > 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)


2.


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)


3.

若对某个常数 ε > 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表示每个子问题的规模 aN/b

不 妨 设 N = b m , 即 大 问 题 是 子 问 题 规 模 的 m 次 幂 , 且 T ( 1 ) = 1 不妨设N=b^m,即大问题是子问题规模的m次幂,且T(1)=1 N=bmmT(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(bm1)+(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 amamT(bm)=am1T(bm1)+(abk)m

于 是 我 们 的 到 了 一 个 等 差 数 列 , 初 项 设 m = 0 , T ( 1 ) / 1 = 1 于是我们的到了一个等差数列,初项设m=0,T(1)/1=1 m=0T(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=0m(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=0m(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>bkk=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=bkk=logbaf(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) mT(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<bkk=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/a1(bk/a)m1T(N)=ambk/a1(bk/a)m1=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)
很方便很炫酷有没有!!!

你可能感兴趣的:(数据结构与算法)