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

本文介绍了算法分析中用于解决特定形式递归式的主要方法——主方法,详细阐述了其三种情况的应用条件及解的形式,并通过矩阵相乘的Strassen算法实例展示了其应用过程。

主方法

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

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)=ο(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)=θ(nlogbalg⁡n)T(n)=\theta(n^{log_ba}\lg n)T(n)=θ(nlogbalgn)


3.

若对某个常数 ε>0\varepsilon>0ε>0
f(n)=Ω(nlog⁡ba+ε)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表示每个子问题的规模aN/b

不妨设N=bm,即大问题是子问题规模的m次幂,且T(1)=1不妨设N=b^m,即大问题是子问题规模的m次幂,且T(1)=1N=bmmT(1)=1

于是原式有:T(bm)=aT(bm−1)+(bk)m于是原式有:T(b^m)=aT(b^{m-1})+(b^k)^mT(bm)=aT(bm1)+(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)^mamamT(bm)=am1T(bm1)+(abk)m

于是我们的到了一个等差数列,初项设m=0,T(1)/1=1于是我们的到了一个等差数列,初项设m=0,T(1)/1=1m=0T(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)^iamT(bm)=i=0m(abk)i
即为:T(N)=am∑i=0m(bka)i即为:T(N)=a^m\displaystyle\sum_{i=0}^m(\frac {b^k}a)^iT(N)=ami=0m(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>bkk=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)=θ(Nlog⁡ba)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)am=O(Nlog⁡balogbN)此时级数的和为m,于是T(N)=(m+1)a^m=\Omicron(N^{\log_ba }log_bN)mT(N)=(m+1)am=O(NlogbalogbN)

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<bkk=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/a1(bk/a)m1T(N)=ambk/a1(bk/a)m1=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)
很方便很炫酷有没有!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hack Rabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值