- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用递推关系理论分析递归算法的时间复杂度
[摘要]对算法进行时间复杂度分析是算法分析与研究的重要内容,而对递归 算法分析其时间复杂度时往往比较困难。 本文提出了用组合数学中的递推关系
理论来分析一些特殊的递归算法的时间复杂度, 并同时得出三个推论, 在算法
的分析与研究方面具有一定的参考价值。
[关键词]时间复杂度,递归,母函数
1.引言
一个程序在计算机上运行时所耗费的时间取决于对源程序进行编译所需时 间、计算机执行每条指令所需时间、 程序中指令重复执行的次数。
前两条依赖于实现算法的计算机软件、硬件系统,亦即依赖于实现算法所用 语言的编译程序的性能和计算机本身的速度。因此习惯上常常用重复执行次数最 多的语句频度来分析算法的时间复杂度, 记为t (n),其中n为问题的规模或大
小。例如对n个存放于数组a[n]中的数进行选择法排序的算法:
for( i=0; in-1; i++){ //共进行 n-1 趟排序
k=i; //n-1 次
for(j=i+1; j n; j++){ //n-i-1 次
if(a[j] a[k]){ //第i趟需进行n-i-1趟次比较,该语句频度最大
k=j;
}
}
if(k!=i){ t=a[k]; a[k]=a[i]; a[i]=t;} //n-1 比较和交换
}
该算法的时间复杂度为:
n 2t(n)
n 2
t(n) = (n-i-1)=
i 0
(n 1)n
2
i(n2 - n)=O(n 2).
对一个算法进行时间复杂度的分析方式有多种,但有时候一个算法的时间 复杂度并不象上面的例子那样可以轻易地分析出来。也许对一个 for循环、对
一个单一语句的时间复杂度可以马上分析出来, 但遇到递归算法时,则无法轻
易地分析出其时间复杂度, 而递归算法又是程序设计时经常采用的有效手段,
如求解n阶hanoi塔问题的递归算法:
〃将n个盘从one座借助two座,移动到three座 void hanoi ( int n, char one, char two, char three ){ if( n==1 ){
printf(%c — %c, one, three);
}else{
hanoi(n-1, one, three, two); prin tf(%c — %c, one, three);
prin tf(%c — %c, one, three); hanoi( n-1, two, one, three);
}
}
类似的递归算法还有很多, 例如求Fibonacci数列前n项的递归算法等。对
于这些递归算法,可以利用组合数学中的母函数与递推关系理论来分析其时间复 杂度。
2.利用递推关系理论分析递归算法的时间复杂度
2.1相关概念
1)k阶常系数线性递推关系式与特征多项式
若母函数G(x) = a 0 +a1x+a2x2 + ...,所对应的序列{an}满足an + C 1an-1 + C2an-2 + ... + C kan-k = 0,并且有初始条件 ao = do,a1=d1,...,ak-1=dk-1,C1, C2,...,Ck 及 d0,d1,...,dk-1 是常数,Ck 0,则称 an + C1an-1 + C2an-2 + ... + Ckan-k = 0为序列{an}的 k阶常系数线性递推关系。
对应于k阶常系数线性递推关系的多项式 C(x) = xk + C1Xk-1 + ..+ C k-1x + Ck
称为序列{an}的特征多项式。
2.2推论1及其应用
设某一递归算法时间复杂度函数为t(n),如果其k阶常系数递推关系式所对 应的特征多项式C(x)有k个不同的根 阻侄,...,出则t(n)的解为:t(n) = A1时+ A2仅n ... + Ak伙n ,其中A1,A2 ... Ak为k个待定常数。
例如,对上面n阶hanoi塔问题的递归算法进行分析。不妨设h(n)表示将n 个盘子从one座移动到three座所需的转移次数亦即hanoi问题算法的时间复杂 度。根据算法先把前面n-1个盘子转移到two座上(移动次数为h(n-1)次),然 后把第n个盘子转移到three座上(移动次数为1次);最后再一次将two座上 的n-1个盘子转移到three座上(移动次数为h(n-1)次)。则显然有:
h( n) = 2h( n-1) + 1 , h(1) = 1 (1)
同样有
h(n-1) = 2h( n-2) + 1 (2)
(1)-⑵ 式即可得到2阶(即k = 2)常系数线性递推关系式:
h(n) - 3h( n-1) + 2h( n-2) = 0
根据递扌推关系理论,序列h(n)所对应的的特征多项式为
C(x) = x2 - 3x + 2其有两个不同的根,x仁1,x2=
文档评论(0)