获取所有可能的子集 - 维持秩序
问题描述:
这是一个跟进这个问题: 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]]
答
我已经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
看到我的其他答案的如何以及为什么这个工程的完整说明。
答
如果我理解正确的话,你要插入 “分隔符” 到一个列表,对其分区。以你的榜样,并使用|
字符表示分隔符,
1 2 3
1 2|3
1|2 3
1|2|3
是你想要的解决方案。
在列表中(我称之为列表而不是集合,因为您需要保存订单)n
元素,有n-1
潜在的分隔符位置。在上面的例子中,有两个位置。在每个位置,分隔符可能存在也可能不存在。
您可以使用从0
到2^(n-1) - 1
的数字的二进制表示来列出分隔符的所有可能排列。在你的例子中,这将是0..3的数字。
0: 00
1: 01
2: 10
3: 11
这真的很有帮助。由于我需要组合的确切数量的分隔符,我发现我的问题也可以专门针对这个问题:http://stackoverflow.com/questions/1851134/generate-all-binary-strings-of-length-n-with- k-bits-set,但由于我有小的集合,给出的函数和过滤掉非拟合的组合对现在来说是有好处的。 – mbdev 2012-03-16 18:11:05