【问题标题】:Merge Sort Algorithm fail合并排序算法失败
【发布时间】:2014-01-26 05:56:45
【问题描述】:

我在 python 中编写了一个合并排序算法。它在 10000 个数字之前完美运行,但在 10000 个数字之后它给了我分段错误 11。可能是什么问题?关于它的任何想法

def merge_count(arr):
    if len(arr) < 2:
        return (arr, 0)
    m = int(len(arr) / 2)
    left, l_counter = merge_count(arr[:m])
    right, r_counter = merge_count(arr[m:])
    return merge(left, right, l_counter + r_counter)


def merge(left, right, counter):
    if len(left) * len(right) == 0:
        return (left + right, counter)
    if left[len(left) - 1] > right[len(right) - 1]:
        val = left.pop(len(left) - 1)
        counter += len(right)
    else:
        val = right.pop(len(right) - 1)
    arr, counter = merge(left, right, counter)

    return (arr + [val], counter)

【问题讨论】:

  • 分段错误?在 Python 中?你到底做了什么?向我们展示代码。
  • 我添加了我的代码@user2357112

标签: python python-2.7 segmentation-fault


【解决方案1】:

看起来你有一个堆栈溢出。 merge 按照要合并的列表大小的顺序使用堆栈空间,这超出了 Python 可以处理的范围。通常,在你到达那个点之前,Python 会用RuntimeError 阻止你。您可能使用sys.setrecursionlimit 超过了安全限制。停止使用setrecursionlimit,并重写merge 以不使用递归。

【讨论】:

  • 是的,我使用了 sys.setrecursionlimit。除了改变我的递归合并函数还有其他方法吗?
  • @GüngörBasa:您可以切换到无堆栈 Python 实现或更改操作系统分配的堆栈空间量,但在 merge 中不使用递归很可能是最好的选择。
  • 感谢您的建议。 @user2357112
猜你喜欢
  • 2013-08-04
  • 2021-06-27
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多