递归算法的时间复杂度分析

这一段时间,我研究了一下算法的时间复杂度分析,感觉其中的递归分析挺有意思,就总结一下记录下来,以备以后随时复习查看。

下面假设递归方程式已经给出了,仅仅说明如何计算递归方程的时间复杂度。
对于递归方程的时间复杂度分析,需要分为两个步骤,计算和证明

一、步骤一:计算

遇到一个递归方程,首先看这个递归方程的形式,根据不同的形式又分为两种不同的计算方法:

1.形式如: T(n)=aT(nb)+f(n) 的递归函数

对于形如 T(n)=aT(nb)+f(n) 的递归函数,我们可以使用下面的公式进行计算其时间复杂度:

T(n)=O(nlogab),O(f(n)×logn),O(f(n),O(nlogab)>O(f(n))O(nlogab)=O(f(n))O(nlogab)<O(f(n))

注意:上面的公式中 a>1,b>1 均为正数, f(n) 为确定的正函数。

2.形式如: T(n)=C1T(n1)+C2T(n2)++CkT(nk)+f(n) 的递归函数

对于形如 T(n)=C1T(n1)+C2T(n2)++CkT(nk)+f(n) 的递归函数,要求其中 C1,C2,,Ck0 的常数,同时会有 k 个已知的等式E1,E2,,Ek组成形如下面的递归函数:

T(n)=E1,E2,E3,E4Ek1Ek,C1T(n1)+C2T(n2)++CkT(nk)+f(n),n=0n=1n=2,3k2n=k1n>k1

首先从递归式
T(n)=C1T(n1)+C2T(n2)++CkT(nk)+f(n)

入手,将该递归式式移项得:

T(n)C1T(n1)C2T(n2)CkT(nk)=f(n)

然后写出其对应的齐次方程,即根据含有 T(n),T(n1),T(n2),,T(nk) 的个数减去1来确定方程未知数的最大次数为 k ,然后将方程中的T(n)改为未知数的最大次数, T(n1) 改为未知数的第二大次数,以此类推,假设齐次方程的未知数是 t ,则结果如下式:
tkC1tk1C2tk2Ck=f(n)

根据该方程的形式,可以知道如果该方程的某个解 t=r m 重根,则m个解的形式是 {rn,nrn,n2rn,,nm1rn} ,如果剩余的解有多重跟也按照这种形式写出即可,为了简便,假设剩余的解都为单根,则还剩 (km) 个解,其解的形式是 {rn1,rn2,,rnkm}
然后假设每个解的形式对应的系数分别为 a1,a2,,ak ,则可以写出齐次方程的通解形式:
a1rn+a2nrn+a3n2rn++amnm1rn+am+1rn1+am+2rn1++akrnkm

为了求解通解中的未知系数 a1,a2,,ak ,需要先求的齐次方程的特解,下面给出特解形式表格,为了简便,令 C(t)=T(n)C1T(n1)C2T(n2)CkT(nk)

f(n) 形式条件特解形式
an C(a)0
———————-
a C(t) m 重根
p0an
———–
p0nman
ns C(1)0
———————-
1 C(t) m 重根
p0+p1n+p2n2++psns
————————————————–
nm(p0+p1n+p2n2++psns)
nsan C(a)0
———————-
a C(t) m 重根
(p0+p1n+p2n2++psns)an
—————————————————-
nm(p0+p1n+p2n2++psns)an
常数常数 x

注意:这个表格中需要求的未知数是:p0,p1,,ps,x,根据 f(n) 形式和条件在表中找到对应的特解形式———假设特解形式为 M ,令T(n)=M回代入到递归方程 T(n)=C1T(n1)+C2T(n2)++CkT(nk)+f(n) 中,求出未知数 p0,p1,,ps,x ,将这些未知数代回特解中,即得到特解的确定形式,设其确定形式是 ζ ,则可以写出其次方程的“通解+特解”形式:

a1rn+a2nrn+a3n2rn++amnm1rn+am+1rn1+am+2rn1++akrnkm+ζ

最后将递归方程的 k 个已知的等式E1,E2,,Ek代入“通解+特解”形式,解出未知系数 a1,a2,,ak ,回代入“通解+特解”形式即得到最终解。

二、步骤二:证明

将第一步算出的时间复杂度带入原来的递归方程,如果没有出现矛盾,则是可能的解,最后用数学归纳法证明即可。

三、举例说明

以后再加上……

References:
python27的博客:http://www.cnblogs.com/python27/archive/2011/12/09/2282486.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值