如何生成集合的所有唯一子集?

Posted

技术标签:

【中文标题】如何生成集合的所有唯一子集?【英文标题】:How to generate all the unique subsets of a set? 【发布时间】:2017-04-14 15:44:59 【问题描述】:

最近我遇到了一个算法问题,它要求从给定的集合中生成唯一的子集。 假设当集合是 S=1, 2, 3, 4 其中n=4(元素数量)。 那么结果应该生成所有n*(n-1)/2 子集:- (1,2),(1,3),(1,4),(2,3),(2,4),(3,4)

#include<iostream>
int main()

int k;
std::cin>>k;
for(long int i=1;i<=k;i++)

    for(long int j=i+1;j<=k;j++)
    
        std::cout<<i<<" "<<j<<"\n";
    

return 0;

我有一个 O(n^2) 方法,但出现的问题是当数字很大时 对于 n=1000,它需要大量时间,因为它必须生成 499,500 个元素!

有没有人在复杂性方面有更好的解决方案?算法将不胜感激!

【问题讨论】:

“子集”是指“独特元素对”吗?这基本上是一个 n^2 的问题,你不会找到比它更快的算法。 是的,我的意思是。是这样吗 ? :-( 只有在不必生成所有对的情况下才能做得更好,并且可以更好地对生成进行排序。 见***.com/questions/127704/…。这个问题可能与那个问题重复。 @AmireddyTharunreddy 您自己说过:您的算法需要在 1000 个元素的集合中生成 499,500 对唯一元素。您的算法无法改变这一点。 【参考方案1】:

大小为n 的集合的子集数为2^n。在这里,可能只询问大小为2 的子集。因此,此类子集的数量为n*(n-1)/2

由于这些集合中的每一个都是唯一的,因此要生成它们,至少需要进行那么多计算。

因此,对于这些情况,最小复杂度受这些数字 Ω(n^2) and Ω(2^n) 的限制。

【讨论】:

以上是关于如何生成集合的所有唯一子集?的主要内容,如果未能解决你的问题,请参考以下文章

查找使唯一单词最大化的句子子集

如何生成多重集的所有排列?

在C中创建n个项目的k和m个组合的所有可能子集[重复]

如何获取集合的所有子集? (动力装置)

集合 Subset Sums

关联规则1