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

Algorithm 有没有一种简单的方法可以找到集合子集的非重复群?,algorithm,math,combinations,combinatorics,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}或{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,…,N}
,我想找到K个非空子集的非重复组,每个子集中有特定数量的元素

例如:集合:
{1,2,3,4,5,6,7}
子集数
3
,元素数
3,3,1
。这将生成如下组:
{{1,2,3}、{4,5,6}、{7}或{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,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

的未使用的数字,生成所有组,但仅当出现相同大小的子集时才保留一个组

例如,您将保留组
{{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

“我想找到非重复组”的未使用数字,您的意思是要列出非重复组吗?你能举一个“重复”群的例子吗(你不喜欢找的那种)?当然,一个集合{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。源代码非常糟糕,但是,嘿,我对编程非常陌生,而且它可以工作,所以它足以让我高兴!谢谢你的关心!“我想找到非重复组”-你是说你想列出非重复组吗?你能举一个“重复”群的例子吗(你不喜欢找的那种)?当然,一个集合{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。源代码非常糟糕,但是,嘿,我对编程非常陌生,而且它可以工作,所以它足以让我高兴!谢谢你的关心!