开篇:润墨网以专业的文秘视角,为您筛选了一篇递归方程求解方法综述范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘要:随着计算机科学的逐步发展,各种各样的算法相继出现,我们需要对算法进行分析,以选择性能更好的解决方案。算法分析中计算复杂度常用递归方程来表达,因此递归方程的求解有助于分析算法设计的好坏。阐述了常用的3种求解递归方程的方法:递推法、特征方程法和生成函数法。这3种方法基本上可以解决一般规模递归方程的求解问题。
关键词:递归;递推法;特征方程;生成函数
中图分类号:TP301文献标识码:A文章编号:16727800(2011)012003902
作者简介:郭萌萌(1983- ),女,山东济南人,硕士,山东英才学院计算机电子信息工程学院讲师,研究方向为软件工程、算法分析与设计。
0引言
寻求好的解决方案是算法分析的主要目的,问题的解决方案可能不只一个,好的方案应该执行时间最短,同时占有存储空间最小,故算法分析一般考虑时间复杂性、空间复杂性两方面的参数。在算法分析时我们采用时间耗费函数来表示时间参数,用当问题规模充分大时的时间耗费函数的极限表示时间复杂度。
一般算法对应的时间耗费函数常用递归方程表示,找出递归方程的解,就可以表示其对应算法复杂度的渐进阶,从而比较算法的优劣。因此研究递归方程的解法意义重大。下文将分析并给出常用递归方程的3种解法。
1递归方程的解法
递归方程是对实际问题求解的一种数学抽象,递归的本质在于将原始问题逐步划分成具有相同解题规律的子问题来解决,原始问题与子问题仅在规模上有大小区别,并且子问题的规模比原始问题的规模要小。对于规模为n的原始问题,我们通常会寻找规模n的问题与规模n-1或者规模n/2的问题之间存在的联系,从而进一步推导出具有递归特性的运算模型。
根据递归方程的一般形式,常用的解法有三种,分别是递推法、公式法及生成函数法。下面就分别来分析其求解过程。
1.1递推法
当递归方程形式简单且阶数较低时,一般可以采用递推法求解,根据一步一步递推找到方程的递推规律,得到方程的解。下面举例说明: T(1)=0
T(n)=2T(n/2)+n2(n≥2)
T(n)=2T(n/2)+n2=2(2T(n/22)+(n/2)2)+n2
=22T(n/2)2+2n2/22+n2
=22(2T(n/23)+(n/22)2)+2n2/22+n2
=23(2T(n/23)+22n2/(22)2)+2n2/(22)1+n2…
=2kT(n/2k)+∑k-1i=02in2(22)i递推到这里我们就可以发现递归规律,找到递归出口, T(1)=0,令n=2k 则可以得到如下结果:T(n) =2kT(1) +∑k-1i=0n2(1/2)i)=
n2(1-(1/2)k1-1/2)=2n2-2n 上面得到方程的解,我们来分析其对应算法复杂性的渐进阶,根据渐进阶定理有:设有函数f(n),g(n)均是规模n的函数,则O(f(n))+O(g(n))=O(max(f(n), g(n)))。故有T(n)=O(n2)。
1.2公式法
对所需求解的递归方程进行观察,如果它是符合以下形式的常系数齐次线性方程,可用公式法求解。F(0)=b0;
F(1)=b1;……
F(k-1)=bk-1;
F(n)=a1F(n-1)+a2F(n-2)+…+akF(n-k) 在此,常系数是指a1 、a2、……ak是常数,线性指所有的F均为一次幂,齐次指无常数项。
解这类方程,可由F(n)项得出:F (n)-a1F(n-1)-a2F(n-2)-…
-akF(n-k) =0;寻找形如F(n)= xn的解。
令xn-a1xn-1-a2xn-2-…-akxn-k=0;xn-k(xk-a1xk-1-…-ak) =0;即xk-a1xk-1-…-ak =0;
由此,我们得到了这类递归方程的特征方程,它有n个特征根,设为x1,x2,…,xk;其线性组合是F(n)的通解。即c1x1n+c2x2n+…+ckxkn=F(n);其中c1,c2,…,ck可由k个初始条件得到的线性方程组解出。
例如,常系数齐次线性方程组F(0)=0;
F(1)=1;
F(n)=4F(n-2);(n>1) 令F(n)=xn;则xn =4xn-2;
xn - 4xn-2=0 ;
x2-4=0; (特征方程)
x1=2;x2=-2;(特征根)
设有c1,c2使F (n) =c1x1n+c2x2n;
由初始条件 F(0) =c1x10+c2x20=c1+c2=0;F(1)=c1x11+c2x21=2c1-2c2=1;即c1+c2=0;
2c1-2c2=1解得c1=1/4;c2=-1/4;
F(n)=2n/4-(-2)n/4即为以上递归方程的解。
1.3生成函数法
第三种方法是利用生成函数的方法,即已知一个数列a0,a1,a2,…,an,定义它的生成函数为一个形式幂级数:F(x)=a0+a1x1+a2x2+…+anxn+…
我们寻找an的代数式。有了生成函数F(x),无需知道a0,a1,a2,…,an 的各项就可以设法找出它的生成函数的解析式,再将其展开成一个幂级数,则xn项的系数即为要求得的an。
以汉诺(Hanoi)塔问题的递归方程为例:T(1)=1;
T(n)=2T(n-1)+1;(n≥2) 该序列的生成函数为:T(x)=T(1)x+T(2)x2+T(3)x3+…+T(n)xn+…(1)下面求T(n)的解析式。
由递归方程可得:T(2)-2T(1) =1;
T(3)-2T(2)=1;
T(4)-2T(3)=1;
……
T(n+1)-2T(n)=1将(1)式×2x得:2xT(x)=2T(1)x2+2T(2)x3+
2T(3)x4+…+2T(n)xn+1+…(2)(1)式-(2)式得,T(x) -2xT(x)= T(1)x+x2+x3+…+xn+…(1-2x)T(x)= x+x2+x3+…+xn+…
T(x)= = x1-x1-2x=x(1-x)(1-2x)设T(x)=A1-x+B1-2x=A(1-2x)+B(1-x)(1-x)(1-2x)=(A+B)-(2A+B)x(1-x)(1-2x)
应有x=(A+B) - (2A+B)x
则A+B=0;
2A+B=-1解得A=-1;B=1
即T(x)=-11-x+11-2x
用幂级数展开,得:T(x) = (1+2x+22x2+23x3+...
+2nxn+...) - (1+x+x2+…+xn+…)
= (2-1) x+ (22-1) x2+ (23-1) x3+
…+ (2n-1) xn+…解出an=2n-1;
在设定生成函数后,在求解解析式的过程中,需要消去中间的多余项,这就需要观察递归方程,上例中是采取了乘以一个系数相减的方法,在遇到具体问题时,可采取不同的方法, 比如移位、乘法、甚至求导,以求出要找的解析式。
2结束语
在算法设计中,很多问题可以采用递归解决。递归的引入往往使某些函数的定义和算法的描述更加清晰、明了。而且,递归对于一些用非递归无法完全描述的复杂函数和过程也能清楚地进行表达。根据递归方程的解的形式可以评价一个算法的时间复杂度,从而可以直接判断算法的优劣,因此递归方程求解在算法设计中至关重要。本文给出了3种求解递归方程的方法,采用这些方法就可解决一般的递归方程,对于递归方程的学习有十分重要的指导意义。参考文献:
[1]胡章平,王瑞胡.算法时间复杂度分析中递归方程求解方法综述[J].中国科技信息,2006(3).
[2]高见元.递归方程的分析[J].中国高新技术企业 2007(13).
[3]武继刚.关于递归方程T(n)=a[1].T(n/c)+d(n)的一般解[J].兰州大学学报(自然科学版),1989(4).
[4]孙红丽,叶斌.浅析递归方程解法及其渐进阶表示[J].四川文理学院学报(自然科学版),2007(2).
[5]王晓东.计算计算法设计与分析[M].北京:清华大学出版社,2008.