4

私がしなければならないことは非常に単純なので、複雑なプログラムを作成する必要はなく、これを 1 回使用するだけでよく、この結果を現在取り組んでいる実際のプロジェクトのフィード データにします。

2 から 50 までのすべての値を N として、N 個の要素のセットの最初の 50 個の (または、より適切には 50 個のランダムな) 組み合わせを取得する必要があります。

Rubyでは、論理的には次のようになります

require 'pp'

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

しかし悲しいことに、そのプログラムは常にメモリ不足になりました。実際のところ、私のマシンで生成できる「最大」数は 10 であり、50 が必要です。

これを達成するためのより効率的な方法が他にあると確信していますが、関連する数学がよくわからないため、必死に助けを求める必要があります. すべてのメモリを消費しない方法でそれを行う宝石、ライブラリ、またはアルゴリズムについて知っている人はいますか。私が言ったように、遅いかどうかは問題ではありません。これを生成する必要があるのは一度だけです。

4

3 に答える 3

3

#takeEnumerableのメソッドを使用します。

pp (1..50).to_a.permutation.take(50)
于 2013-01-13T20:51:38.553 に答える
3

順列列挙子を呼び出すto_aのではなく、列挙子として使用してください。

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

しかし、ランダムな順列が必要な場合は、配列を 50 回シャッフルするだけです。

ar = (1..50).to_a
Array.new(50){ar.shuffle}
于 2013-01-13T21:31:11.793 に答える
0

メモリの問題を防ぐために、配列を 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
于 2013-01-13T20:44:54.797 に答える