【问题标题】:Mergesort: getting java.lang.StackOverflowError for 100000 numbers but not for 10000 [duplicate]合并排序:获取 100000 个数字的 java.lang.StackOverflowError 但不是 10000 [重复]
【发布时间】:2014-05-13 18:06:02
【问题描述】:

我的代码适用于 10000 但不适用于 100000 个数字。

错误发生在

result.add(next);
result.addAll(mergeInt(left,right));

代码如下:

private static ArrayList<Integer> mergeSortInt(ArrayList<Integer> array)
    {
        if (array.size() <= 1) return array;

        ArrayList<Integer> left = new ArrayList<>();
        ArrayList<Integer> right = new ArrayList<>();

        for (int i = 0; i < array.size() / 2; i++)
        {
            left.add(array.get(i));
        }
        for (int i = array.size() / 2; i < array.size(); i++) 
        {
            right.add(array.get(i));
        }

        return mergeInt(mergeSortInt(left), mergeSortInt(right));
    }

    private static ArrayList<Integer> mergeInt(ArrayList<Integer> left, ArrayList<Integer> right)
    {
        if (left.size() == 0) return right;
        if (right.size() == 0) return left;

        ArrayList<Integer> result = new ArrayList<Integer>();

        int next;

        if (left.get(0) > right.get(0))
        {
            next = right.get(0);
            right.remove(0);
        }
        else 
        {
            next = left.get(0);
            left.remove(0);
        }

        result.add(next);
        result.addAll(mergeInt(left,right));

        return result;
    }

StackOverFlowError 到底是什么?为什么它只发生在大量数字上?

提前致谢:)

编辑:

我真的不明白这是怎么重复的,因为我还专门针对我的代码寻求帮助。

【问题讨论】:

  • 方法调用进入堆栈。当你递归到太深的层次时,你的溢出你的堆栈会试图在上面放太多东西。它(以抽象的方式)类似于代码中的无限循环(或只是一个非常长的循环)。
  • @JesanFafon - “当你重复太深时......”。是的,这经常让你反复诅咒,但这完全是另一个词。

标签: java mergesort stack-overflow


【解决方案1】:

当堆栈中有太多存储方法环境时会发生 StackOverflowError。当一个函数调用另一个函数时,它必须将其变量和状态存储在堆栈帧中。当对另一个函数的调用返回时,原始函数的帧被弹出并用于恢复函数的状态。

由于合并排序是一种递归算法,mergeInt 将在每次递归调用自身时将另一帧推入堆栈。合并排序需要深度为log_2 n 递归调用,其中n 是输入的长度。因此,当您增加n 时,您会增加必须创建和存储的堆栈帧的数量。如果其中太多,您将收到 StackOverflowError。

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多