2016-06-21 5 views
1

私はパーミュテーションとコンビネーションの違いを理解していると思います:レイジー評価を使用して配列の長さNの組み合わせを取得するにはどうすればよいですか?

つまり、[1,20,30].permutation(3).map(&:sort).uniqは​​と同じです。

私は現在、アレイの組み合わせの全てを取得するプログラムを持っている:

array = [1,20,30,40,50,60] 
1.upto(array.length).each do |combination_length| 
    array.combination(combination_length).each do |combination| 
    # ... do something here with the combination ... 
    end 
end 

私はメモリ消費量を削減しようとしていると私は私がarray.combination(combination_length).eachに代わるものを見つけるべきだと思います。

Ruby docs for Lazy Enumeratorscombinationの方法を示していないようです。 Array#combinationメソッドのソースはC言語で書かれているので、私は実際にそれを変更するスキルは持っていません。

私は特にやろうとしていることarray.combination結果の各要素に対してブロックを実行しているが、私が最初にメモリにすべての長さ-Nの組み合わせをロードする必要はありません

私が理解できるcombinationの実装を見回しましたが、難しい時期です。

答えて

2

"私が特にやろうとしているのは、array.combinationの結果の要素ごとにブロックを実行することですが、最初にすべての長さNの組み合わせをメモリにロードしたくありません。

これはまさにあなたのコードがやっていることです。ブロックなしでcombinationメソッドを呼び出すと、結果として列挙子が生成されます。次に、そのeachメソッドを使用します。一度に1つの組み合わせだけがメモリに格納されます。

+0

したがって、遅延評価は列挙型オブジェクトのデフォルトですか? –

+0

怠惰なプログラマーは配列を生成し、 'each'メソッドを使うだけで、列挙子を持つ点が完全には分かりません。一般的にはい、列挙子は怠惰です。 – steenslag

関連する問題