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

时间:2017-11-27 05:21:23

标签: algorithm math combinations combinatorics

我们说我有一个集合:{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 个答案:

答案 0 :(得分:0)

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

例如,您将保留组Promise<undefined>,因为Promise<void>在字典顺序中位于{{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}的数字。