2012-03-16 11 views
2

を保存: Generate all "unique" subsets of a set (not a powerset)すべての可能なサブセットを取得する - これは、この質問にフォローアップされるため

私の問題は同じですが、私はときに新しいサブセット内の項目の順序がより最適化されたソリューションがあるかもしれないと思うと、サブセット全体で保存する必要があります。

例:

[1, 2, 3] 

につながる:私はそれを正しく理解していれば、あなたはそれを分割するために、リストに "区切り文字" を挿入したい

[[1], [2], [3]] 
[[1, 2], [3]] 
[[1], [2, 3]] 
[[1, 2, 3]] 

答えて

2

私はalready answered this question for Pythonてきたので、私はすぐにルビーの上で、私の解決策を移植:

def spannings(lst) 
    return enum_for(:spannings, lst) unless block_given? 

    yield [lst] 
    (1...lst.size).each do |i| 
    spannings(lst[i..-1]) do |rest| 
     yield [lst[0,i]] + rest 
    end 
    end 
end 

p spannings([1,2,3,4]).to_a 

をどのように、なぜこの作品の完全な説明については、私の他の回答を参照してください。

3

。あなたの例を取ると、区切りを示すために|文字を使用して、

1 2 3 
1 2|3 
1|2 3 
1|2|3 

は、あなたが望むソリューションです。

n要素のリスト(これはリストを保存しておく必要があるためリストではありません)では、区切り文字の候補位置はn-1です。上記の例では、2つのポジションがあります。各位置で、デリミタが存在する場合と存在しない場合があります。

0から2^(n-1) - 1までの数値のバイナリ表現を使用して、可能なすべての区切り文字の並びを表示できます。あなたの例では、これは0..3からの数字になります。

0: 00 
1: 01 
2: 10 
3: 11 
+0

これは本当に便利となっています。 http://stackoverflow.com/questions/1851134/generate-all-binary-strings-of-length-n-with-:私は区切り文字の正確な数との組み合わせを必要とするので、私は私の問題もこの質問に特化したことができましたk-bits-setであるが、私は小さなセットを持っているので、与えられた関数と適合しない組み合わせを除外することは今のところ良いことだ。 – mbdev

関連する問題