ruby - 无需递归或使用 Ruby/Erlang 堆栈迭代生成排列

标签 ruby recursion erlang stack permutation

我想生成一个列表的所有排列,但我想在将它们添加到堆栈或存储在任何地方之前过滤掉一些排列。

我将根据一些自定义的临时规则过滤掉排列。

换句话说,我想生成一个大列表(50-300 个元素)的排列列表,但我想在这个过程中扔掉大部分生成的排列(我知道完整的数字排列数是 N!)。

我已经尝试使用 Ruby 的 Array.permutation.to_a,但看起来它在执行期间保持了完整的堆栈,所以我很快就用完了内存 (8 GB)。

我也试过this Erlang 解决方案,但它的性能似乎与之前的 Ruby 解决方案类似。

这个问题有没有定制的解决方案?

附言我读过thisthis , 但不幸的是我不懂 C/C++。

最佳答案

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/

相关文章:

java - 属性值的组合

android - 递归调用 onActivityResult

c++ - 这个递归函数的时间复杂度是多少

erlang - 使用钢筋处理外部库

erlang - 列表中的整数打印为 "\v"?

ruby-on-rails - 仅当 URL 中存在参数时,Rails will_paginate 使用 :conditions,

html - 简单的 for 循环在 Jekyll 中不起作用

ruby-on-rails - 使用 devise 在 Ruby on Rails 中创建用户帐户设置页面

linux - 使操作系统为 Erlang 提供更多内存访问

css - sprockets + Less @import 问题?