【问题标题】:How do I generate set partitions of a certain size?如何生成一定大小的集合分区?
【发布时间】:2012-01-28 14:30:27
【问题描述】:

我想以特定方式为集合生成分区:我需要在生成这些分区的过程中过滤掉所有大小不是 N 的分区。一般的解决方案是“Generate all “unique” subsets of a set (not a powerset)”。

对于具有以下子集的集合S

[a,b,c]
[a,b]
[c]
[d,e,f]
[d,f]
[e]

以及以下“独特”元素:

a, b, c, d, e, f

使用参数N = 2 运行的函数/方法的结果应该是:

[[a,b,c], [d,e,f]]

虽然下面的分区应该被函数/方法过滤掉:

[[a,b,c], [d,f], [e]]
[[a,b], [c], [d,e,f]]
[[a,b], [c], [d,f], [e]]

底层数据结构并不重要,可以是数组、集合等。


原因:我需要在获得所有分区的完整集之前过滤掉一些分区,因为生成所有分区的函数/方法的计算量相当大。


根据“Generating the Partitions of a Set”,可能的分区数可能很大:44152005855084346 表示 23 个元素。我的数据是起始集中的 50-300 个元素,所以我肯定需要过滤掉大小不等于 N 的分区,然后再将它们保存在任何地方。

【问题讨论】:

  • 您使用的是Set 对象还是数组?
  • 为什么N=2 生成包含三个元素的集合?您是否使用从零开始的计数?还是结果集中子集的数量?
  • @Phrogz,N 是结果集中子集的数量。
  • 如果你使用数组,你应该在问题中这样写。在问题中,你写的好像它们是集合一样,这会让人感到困惑。
  • 你是说S = [["a", "b", "c"], ["a", "b"], ["c"], ["d", "e", "f"], ["d", "f"], ["e"]]吗?

标签: ruby set data-partitioning powerset


【解决方案1】:

一旦您拥有 Frederick Cheung 提供的 partitions 并链接,请执行以下操作:

partitions.select{|partition| partition.length == 2}

【讨论】:

  • 谢谢,但我不能使用这个明显的解决方案,因为我需要在分区的生成过程中过滤掉它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多