递归算法和非递归算法在分析时间复杂度和空间复杂度上为什么不同

作者&投稿:司莫 (若有异议请与网页底部的电邮联系)
对照递归算法和非递归算法的优缺点。~

缠论之门:走势的递归和非递归结构对比,你看到差异了吗

可以说,有。
对于某个程序,对他进行时间上的优化,可以想到用数组记录关键字,分治等方法。。。很多都是要用更多空间,甚至说当算法在基础空间下采用了最佳算法时,只有通过以空间换时间的方法优化。
尤其是DP,对于不懂降维、滚动的新手来说,乱开内存导致爆cena的现象时有出现,曾经出现过开了2500MB+的。。。。。。但现在无论DEV C++还是FP或其它的什么都有极大的内存配置,考试时一般也允许开到128MB。所以放心开吧。

在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:
(1)代入法(Substitution Method)

代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。

(2)迭代法(Iteration Method)

迭代法的基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。

(3)套用公式法(Master Method)

这个方法针对形如“T(n) = aT(n/b) + f(n)”的递归方程。这种递归方程是分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子问题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。

(4)差分方程法(Difference Formula Method)
可以将某些递归方程看成差分方程,通过解差分方程的方法来解递归方程,然后对解作出渐近阶估计。

下面就以上方法给出一些例子说明。

一、代入法

大整数乘法计算时间的递归方程为:T(n) = 4T(n/2) + O(n),其中T(1) = O(1),我们猜测一个解T(n) = O(n2 ),根据符号O的定义,对n>n0,有T(n) < cn2 - eO(2n)(注意,这里减去O(2n),因其是低阶项,不会影响到n足够大时的渐近性),把这个解代入递归方程,得到:

T(n) = 4T(n/2) + O(n)
≤ 4c(n/2)2 - eO(2n/2)) + O(n)
= cn2 - eO(n) + O(n)
≤ cn2

其中,c为正常数,e取1,上式符合 T(n)≤cn2 的定义,则可认为O(n2 )是T(n)的一个解,再用数学归纳法加以证明。

二、迭代法
某算法的计算时间为:T(n) = 3T(n/4) + O(n),其中T(1) = O(1),迭代两次可将右端展开为:

T(n) = 3T(n/4) + O(n)
= O(n) + 3( O(n/4) + 3T(n/42 ) )
= O(n) + 3( O(n/4) + 3( O(n/42 ) + 3T(n/43 ) ) )

从上式可以看出,这是一个递归方程,我们可以写出迭代i次后的方程:

T(n) = O(n) + 3( O(n/4) + 3( O(n/42 ) + ... + 3( n/4i + 3T(n/4i+1 ) ) ) )

当n/4i+1 =1时,T(n/4i+1 )=1,则

T(n) = n + (3/4) + (32 /42 )n + ... + (3i /4i )n + (3i+1 )T(1)
< 4n + 3i+1

而由n/4i+1 =1可知,i<log4 n,从而

3i+1 ≤ 3log4 n+1 = 3log3 n*log4 3 +1 = 3nlog4 3

代入得:

T(n) < 4n + 3nlog4 3,即T(n) = O(n)。

三、套用公式法

这个方法为估计形如:
T(n) = aT(n/b) + f(n)
其中,a≥1和b≥1,均为常数,f(n)是一个确定的正函数。在f(n)的三类情况下,我们有T(n)的渐近估计式:
1.若对于某常数ε>0,有f(n) = O(nlogb a-ε ),则T(n) = O(nlogb a )

2.若f(n) = O(nlogb a ),则T(n) = O(nlogb a *logn)

3.若f(n) = O(nlogb a+ε ),且对于某常数c>1和所有充分大的正整数n,有af(n/b)≤cf(n),则T(n)=O(f(n))。

设T(n) = 4T(n/2) + n,则a = 4,b = 2,f(n) = n,计算得出nlogb a = nlog2 4 = n2 ,而f(n) = n = O(n2-ε ),此时ε= 1,根据第1种情况,我们得到T(n) = O(n2 )。

这里涉及的三类情况,都是拿f(n)与nlogb a 作比较,而递归方程解的渐近阶由这两个函数中的较大者决定。在第一类情况下,函数nlogb a 较大,则T(n)=O(nlogb a );在第三类情况下,函数f(n)较大,则T(n)=O(f (n));在第二类情况下,两个函数一样大,则T(n)=O(nlogb a *logn),即以n的对数作为因子乘上f(n)与T(n)的同阶。

但上述三类情况并没有覆盖所有可能的f(n)。在第一类情况和第二类情况之间有一个间隙:f(n)小于但不是多项式地小于nlogb a ,第二类与第三类之间也存在这种情况,此时公式法不适用。


递归算法和非递归算法的区别
1、调用方式不同:递归算法是通过函数自身的调用来解决问题,它将问题拆分成更小的子问题,并通过逐层递归调用来解决。非递归算法则使用循环或其余非递归结构来迭代地解决问题,没有函数自身的调用。2、内存占用不同:递归算法在每次函数调用时都会创建新的函数栈帧,保存当前函数的状态和局部变量,在递归...

非递归算法比较有哪些主要的优点和缺点
非递归算法的优点:如果需要处理的数据规模比较大的时候,适合使用非递归算法。缺点:程序代码的可读性差一些。递归算法的优点:程序代码的可读性要比非递归算法的好,如果需要处理的数据量比较小的时候,适合使用递归算法。缺点:当需要处理的数据规模比较大的时候,就不适合使用递归算法了。因为递归算法涉及...

证明hanoi塔问题的递归算法与非递归算法实际上是一回事
证明:设解决汉诺塔问题的函数为Hanoi(n,A,B,C)用数学归纳法即可证明上述问题 当n=1和n=2时容易直接验证。设当k<=n-1时,递归算法和非递归算法产生完全相同的移动序列。考察k=n时的情形。将移动分为顺时针移动(S),逆时针移动(N)和非最小圆盘塔间的移动(F)三种情况。(1)当n为奇...

程序的递归算法与非递归的区别
1、递归和非递归(用栈) 非递归(用栈),也用到栈函数了,和递归就没多大区别了! 每次递归进栈出栈,非递归(用栈)的每次调用栈函数也是进栈出栈。主要是在非递归(用栈)中,它的栈函数里比递归多了些赋值语句。。。所以效率上,非递归(用栈)比递归差。 只不过,递归越深,占用栈空间越多...

递归算法和非递归算法在分析时间复杂度和空间复杂度上为什么不同_百度...
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:(1)代入法(Substitution Method)代入法的基本步骤是先推测递归方程的显式解,然后用...

程序的递归算法与非递归有什么区别?
递归算法是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。递归就是在过程或函数里调用自身。在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。递归算法解题通常显得很简洁,但递归算法解题的运行效率较低...

后序遍历二叉树
后序遍历是二叉树遍历的一种,也叫做后根遍历、后序周游,可记做左右根。后序遍历有递归算法和非递归算法两种。在二叉树中,先左后右再根。巧记:左右根。序遍历的非递归算法是三种顺序中最复杂的,原因在于,后序遍历是先访问左、右子树,再访问根节点,而在非递归算法中,利用栈回退到时,并不...

递归算法与非递归算法的比较
否,一般而言非递归算法更有效;但很多时候递归算法容易实现,编程简单。

所有用递归算法的能不能都用非递归算法实现?
用递归算法可以使程序结构清晰,可读性好,但是它的运行效率很低,而且会占据很大存储空间,因此有时希望在程序中消除递归.因为在计算机内递归算法实际上是用一个工作栈来实现的,所以所有的递归算法理论上来说是可以用非递归算法实现,我们可以用一个栈来模拟递归算法 ...

斐波那契数列两种算法的时间复杂度
求解斐波那契数列的F(n)有两种常用算法:递归算法和非递归算法。试分析两种算法的时间复杂度。时间复杂度分析:求解F(n),必须先计算F(n-1)和F(n-2),计算F(n-1)和F(n-2),又必须先计算F(n-3)和F(n-4)。。。以此类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的...

武陟县18434869169: 请问递归算法的时间复杂度如何计算呢? -
征宗贝他: 递归算法的时间复杂度分析 收藏 在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解.实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常...

武陟县18434869169: 递归算法跟非递归算法的区别 -
征宗贝他: 递归算法是一种分而治之的方法,简单的说就是调用自己本身;能把复杂的问题化为简单来解决;但是执行的效率比较低,所以一般分析问题用递归,实际解决问题用非递归.

武陟县18434869169: 全排列递归算法的时间复杂度怎么算 -
征宗贝他: 复杂度就是排列组合总数:n!

武陟县18434869169: 时间复杂度,组成原理 -
征宗贝他: 时间复杂度,也就是算法处理一个问题需要多长时间.空间复杂度也要分析,不过时间复杂度更重要.下面是详细解答!1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我...

武陟县18434869169: 算法的时间复杂度和空间复杂度怎么看 -
征宗贝他: 时间复杂度,就是计算程序运行的时间,空间复杂度, 就是所占的内存空间.同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂...

武陟县18434869169: 设计至少两种不同算法求解x的n次幂,分析各算法时间复杂度 -
征宗贝他: 第一种:直接一个for循环将n个x相乘,时间复杂度明显是O(x) 第二种:利用递归(其实不是递归也行的),举例2^9,那个变成2^4 * 2^5,2^4变成2^2 * 2^2,此时2^2只需算一次,即是求x^n,若n是奇数,则x^(n/2) * x^((n+1)/2),若是偶数,则t=x^(n/2),t*t,并且可通过备忘录方法,即定义一个数组,每计一次,把其存进数组,如2^2=4,那么array[2]=4,因为array[2]可能会出现多次,所以使用递归前先看一看该数组位是否为0,是则正常递归,不是则直接用那个数据不用递归了.时间复杂度是O(logn)

武陟县18434869169: 在计算1个算法的时间复杂度时,如何解递归方程? -
征宗贝他: 如果递归表达式符合 T(n) = aT(n/b)+f(n)的形式,则可以首先尝试应用主定理. 如果不可以的话就画递归树,各层求和累加,得到T(n)的表达式.

武陟县18434869169: c++关于递归与非递归 -
征宗贝他: 调用函数是要付出一定开销的,比如上下文的保存与恢复,会不断有堆栈操作.所以会慢.. 递归就是不断地调用函数,只不过调用的是自己. 一般来讲,同一个算法的非递归程序一定不慢于递归程序.适用环境嘛……这个不能明确划分...不如这样说吧~ 能不用递归的时候都不用递归,也就是有非递归算法的时候尽量避免递归.什么时候用递归呢?我想有这样几个吧~ 1.算法有比较简单的逻辑,比如阶乘,再比如遍历树 2.不用递归就解不开的问题(这个解不开是指要花费不少多余的力气才能解开) 3.你不想让别人看懂你写的程序 4.你想炫耀你高超的编程技术

武陟县18434869169: 递归算法的特性
征宗贝他: 递归算法两个特性1.递归算法是一种分而治之,把复杂问题分解为简单问题的求解问题方法,对求解某些复杂问题,递归算法的分析方法是有效地.2递归算法的时间效率低

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网