如何生成集合的所有唯一子集?
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)
的限制。
【讨论】:
以上是关于如何生成集合的所有唯一子集?的主要内容,如果未能解决你的问题,请参考以下文章