输出一个集合的幂集(所有子集)
2017-03-18 15:40
288 查看
问题描述:如一个抽象集合{1,2,3},它的所有子集包括{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}共2的n次方个,此问题又叫求集合的幂集。
注意生成子集的时候是从下至上生成子集的,意思是最后生成的空集。
代码实现参考了http://www.geeksforgeeks.org/power-set/的思路
思路来源:http://www.geeksforgeeks.org/power-set/
解决该问题用了很长的时间,自己真的很菜,借鉴了许多其他人的思路,算不上自己原创,这里只是做一个总结,希望下一次遇到类似的问题能过有一些思路也好。
一、递归实现
减治法的减一的思想可以用到这个问题中来,对集合A={a1,a2,···,an},将其子集分为2组,一组为{a1,···,an-1}的子集,一组为{an},一旦我们得到了{a1,···,an-1}的所有子集列表,将列表中的每个元素都加上an,在把它们添加到列表中,以求得所有子集。下面是生成{a1,a2,a3}的子集示例:注意生成子集的时候是从下至上生成子集的,意思是最后生成的空集。
代码实现参考了http://www.geeksforgeeks.org/power-set/的思路
int SIZE = 5; void printPowerSet2(char *set, int set_size) { //递归出口,当当前集合不能够在分解为下一个子集的时候输出所有集合元素 if (set_size == 0) { printf("{"); for (int i = 0; i < SIZE; i++) if (set[i] != ' ') printf("%c", set[i]); printf("}"); printf("\n"); } else { //直接递归,递归生成当前集合的所有下一个状态 printPowerSet2(set, set_size - 1); //动态生成子集合存储空间,通过使用空白字符替换每个位置的方式生成当前元素个数的每个子集 //递归的在生成子集中继续查找子集 if (set_size > 0) { char *sub_set = (char *)malloc(sizeof(char)*set_size); strcpy(sub_set, set); sub_set[set_size - 1] = ' '; printPowerSet2(sub_set, set_size - 1); } } }
二、使用位运算
建立对于n个元素集合A={a1,a2,···,an}的所有2的n次方个子集和长度为n的所有2的n次方个位串之间的一一对应关系,如果ai属于该子集,bi=1,如果ai不属于该子集,bi=0。思路来源:http://www.geeksforgeeks.org/power-set/
void printPowerSet(char *set, int set_size) { int pow_set_size = pow(2, set_size); int counter, j; for (counter = 0; counter < pow_set_size; counter++) { for (j = 0; j < set_size; j++) { if (counter & (1 << j)) printf("%c", set[j]); } printf("\n"); } }
解决该问题用了很长的时间,自己真的很菜,借鉴了许多其他人的思路,算不上自己原创,这里只是做一个总结,希望下一次遇到类似的问题能过有一些思路也好。
相关文章推荐
- 输出一个集合的所有子集
- 怎么计算一个集合的幂集(所有子集形成的集合)的长度?涉及组合数学基础
- 输出一个集合所有子集的元素和(Print sums of all subsets of a given set)
- 输出一个集合的所有子集(算法)
- 输出一个集合的所有子集,从长到短
- 给定一个集合,输出它的所有子集(JAVA实现)
- 输入一个集合,输出这个集合的所有子集
- 给定一个集合,输出它的所有子集
- 输出一个集合的所有子集
- 求一个集合的所有子集 输出一个数所有平方和的情况 背包问题的递归解决
- 有一个集合A,它又n个元素,请用回溯法输出它所有的子集。
- 输出一个集合的所有子集(算法)
- 输出一个集合的所有子集(算法)
- 输出集合的所有子集(幂集)-C语言
- 输出一个集合的所有子集合-Java代码实现(一)
- 求一个集合的所有子集问题
- 输出一个集合所有的子集合
- 两种方法寻找一个集合的所有子集
- LeetCode(Subsets)找出一个集合的所有子集
- 输出一个集合的所有子集合