我想生成一个列表的所有排列,但我想在将它们添加到堆栈或存储在任何地方之前过滤掉一些排列。
我将根据一些自定义的临时规则过滤掉排列。
换句话说,我想生成一个大列表(50-300 个元素)的排列列表,但我想在这个过程中扔掉大部分生成的排列(我知道完整的数字排列数是 N!
)。
我已经尝试使用 Ruby 的 Array.permutation.to_a
,但看起来它在执行期间保持了完整的堆栈,所以我很快就用完了内存 (8 GB)。
我也试过this Erlang 解决方案,但它的性能似乎与之前的 Ruby 解决方案类似。
这个问题有没有定制的解决方案?
最佳答案
Ruby 的 Array.permutation.to_a
确实会生成一个数组。那就不要使用 to_a
了!它的意思是“排列”。 Array.permutation
为您提供一个“枚举器”,一个生成器。由于您想要排除大多数排列,因此请在其上使用 reject
。
res = [1,2,3,4].permutation(3).reject do |perm|
perm.first.even? #if this line is true, the perm will be rejected
end
将生成三个元素的所有排列,并拒绝第一个位置为偶数的排列。但是嗯……你有没有看到有多少 300!是吗?
关于ruby - 无需递归或使用 Ruby/Erlang 堆栈迭代生成排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8480487/