有没有一种简单的方法可以找到一组子集的非重复组?

Is there an easy way of finding nonrepeating groups of subsets of a set?

假设我有一个集合:{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 个结果,因为这种方法不会考虑阶乘。

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

生成所有组,但仅当 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 的数字。