迭代生成排列而无需递归或使用Ruby / Erlang进行堆栈

时间:2011-12-12 20:37:16

标签: ruby recursion erlang stack permutation

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

我将根据一些自定义ad-hoc规则过滤出排列。

换句话说,我想生成一个大型列表的排列列表(50-300个元素),但我想在此过程中抛出大部分生成的排列(我知道全部数字)排列是N!)。

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

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

这个问题是否有任何自定义解决方案?

P.S。我看过thisthis,但不幸的是我不知道C / C ++。

1 个答案:

答案 0 :(得分:8)

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!是