提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
bitset的介绍
如果有40亿个不重复的无符号的整数,乱序,给出一个无符号的整数,如果快速判断那个数是否在这其中呢?
1.要判断一个数,无非就是把这些数排序,然后二分查找
2.或者是放入unordered_set容器中,然后使用find查找
这两种方法前者的效率是O(NlogN) 后者是O(lN)
但是麻烦的就是这40亿个数,我们必须要将这些数全部保存到内存当中去,这就要消耗大约16G的内存,空间消耗太大了,单从空间消耗上去看这两种方法都是不可行的。
所以就要用到了位图
位图的引入
无符号整数的个数是2^32
就需要2^32个比特位,才占内存512M的内存空间,相比较与16G大大缩小了,所以空间效率达到质的飞跃
位图的概念
位图,就是每一个比特位来存放某一状态,适用于海量的数据,以及无重复数据的场景。通常是用来判断某一数据是否存在.
位图的应用
常见的位图的应用如下:
1.快速查找某一个数据是否在某个集合中
2.排序
3.求两个集合的交集或者并集等等
4.操作系统中磁盘块标记
5.内核中信号标志位(信号屏蔽字和未决信号等等)
bitset的使用
bitset的定义方式
方式一:bitset<8> ag;//00000000
构造一个8位的位图,所有位都初始化为0
方式二:bitset<8> ag(2);//00000010
构造一个8位的位图,所有位构成初始化为2
方式三:bitset<8> ag(string("10101010")
构造一个8位的位图,所有位根据string的0/1序列初始化位图的前n位, string的size比bitset的size小,就前面补0,大就取前bitset.size位
bitset的成员函数
bitset运算符的使用
使用示例:
#include<bitset> //使用位图头文件
//位图的介绍与使用
void test01()
{
bitset<8> bs;//设置8位的位图 00000000全部初始化为0
bs.set(2)