【问题标题】:quicksort implementation: stack level too deep (SystemStackError)快速排序实现:堆栈级别太深(SystemStackError)
【发布时间】:2011-11-08 22:10:39
【问题描述】:

所以我试图在 ruby​​ 中实现快速排序,但我收到了这个错误 `quicksort': stack level too deep (SystemStackError)

def quicksort(array)
  if array.length <= 1
    return array
  end
  less = Array.new
  greater = Array.new
  pivot = array[array.length/2]
  array.each do |x|
    if x < pivot
      less << x
    else 
      greater << x
    end
  end
  return quicksort(less) << pivot << quicksort(greater)
end

编辑 我将else 更改为elsif x &gt; pivot,它似乎可以工作。

【问题讨论】:

  • 快速排序最多可以使用 n 层堆栈(在病态的情况下),其中 n 是输入元素的数量。如果达到这种情况,那么只需增加堆栈大小、选择更好的枢轴方法(这只会减少病态的坏情况)或更改快速排序实现即可修复它。如果它发生在一个小的 n 上,那么终端条件当然是错误的 :) 导致这个异常的 [smallest] 输入是什么?
  • 在什么情况下会出现此错误?
  • 我改变了 else => elsif x > pivot 并且它似乎工作了。

标签: ruby algorithm


【解决方案1】:

当我生成一个用于测试的数组时,您的算法对我有用,甚至可以达到 1e7。

 quicksort Range.new(1,1e7).to_a.shuffle

当然,这需要大约 4.5 GB 的 RAM 才能完成。至于清理输出...

ruby-1.9.3-p0 :018 >       quicksort [1,3,2] # => [1, 2, [], 3, []] 
ruby-1.9.3-p0 :019 >     quicksort [1,4,2,3] # => [1, 2, [3, [4]]] 

改变这一行:

  return (quicksort(less) << pivot << quicksort(greater)).flatten.compact

它让一切变得更干净。

ruby-1.9.3-p0 :037 >       quicksort [1,3,2] # => [1, 2, 3] 
ruby-1.9.3-p0 :038 >     quicksort [1,4,2,3] # => [1, 2, 3, 4] 

【讨论】:

    【解决方案2】:

    您需要从数组中删除数据透视表,因为稍后您要重新添加它 所以而不是

    pivot = array[array.length/2]
    

    你应该做的

    pivot = array.delete_at(array.length/2)
    

    【讨论】:

      【解决方案3】:

      默认情况下,在 ruby​​ 中,堆栈大小设置得相当小。因此,使用大型数据集执行递归函数并不难。

      确保您不会无限递归的最简单方法是在非常小的数据集上运行 quicksort。如果它仍然爆炸,你就知道你在无限递归。

      您可以在 Matz 回复的this post 中找到有关堆栈大小的一些信息。

      【讨论】:

      • 但是在快速排序中堆栈大小应该保持非常小,除非实现对已经排序的数据进行分解。堆栈大小将在 lg(n) 左右 - 远小于任何脚本语言的限制,即使数组填满了所有内存!
      【解决方案4】:

      你的函数是无限递归的。使用 ruby​​-debug 找出原因。

      EDIT1:

      我想你希望函数的最后一行是这样的:

      return quicksort(less) + quicksort(greater)
      

      【讨论】:

        猜你喜欢
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 2016-09-10
        • 2013-10-05
        • 2014-10-25
        • 2017-08-19
        相关资源
        最近更新 更多