博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法学习笔记】14.暴力求解法02 子集生成的三种方法
阅读量:6573 次
发布时间:2019-06-24

本文共 1198 字,大约阅读时间需要 3 分钟。

子集的生成

实例

input 

4

output  

1

1 2
1 2 3
1 2 3 4
1 2 4
1 3
1 3 4
1 4
2
2 3
2 3 4
2 4
3
3 4
4
请按任意键继续. . .(第一行是空行表示空集)

第一种方法:增量构造法

顾名思义,就是要用不断在已有子集的基础上不断增加新元素一直到无法继续增加时为止(这种方法的递归边界利用了“定序处理”的方案)

递归核心是这样的

//n 全集的元素数目 //A* 表示已经处理过的集合//cur 表示目前的位置 void zenglianggouzaofa(int n , int* A ,int cur){	//把已经完成的子集打印出来	for(int i=0;i

第二种方法,位向量法 = = 哇塞 好高端的词汇呢

这个方法的核心思路是这样:由全集确定其子集只要考虑每个元素的状态是否存在于该子集中即可。

所以用一个大数组(= = 就是所谓的位向量 B[]来记录每个元素的两种状态即可)其实用bool就好 不用int也可以

void  bitvector(int n,bool* B,int cur){	if(cur==n){		for(int i=0;i
注意:此种方法效率较第一种低。
因为他要求让所有的元素都要遍历完成时才能输出。这也是为何要cur==n时猜return的原因

另外 此种方法生成子集的顺序稍有不同

(此处空行表示空集)

4
3
3 4
2
2 4
2 3
2 3 4
1
1 4
1 3
1 3 4
1 2
1 2 4
1 2 3
1 2 3 4
请按任意键继续. . .

第三种方法更为高大上了:二进制法

这个呢 和位向量法有一个异曲同工的地方 就是用0,1来表示元素是否在集合内

此时用一个二进制数则非常好的解决了问题 而且还有大量按位运算可以用来对应集合运算,非常方便,效率也很高,主要是数据存储的空间也变小了

三种按位运算:

按位与----------->集合取交集

按位或----------->集合取并集

按位异或运算----------->集合取对称差

= = 第三个是亮点 异或运算还有个特殊的结论是A^B^B=A 不同是1 相同是0

举例 A={1,2,4} B = {2,3}  A=10110 B=01100 A^B=11010

所以A^B={1,4,3}就是将对方有而自己没有的加入进来就是了

void bin(int n){	//比如n=4 1<<4= 10000 = 16 	for(int i=0;i<(1<
结果是

1

2
1 2
3
1 3
2 3
1 2 3
4
1 4
2 4
1 2 4
3 4
1 3 4
2 3 4
1 2 3 4
请按任意键继续. . .

转载于:https://www.cnblogs.com/yuchenlin/p/4379260.html

你可能感兴趣的文章
暂时不想读研的几点理由
查看>>
增加临时表空间组Oracle11g单实例
查看>>
Diff Two Arrays
查看>>
stark组件(1):动态生成URL
查看>>
169. Majority Element
查看>>
大整数加法
查看>>
下拉菜单
查看>>
[清华集训2014]玛里苟斯
查看>>
Doctype作用?严格模式与混杂模式如何区分?它们有何意义
查看>>
0029-求最小的数
查看>>
【MVC+EasyUI实例】对数据网格的增删改查(上)
查看>>
第三章:如何建模服务
查看>>
EF CodeFirst下数据库更新
查看>>
Project Euler 345: Matrix Sum
查看>>
mysql允许远程登录
查看>>
你可能不知道的技术细节:存储过程参数传递的影响
查看>>
POJ1703 Find them, Catch them
查看>>
自适应备忘录 demo
查看>>
HTML转义字符大全(转)
查看>>
[摘录]调动员工积极性的七个关键
查看>>