繁体   English   中英

遍历二叉树迭代或递归-复杂度分析

[英]Traversing binary tree iterative or recursive - complexity analysis

我已经听到一些意见,认为二叉搜索树中的迭代查找比递归方法更有效,这是真的吗?
(我知道从太空角度来看,修复费用更高)

就时间复杂度(Big O)而言,如果算法正确实现,应该没有任何区别。 由于每个递归调用都会在堆栈上分配新的空间,因此递归通常相对于空间而言更为沉重。 我说的是您的特定二进制搜索树结构,但是通常情况下也是如此。

递归搜索和迭代搜索之间确实没有区别,因为无论如何,遍历树的高度检查枯萎的左节点或右节点,但绝不会两者都使用(并且这对于迭代和递归都适用),因此您始终遍历树的高度。

理论上没有改变。 对于不平衡,bigO将为O(n),对于平衡BST,bigO将为O(logn)。 递归遍历在纸上看起来很干净。 但是它有很多开销。 递归调用函数时,必须将调用函数的状态存储在堆栈中,并将控件传递给被调用函数。 但是,当您反复进行操作时,就没有这样的开销。 因此,出于实际目的,您应该使用迭代方法。

如果您编写了一个递归代码,并且证明它是尾递归,则大多数现代编译器都会尝试通过将其转换为迭代代码来对其进行优化。

在很大程度上取决于您的语言实现! 如果过程调用在您的语言中很昂贵,那么手写迭代可能会更快。 如果过程调用始终推栈,则手写迭代可能会节省内存。 在诸如Scheme,Haskell,ML等功能语言中(我也认为在诸如Postscript或FORTH之类的基于堆栈的语言中),通常可以期望在树查找操作中发现的“尾递归”将转换为迭代在引擎盖下,所以没有区别。 实际上,这种特殊形式的尾部递归(函数将对自身的调用的值返回)可以甚至由甚至不支持完整尾部调用优化(TCO)的编译器进行优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM