在我的算法中是否有任何需要使用显式堆栈数据结构的情况,而不是进行递归(使用调用堆栈)?
以一种方式做另一种方式有什么好处吗?我认为使用显式数据结构会更高效,因为它不需要方法调用,但再次是微优化领域。
答案 0 :(得分:5)
我可以想到一个案例,你可以争论一个明确的堆栈:
您可能处于进入和/或退出堆栈帧的系统很昂贵,并且您的递归深度非常深。想象一下树中的深度优先。
在这样的设置中,如果您发现请求的树节点100级别深,那么如果您正在使用递归,则需要逐个销毁100个堆栈帧。
使用显式堆栈,您可以从函数返回,并立即释放完整的堆栈。
答案 1 :(得分:4)
使用显式结构可以交换更简单的代码以获得更高的性能。
使用堆栈进行递归通常可以实现非常优雅和简短的代码。
使用显式堆栈通常会使代码(更多)变得更复杂,但您可以保存在以下几个位置:
答案 2 :(得分:3)
根据您的运行时而不是内存中的结构,调用堆栈更受限制。 很多时候,由于.NET中的StackOverflowExceptions,我不得不进行堆栈数据结构的递归。
答案 3 :(得分:2)
递归调用堆栈通常是有限的,而显式堆栈对于大多数实际用途是无限的。因此,如果您希望具有非常深的递归级别(根据您的平台而有所不同),则最好为显式堆栈重新设计算法。例如。图形或树上的许多算法有两种形式:由于这个原因,使用递归和显式堆栈。
答案 4 :(得分:0)
显式堆栈还可以为您提供更好的参照局部性,从而提高缓存效率。在您的真实数据之间在堆栈中存储函数地址的多个副本是缓存压缩。