加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C# 性能——递归算法与非递归算法的效率(二叉树遍历)

(2012-10-17 10:30:39)
标签:

性能

效率

递归

非递归

c

分类: C#/.NET

在程序设计中,递归算法可以有效简化某些特定问题的编程,它易编写、结构清晰、可读性强。但是它只能简化程序的编码,不能降低程序的时间与空间复杂度。

相反,由于执行过程依赖函数或过程的重复调用,会带来附加的时间的消耗。而且由于保存函数调用的返回地址需要占用系统栈,从而增加了执行的空间复杂度,也限制了问题的处理规模。效率会随着问题规模的增大而急剧下降。

 

非递归算法较复杂、可读性较差,但多数情况下具有较高的效率。

 

1、递归和非递归(用栈)非递归是用栈来实现:

非递归(用栈),也用到栈函数了,和递归就没多大区别了!

每次递归进栈出栈,非递归(用栈)的每次调用栈函数也是进栈出栈。
主要是在非递归(用栈)中,它的栈函数里比递归多了些赋值语句。
所以效率上,非递归(用栈)比递归差。

只不过,递归越深,占用栈空间越多。非递归(用栈),占用的栈空间少。
若,递归的深度还没达到超出栈空间的程度,那么递归比非递归(用栈)好。

 

若是非递归(不用栈),当然是非递归最好。

若只是用栈机械的模拟,得到的结果只是:空间不变(事实上,非递归应该多一些),而非递归的时间数倍的增加。

 

2. 如果非递归不是用栈做的:

程序的空间和时间效率毫无疑问会大幅度提高。

但是,就结构简单的树形结构而言,其实对性能的影响并不明显。例如一维的树形结构,且采用递归算法的递归深度小于3。但是,对于复杂的树形结构,采用递归算法实现时,响应速度普遍较慢,如WBS模板树、具体项目的WBS树以及省市县树形结构等,都是多维的,且递归深度不确定(至少大于3)

因此,在构造复杂的树性结构时需要把递归算法转换为非递归算法。除此之外,在其它复杂的递归算法中,也可以采用将递归算法转换为非递归算法的方法,以提高算法的性能。

 

3. 把递归算法转化为非递归算法有如下三种基本方法:

(1). 通过分析,跳过分解过程,直接用循环结构的算法实现求解过程。

(2). 自己用栈模拟系统的运行时栈,通过分析只保存必须保存的信息,从而用非递归算法替代递归算法。

(3). 利用栈保存参数,由于栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递归算法。

 

4. 总结:

《算法设计与分析(第二版)》:

递归算法,结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,而且它为设计算法,调试程序带来很大方便。

然而递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

仅仅是机械地模拟还不能达到减少计算时间和存储空间的目的。因此,还需要根据具体程序和特点对递归调用的工作栈进行简化尽量减少栈的操作压缩栈存储以达到节省计算时间和存储空间的目的

 

以上也就可以解释,为什么在进行二叉树后序遍历的递归算法与非递归算法的分析时,递归的效率高于非递归(用)的问题了。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有