【问题标题】: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 的问题,你不会找到比它更快的算法。
  • 是的,我的意思是。是这样吗 ? :-(
  • 只有在不必生成所有对的情况下才能做得更好,并且可以更好地对生成进行排序。
  • stackoverflow.com/questions/127704/…。这个问题可能与那个问题重复。
  • @AmireddyTharunreddy 您自己说过:您的算法需要在 1000 个元素的集合中生成 499,500 对唯一元素。您的算法无法改变这一点。

标签: c++ algorithm math


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多