【发布时间】:2019-12-23 02:22:45
【问题描述】:
我在做什么?
我在 coursera 上做一门课程,这需要我编写一个计算树高的程序。输入是一个父数组,其中每个索引是节点,其值是节点的父节点。如果节点是根节点,其值为-1。
到目前为止我做了什么?
我编写了一个算法,该算法通过递归遍历其子节点直到其根节点并将中间子节点的高度保存在数组(深度变量)中来检查树的高度。因为它是recursion,所以我经常看到stackoverflow exception,这是很自然的,因为堆栈大小不足以容纳大树。
为了摆脱这个异常,我尝试为我的递归调用找到最佳值,结果发现它接近 3100k。此外,当我看到针对一些预定义测试用例测试我的算法的代码时,也将 堆栈大小为 1 传递到线程构造函数中。
我需要知道什么?
有没有更好的方法来解决这个问题?
这样增加堆栈大小可以吗?
这是代码
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];
}
【问题讨论】:
-
链接给出404
-
看起来很奇怪,您需要超过 3.1M 的堆栈帧。如果你正确地实现了这个,这应该只发生在深度超过 3.1M 的树上。
-
如果你可以递归地做到这一点,我相信有一种迭代的方式。除非绝对必要,否则并不总是建议增加堆栈大小。
-
请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确说明问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您指定的问题。不接受站外链接。
-
我很抱歉这个链接。我忘记将回购更改为公开。我会做的。