获取所有可能的子集 - 保留顺序

时间:2012-03-16 06:33:11

标签: ruby algorithm subset

这是对这个问题的跟进: 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 个答案:

答案 0 :(得分:3)

如果我理解正确,你想在列表中插入“分隔符”,对其进行分区。以您的示例为例,并使用|字符指示分隔符,

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

是您想要的解决方案。

n元素的列表中(我称之为列表而不是集合,因为您需要保留订单),分隔符有n-1个潜在位置。在上面的例子中,有两个位置。在每个位置,分隔符可能存在也可能不存在。

您可以使用02^(n-1) - 1中数字的二进制表示来列出所有可能的分隔符排列。在您的示例中,这将是从0..3开始的数字。

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

答案 1 :(得分:2)

already answered this question for Python,所以我很快将我的解决方案移植到Ruby:

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

请参阅我的其他答案,以获得有关其工作原理和原因的完整说明。