【问题标题】:Efficient way to print the N first permutations of an array of N Elements in Ruby在Ruby中打印N个元素数组的N个第一个排列的有效方法
【发布时间】:2012-12-27 18:21:19
【问题描述】:

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

我需要获得一组 N 个元素的前 50 个(或者,最好是 50 个随机数)组合,从 2 到 50 的每个值都是 N。

在 Ruby 中,逻辑上是这样的

require 'pp'

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

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

我很确定存在其他更有效的方法来实现这一点,但是因为我不太了解所涉及的数学,所以我需要拼命寻求您的帮助。你们中的任何人都知道一些gem、库,甚至是一种算法,它们以一种不消耗所有内存的方式来做到这一点。慢没关系,就像我说的,我只需要生成一次这个东西。

【问题讨论】:

  • 你能添加一个你的排列方法的样本吗?
  • 我使用的排列是Ruby标准类上Array类的标准方法

标签: ruby memory permutation out-of-memory


【解决方案1】:

我认为您将不得不一次迭代并生成一个数组,以防止出现内存问题。例如

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

【讨论】:

    【解决方案2】:

    使用Enumerable的#take方法:

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

    【讨论】:

    • 您可以添加 shuffle 以获取随机数:(1..50).to_a.shuffle.permutation.take(50)
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多