当前位置: 首页 > 知识库问答 >
问题:

评估树遍历递归算法(Java)中是否可能出现堆栈溢出错误

濮阳茂材
2023-03-14

从理论上(即在不实际执行的情况下)确定某个树遍历递归算法在Java中会产生堆栈溢出的最佳方法是什么?

为了澄清我的问题,考虑以下示例。给定一个用Java实现的简单二叉树:

public class Node {
    private int value;
    private Node left;
    private Node right;
    ...

    //in-order traversal
    public void inOrder() {
        if (left != null) {
            left.inOrder();
        }
        System.out.println(value);
        if (right != null) {
            right.inOrder();
        }
    }
}

在这个算法中,嵌套递归调用的最大数量相对于树的深度是线性的。那么我如何估计树的最大深度,以允许顺序遍历算法(或类似算法)在不抛出堆栈溢出错误的情况下完成?

如果最大堆栈大小是通过-Xss选项由线程分配的,那么将这个数字除以递归算法使用的每个堆栈帧的估计值是否正确?

通过将参数和局部变量的大小添加到程序计数器的大小来估计每个堆栈帧的大小是否正确,其中程序计数器大小取决于架构(32位vs 64位等...)。

我还漏了什么吗?

更新:

我确实知道递归算法可以转换为迭代算法以避免堆栈溢出错误。这只是一个关于递归算法的理论问题。

共有1个答案

湛铭
2023-03-14

我知道这主要是理论问题,但它是有效的问题。你的估计是对的。除了堆栈去Xms,但局部变量去Xmx。所以,基于你们在每次迭代中使用的真实数据和树的可用RAM深度的真实大小确实是不同的。

 类似资料:
  • 我有一个文件解析器代码,偶尔会在m.matches()上出现堆栈溢出错误(其中m是匹配器)。 我再次运行我的应用程序,它解析相同的文件,没有堆栈溢出。 我的模式确实有点复杂。它基本上是一组可选的零长度正lookahead,其中包含命名组,这样我就可以匹配一组变量名/值对,而不考虑它们的顺序。但我认为,如果某个字符串会导致堆栈溢出错误,它总是会导致它。。。不只是有时候。。。有什么想法吗? 我的模式

  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。

  • 我已经构造了一个NFA,我正在运行这个方法来评估机器,看看一个表达式是否有效。这适用于小的正则表达式,但是当我的正则表达式的大小以及NFA的大小变得太大时,这个搜索会向我抛出一个堆栈溢出。我很确定这是因为我已经实现了一个BFS,正在使用递归,并且可能没有很好地处理我的基本案例。 这个方法接受一个表达式和一个节点(从NFA的起始节点开始)。首先,它检查表达式的长度是否为零,如果我在接受节点(节点上的

  • 我在Kotlin中编写了这个递归函数: 它将运行不确定的次数(因为我在进化算法中使用随机性来收敛解)。我经常得到堆栈溢出。静态编程语言/JVM语言的最大堆栈深度是多少?我应该只编写非递归函数吗?

  • 我有一个类 Delete 我想使用 Gson 库将其转换为 json,但是当我转换它时,它会抛出 这是我的类 这里是枚举类DeleteStatus.scala 删除原因.scala 以下是我如何在Json转换 但它抛出以下异常 请帮助其中的错误

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码: