【问题标题】:Get all possible subsets - preserving order获取所有可能的子集 - 保留顺序
【发布时间】:2012-04-01 17:47:02
【问题描述】:

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

【问题讨论】:

    标签: ruby algorithm subset


    【解决方案1】:

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

    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
    

    【讨论】:

    • 这真的很有帮助。由于我需要具有确切数量的分隔符的组合,我发现我的问题也可以专门针对这个问题:stackoverflow.com/questions/1851134/… 但由于我的集合很小,所以现在给出的函数和过滤掉不合适的组合是好的。
    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多