用Ruby编写一个高效的程序,打印出一个包含N个元素的数组的前N个排列组合。

4
我需要做的事情非常简单,所以我不需要创建一个复杂的程序,只需要使用一次,将这个结果作为我正在工作的真实项目的数据输入。

我需要获取 N 元素集合的前 50 个(或者更好的随机的 50 个)组合,其中 N 的值从 2 到 50 不等。

在 Ruby 中,逻辑上会是这样:

require 'pp'

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

但可悲的是,这些程序总是会用完内存。事实上,在我的机器上,“最大”数字只能生成10个,而我需要50个。
我很确定有其他更有效的方法来实现这一点,但因为我不太了解所涉及的数学知识,所以我迫切需要您的帮助。你们中有人知道一些宝石、库或者甚至是算法,可以以不消耗所有内存的方式完成这个任务吗?慢一点没关系,正如我所说,我只需要生成这个东西一次。

你能添加一下你的排列方法的示例吗? - Maximilian Stroh
我使用的排列方法是 Ruby 标准类中 Array 类的标准方法。 - Nisanio
3个回答

3
不要在排列枚举器上调用 to_a 方法,只需将其用作枚举器即可:
(1..50).to_a.permutation.first(50)

但是如果您想要随机排列,只需将数组随机洗牌50次:

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

3

使用Enumerable#take方法:

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

1
你可以添加 shuffle 来获取随机的数字:(1..50).to_a.shuffle.permutation.take(50) - hdgarrood

0

我认为你需要迭代并逐个生成数组以避免内存问题。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接