假设我们有一个求集合的全部子集(包含集合自身)的需求,即有一个集合s,包含两个元素 <a,b>,则其全部的子集为<a,ab,b>.
不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1。
本文分别讲述两种实现方法:
一:位图法:
1)构造一个和集合一样大小的数组A,分别与集合中的某个元素对应,数组A中的元素只有两种状态:“1”和“0”,分别代表每次子集输出中集合中对应元素是否要输出,这样数组A可以看作是原集合的一个标记位图。
2)数组A模拟整数“加一”的操作,每“加一”之后,就将原集合中所有与数组A中值为“1”的相对应的元素输出。
设原集合为<a,b,c,d>,数组A的某次“加一”后的状态为[1,0,1,1],则本次输出的子集为<a,c,d>。
具体代码如下:
/*使用非递归的思想 如果有一个数组 大小为n
那么就使用n 位的二进制 如果对应的位为1 那么就输出这个位
如果对应的位为0 那么就不输出这个位*/
/*
使用位图的思想 构造一个位集合 大小和数组大小一样,如果位图中相应的
位为1,表示可以输出这个数组中的元素 如果位图中相应位为0 表示数组中相应位不输出
这里模拟位图使用的数组 ,这里的重点是模拟数组加1的操作
*/
/*使用数组模拟位图加1的操作 数组可以一直加1 直到数组内所有元素都是1
函数返回值为bool 数组初始化最高位为1*/
#define MAX_LEN 10
void bitmap(char str[],const int n)
{
bitset<MAX_LEN> cou