在Ruby中打印N个元素数组的N个第一个排列的有效方法

时间:2013-01-13 19:49:44

标签: ruby memory permutation out-of-memory

我需要做的事情非常简单,所以我不需要创建一个复杂的程序,我只需要使用一次,结果是我现在正在工作的真实项目的feed数据

我需要获得一组N个元素的50个第一(或更好,50个randoms)组合,每个值从2到50为N.

在Ruby中,从逻辑上讲,将类似于

require 'pp'

pp (1..50).to_a.permutation.to_a.first(50)

但遗憾的是,这些程序总是内存不足。事实上,我在机器上生成的“最大”数字是10,我需要50。

我很确定存在一些其他更有效的方法来实现这一点,但由于我不太了解所涉及的数学,我需要拼命地请求你的帮助。你们中的任何人都知道某些宝石,库,甚至是以不消耗所有内存的方式执行此操作的算法。如果速度慢,就像我说的那样,我只需要生成一次。

3 个答案:

答案 0 :(得分:3)

使用Enumerable的#take方法:

pp (1..50).to_a.permutation.take(50)

答案 1 :(得分:2)

不要在排列枚举器上调用to_a,只需将其用作枚举器:

(1..50).to_a.permutation.first(50)

但是如果你想要随机排列,你可以将数组洗牌50次:

ar = (1..50).to_a
Array.new(50){ar.shuffle}

答案 2 :(得分:0)

我认为您将不得不一次迭代并生成一个数组以防止内存问题。 e.g。

1.upto(50) do |i|
  store permutions_for i
end

def permutions_for(size)
  #get permutions for the given size
end

def store(arr)
  # print, save to db, whatever, just don't keep it in memory :)
end