我们说我有一个集合:{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个结果,因为这个方法不会考虑因子。
所以我的问题是:是否有一种简单的方法来检查某个群组是否已经出现过?我是否需要创建一个包含所有先前计算的组的数组,并在每次检查是否已生成新组时进行检查?
答案 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}
的数字。