【问题标题】:Is there any way to configure stack memory size with just the code of Scala?有没有办法只用 Scala 的代码来配置堆栈内存大小?
【发布时间】:2014-08-11 16:29:41
【问题描述】:

我正在研究一个算法问题。我需要预先遍历一棵有 30000 个节点的树。

通过我的实验,我发现当递归级别大于 10000 时,会导致堆栈溢出。我们知道一般树的前序遍历的非递归版本并不那么容易实现,所以我试图使堆栈大小更大。

由于是在线评委,无法直接配置堆栈大小。我知道有一种方法可以在 C++ 中编写一些#prgram 指令来更改堆栈大小,所以我想在 Scala 中是否存在类似的东西。

【问题讨论】:

  • “我们知道非递归版本的通用树的前序遍历并不那么容易实现,”。这也不是那么难。可能比尝试动态更改堆栈大小更容易!而不是递归,将当前节点(以及您通过子节点的距离的索引,如果超过两个)推送到堆栈上,移动到下一个子节点等,当您处理叶子时,弹出前一个节点/堆栈中的位置

标签: scala stack-overflow


【解决方案1】:

如果是 scala,它几乎可以肯定是在某种 JVM 上运行。堆栈大小是 JVM 的属性之一,在其生命周期内保持不变。所以我猜你只使用递归就不走运了。

看看: programatically setting max java heap size

如果它是尾递归,您可以将其转换为迭代,但我想您已经知道了。

【讨论】:

    【解决方案2】:

    我不知道你能不能做到,但是......你听说过尾递归吗?这是一种改进递归函数的方法,scala有这个特性。

    看看这个来自 scala 的创建者的video,看看你是否可以做类似的事情(至少对于最后一次调用,因为每个节点需要 2 次调用)。

    【讨论】:

    • 当然,我知道尾递归,但在我的情况下这是不可能的,因为一个节点可能有多个孩子,而且我去年已经完成了这门课程,谢谢!
    【解决方案3】:

    不,在 Scala 中没有办法做到这一点,但请注意,对于树的遍历,重要的不是节点的数量,而是树的 深度。换句话说,就是从根到最远叶子的距离。这些是在任何给定时间保留在堆栈中的唯一节点。对于 30,000 个节点的平衡二叉树,该深度为 15。要达到接近 10,000 的深度需要相当多的不平衡。

    【讨论】:

    • 你是对的,但是由于这是一个算法问题,我们可以有一个链很长的测试用例。谢谢!
    猜你喜欢
    • 2018-02-04
    • 2019-07-02
    • 1970-01-01
    • 2015-03-23
    • 2017-10-27
    • 2012-06-18
    • 2019-06-08
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多