位图(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大小的数据现在的内存还是可以比较容易的表示出来。
图示分析: