位图模拟实现

来源:互联网 发布:网络金融运营模式 编辑:程序博客网 时间:2024/05/20 07:50

位图(BitMap):


位图是一个数组的每个数据的每个二进制位表示一个数据,0表示数据不存在,1表示数据存在。通常用来判断一个数据存在或者不存在。


优点:节省空间


位图代码实现:


#include<vector>using namespace std;class BitSet{public:BitSet(size_t n){_a.resize((n >> 5) + 1, 0);}void Set(size_t n)//设置{//先计算在那个区间size_t index = n >> 5;//在计算在那个位上size_t pos = n % 32;_a[index] |= (1 << pos);}void ReSet(size_t n)//复位重新置为0{//先计算在那个区间size_t index = n >> 5;//在计算在那个位上size_t pos = n % 32;_a[index] &= ~(1 << pos);}bool Test(size_t n)//判断某一个位置是0还是1{//先计算在那个区间size_t index = n >> 5;//在计算在那个位上size_t pos = n % 32;//直接与1相与return _a[index] & (1 << pos);}protected:vector<size_t> _a;};

位图面试题分析:


题目:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】


分析:


(1)计算占用空间大小:40亿int数据如果存起来大概需要16G的空间(显然要想直接将这16G的数据放到内存中现在的大多数计算机还是达不到的);

(2)采用位图这种存储结构,计算需要的空间大小;

(3)因为一个数存在不存在只需要用两种状态就可以表示出来(1存在,0不存在);

(4)所以一个int数据有32个位,可以表示32个数据存在不存在,因此16G的数据用位图来存在只需要500M左右的空间;

(5)500M大小的数据现在的内存还是可以比较容易的表示出来。


图示分析:





0 0