C++数据结构--组合学--查找集合的所有子集

1.查找所有子集
  对于集合S,如果S有n个元素,则它有2的n次方个子集
  问题求解步骤:
   *假设S有n个元素,从S中删除元素x,剩下n-1个元素构成一个新的集合S1,则S1有2的n-1次方个子集.
   *将元素x加入S1中的每个子集中,这样就产生了新的2的n-1次方个子集,这些新子集和S1构成了集合S的所有子集
    Example:对于集合S{1,2,3}
   


    实现代码:


#include
#include
using namespace std;


template
set> combination(set &s)
{
set> result;
//结果集
set>   prime;//保存从S中删除元素x后的集合S1的所有子集 
set> prime_plus;//保存从s1的每个子集加上X后构成的所有子集 
   if(s.empty())  //空集时结束递归 
{
   set empty; //空集
result.insert(empty);
return result;
}
   
T temVal=*s.begin(); //保存X 
s.erase(s.begin());  //从S集合中删除X 
prime=combination(s);
auto it=prime.begin();
set temSet;
for(;it!=prime.end();it++) //从s1的每个子集加上X 
{
temSet=*it;
temSet.insert(temVal);
prime_plus.insert(temSet);
}

for(set x:prime) //把prime加到结果集中 
  result.insert(x);
 
for(set x:prime_plus) //把prime_plus加到结果集中  
  result.insert(x);
  
  
return  result;


}






测试代码:
template
//打印所有子集 
void print(set> &ss)
{
for(set p:ss)
{
if(p.empty())
 cout<<"{}"<
else
{
cout<<"{";
for(T x:p)
 cout<
cout<<"}"<
  

     
}
}
  
int main () 
{
   set s{1,2,3};
   
   set> res=combination(s);


   print(res);
   return 0;
}



运行结果:

C++数据结构--组合学--查找集合的所有子集_第1张图片

你可能感兴趣的:(C++数据结构与STL)