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

时间:2017-04-14 15:44:59

标签: c++ algorithm math

最近我遇到了一个算法问题,要求从给定集合中生成唯一的子集。 假设当集合是 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个元素!

有没有人有明智的解决方案复杂性?算法将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

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

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