3.4.3递归算法的效率分析

Posted kitor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.4.3递归算法的效率分析相关的知识,希望对你有一定的参考价值。

1.时间复杂度的分析
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析可以转化为一个递归方程求解。也就是数学上求渐进解得问题,而递归方唱的形式多种多样,其求解方法也不尽相同。迭代法是求解递归方程的一种常用方法,其基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计(即方程的解)来达到对左端的估计。
下面以阶乘为例求解时间复杂度。
阶乘执行函数如下:
longFact(long n)
{
long temp;
if(n==0)return1;//活动记录退栈
else temp=n*Fact(n-1);//活动记录进栈
return temp;//活动记录退栈
}

 

设Fact(n)的执行时间是T(n)。此递归函数中语句4的时间复杂度为O(1)【因为语句4的执行次数不会随着问题规模n的改变而改变】。递归调用Fact(n-1)的执行时间是T(n-1)【因为随着n的不同,函数中Fact(long n)会被执行n次】,所以语句5的执行时间是O(1)+T(n-1)【因为语句5中最后一次传进的参数是0,所以执行的是语句4。又前面共执行了n-1次调用,所以有执行时间是O(1)+T(n-1)】。
加入设两数相乘和赋值的时间复杂度都是O(1),则对某常数C【非终止条件下的递归通式】、D【终止条件下的执行时间】有如下递归方程
技术分享图片
设n>2,利用上式对T(n-1)展开,即在上式中用n-1代替n得到
T(n-1)=C+T(n-2)
再代入T(n)=C+T(n-1)中,有
T(n)=2C+T(n-2)
同理,n>3时有
T(n)=3C+T(n-3)
以此类推,当n>i时有
T(n)=iC+T(n-i)
最后,当i=n时有
T(n)=nC+T(0)=nC+D
求得递归方程的解为:
T(n)=O(n)
采用这种方法计算Fibonacci数列和Hanoi塔问题递归算法的时间复杂度为
技术分享图片
 
2、空间复杂度的分析
递归函数在执行时,系统会建立一个“递归工作栈”存储每一层递归所需的信息,此工作栈是递归函数执行的辅助空间,因此,分析递归算法的空间复杂度需要分析工作栈的大小。
对于递归算法,空间复杂度
S(n)=O(f(n))
其中,f(n)为“递归工作栈”中工作记录的个数,与问题规模n的函数关系。
根据这种分析方法不难得到,前面讨论的阶乘问题、Fibonacci数列问题、Hanoi塔问题的递归算法的空间复杂度为O(n)。

 

1.时间复杂度的分析2、空间复杂度的分析1.时间复杂度的分析在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析可以转化为一个递归方程求解。也就是数学上求渐进解得问题,而递归方唱的形式多种多样,其求解方法也不尽相同。迭代法是求解递归方程的一种常用方法,其基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计(即方程的解)来达到对左端的估计。 下面以阶乘为例求解时间复杂度。阶乘执行函数如下:long Fact(long n){    long temp;    if(n==0) return 1;//活动记录退栈    else temp=n*Fact(n-1);//活动记录进栈    return temp;//活动记录退栈}
设Fact(n)的执行时间是T(n)。此递归函数中语句4的时间复杂度为O(1)【因为语句4的执行次数不会随着问题规模n的改变而改变】。递归调用Fact(n-1)的执行时间是T(n-1)【因为随着n的不同,函数中Fact(long n)会被执行n次】,所以语句5的执行时间是O(1)+T(n-1)【因为语句5中最后一次传进的参数是0,所以执行的是语句4。又前面共执行了n-1次调用,所以有执行时间是O(1)+T(n-1)】。加入设两数相乘和赋值的时间复杂度都是O(1),则对某常数C【非终止条件下的递归通式】、D【终止条件下的执行时间】有如下递归方程
设n>2,利用上式对T(n-1)展开,即在上式中用n-1代替n得到T(n-1)=C+T(n-2)再代入T(n)=C+T(n-1)中,有T(n)=2C+T(n-2)同理,n>3时有T(n)=3C+T(n-3)以此类推,当n>i时有T(n)=iC+T(n-i)最后,当i=n时有T(n)=nC+T(0)=nC+D求得递归方程的解为:T(n)=O(n)采用这种方法计算Fibonacci数列和Hanoi塔问题递归算法的时间复杂度为

2、空间复杂度的分析递归函数在执行时,系统会建立一个“递归工作栈”存储每一层递归所需的信息,此工作栈是递归函数执行的辅助空间,因此,分析递归算法的空间复杂度需要分析工作栈的大小。对于递归算法,空间复杂度S(n)=O(f(n))其中,f(n)为“递归工作栈”中工作记录的个数,与问题规模n的函数关系。根据这种分析方法不难得到,前面讨论的阶乘问题、Fibonacci数列问题、Hanoi塔问题的递归算法的空间复杂度为O(n)。

以上是关于3.4.3递归算法的效率分析的主要内容,如果未能解决你的问题,请参考以下文章

快速排序-递归实现

python函数函数嵌套分析步骤与递归函数

[算法学习]斐波那契数计算

斐波那契高效算法(4种算法综合分析)

二叉树遍历算法

第二章算法总结