Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时可以增加jvm(-Xss)的最大堆栈大小?_Java_Algorithm_Recursion - Fatal编程技术网

Java 何时可以增加jvm(-Xss)的最大堆栈大小?

Java 何时可以增加jvm(-Xss)的最大堆栈大小?,java,algorithm,recursion,Java,Algorithm,Recursion,我在做什么? 我在coursera上做一门课程,要求我写一个计算树高的程序。输入是一个父数组,其中每个索引都是节点,其值是节点的父级。如果节点是根节点,则其值将为-1 到目前为止我做了什么? 我编写了一个算法,通过递归地遍历树的子节点到其根节点,并将中间子节点的高度保存在数组中(深度变量),来检查树的高度。由于它是一个递归我经常看到一个堆栈溢出异常,这是很自然的,因为堆栈大小不足以容纳大树 为了消除此异常,我尝试为递归调用找到最佳值,结果发现该值接近3100k。另外,当我看到针对一些预定义测试用

我在做什么?

我在coursera上做一门课程,要求我写一个计算树高的程序。输入是一个父数组,其中每个索引都是节点,其值是节点的父级。如果节点是根节点,则其值将为-1

到目前为止我做了什么?

我编写了一个算法,通过递归地遍历树的子节点到其根节点,并将中间子节点的高度保存在数组中(深度变量),来检查树的高度。由于它是一个
递归
我经常看到一个
堆栈溢出异常
,这是很自然的,因为堆栈大小不足以容纳大树


为了消除此异常,我尝试为递归调用找到最佳值,结果发现该值接近3100k。另外,当我看到针对一些预定义测试用例测试我的算法的代码也通过了堆栈大小为1时,似乎很奇怪,您遇到了堆栈溢出错误,我假设这是一个如此简单的问题;只有当递归是一个非常大的树,或者由于某种原因,在递归过程中加载了大量RAM时,这才是递归的一个问题。我建议你发布你的代码

至于增加堆栈大小,这不是问题,因为您只是在做一个练习问题。然而,在现实世界中,这可能是一个挑战,也是使用递归的风险之一。如果您在多种设备上使用应用程序,由于设备的限制,增加堆栈大小可能并不总是可行的。相反,我建议您尽可能避免使用递归,除非您知道正在递归的树足够小,不会导致溢出


要获得替代解决方案,请尝试

如果树向右或向左倾斜,例如,如果每个节点只有一个右子节点,则递归可能很容易导致堆栈溢出(同样取决于堆栈设置),不确定在您的情况下是否有一个输入具有该属性

这可以通过迭代方式完成:

a) 将所有父级(数组中的值)添加到哈希集

b) 然后遍历所有节点(这里只是从0到n的索引),看看它是否存在于集合中,如果不存在,它是一个叶子

c) 然后从叶到根遍历以获得高度,同时将每个节点的高度存储在一个数组中,这样下次就不必再沿着同一条路径攀登了


d) 每次更新最大高度。

在实际工作中,只有当您知道深度限制在一个较小的值时,才应该使用递归


例如,递归测量一棵平衡的树是可以的,但递归测量一棵不平衡的树则不行。

链接给出了404个提示,奇怪的是,您需要超过310万个堆栈帧。如果您正确地实现了这一点,那么这种情况只会发生在深度超过3.1M的树上。如果您可以递归地执行此操作,我相信有一种迭代方法。除非绝对必要,否则不建议总是使用增加堆栈大小的方法。请阅读并遵循帮助文档中的发布指南,正如您创建此帐户时建议的那样。适用于这里。在您发布MCVE代码并准确指定问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您指定的问题。非现场链接是不可接受的。我很抱歉的链接。我忘了把回购协议改成公开的。我会的。现在请看一下代码链接。现在可以了。如果可以的话,请看一下代码。链接正在运行
int computeHeight() {
    int[] depth = new int[n];
    int maxHeight = 0;
    for (int i = 0; i < n; i++) {
        int height = computeHeight(parent, depth, i);
        maxHeight = Math.max(height, maxHeight);
    }
    return maxHeight;
}

private int computeHeight(int[] parent, int[] depth, int idx) {
    if (parent[idx] == -1) {
        // root found
        depth[idx] = 1;
        return depth[idx];
    }
    // depth of parent unknown
    if (depth[parent[idx]] == 0) {
        computeHeight(parent, depth, parent[idx]);
    }
    depth[idx] = depth[parent[idx]] + 1;
    return depth[idx];
}