【问题标题】:Is there an easy way of finding nonrepeating groups of subsets of a set?有没有一种简单的方法可以找到一组不重复的子集组?
【发布时间】:2017-11-27 15:17:12
【问题描述】:

假设我有一个集合:{1,2,...,N},我想找到 K 个非空子集的不重复组,每个子集中具有特定数量的元素。

例如:设置:{1,2,3,4,5,6,7} 子集数量3,元素数量3,3,1。这将生成如下组:{{1,2,3},{4,5,6},{7}} or {{5,7,2},{4,3,1},{6}} 等。

在这种情况下,所有可能组的数量等于C(7,3)*C(4,3)*C(1,1)*1/(2!) = 35*4/2 = 70

如果我要生成第一个组合,然后生成第二个组合,我会得到 140 个结果,因为这种方法不会考虑阶乘。

所以我的问题是: 有没有一种简单的方法可以检查小组是否已经出现?我是否需要创建一个包含所有先前计算的组的数组,并每次检查新组是否已经生成?

【问题讨论】:

  • “我想查找非重复组” - 您的意思是要列出非重复组吗?你能举一个“重复”组的例子(你不想找到的那种)吗?
  • @גלעד ברקן 当然,对于集合 {1,2,3,4,5},子集数 3,元素数 2,2,1 的两个重复组的示例,将是: {{1,2},{3,4},{5}} 和 {{3,4},{1,2},{5}}。但我想通了!这是我的解决方案:cpp.sh/67lwt 它的作用:它列出了构成第二类 S{n,k} 的任何斯特林数的所有集合,并写出所有这些集合的数量(S{n, k})。输入由两个正整数 n 和 k 组成,其中 n>=k。源代码很糟糕,但是,嘿,我对编程很陌生,而且它可以工作,所以这足以让我开心!感谢您的关心!

标签: algorithm math combinations combinatorics


【解决方案1】:

生成所有组,但仅在 lexicographical order 中出现相同大小的子集时才保留一个组。

例如,您将保留组{{1,2,3},{4,5,6},{7}},因为{1,2,3} 按字典顺序在{4,5,6} 之前。

但是,您将丢弃组{{5,7,2},{4,3,1},{6}},因为{5,7,2} 应该跟随{4,3,1}。理论上,在某些时候你会生成组{{4,3,1},{5,7,2},{6}},它的顺序是正确的,因此会被保留。


下一级优化是生成所有组,而只生成字典顺序正确的组。例如,如果第一个子集是{5,7,2},那么第二个子集必须是{6,x,y} 的形式,因为6 是唯一一个大于5 的未使用数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2011-01-03
    • 2020-02-16
    • 1970-01-01
    • 2019-06-15
    • 2012-01-05
    • 2011-01-29
    相关资源
    最近更新 更多