bitmap是一种广泛使用的数据结构,主要用在数据压缩,索引等方面,它最小单位为位,即01结构。通常情况下逻辑状态为是非二值状态时,bitmap比较常用。
如:腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
显然可以发现,需要判断给出的整数是否存在,是一个二值逻辑,可以用bitmap来解决。我们可以用bitmap来建立一个hashmap,消耗O(N)的预处理时间,去实现O(1)的查询。我们发现40亿刚好可以用unsigned来表示.
如何构造hash函数,其实很简单,1)确定hashmap的容量,由于整数类型为unsigned int,容量unsigned MAXI=(1<<32)-1;接着建立数组int a[MAXI/32+1]. 2)对于每个整数i,i/32对应数组a中的位置,i%32对于a[i/32]这个32位二进制的位置。
举个例子:对于号码 89256,由于89256 mod 32=2789…8,这样我们应该置a[2789]中32位字符串的第8位(从低位数起)为1.
#include<iostream>
using namespace std;
#define WORD 32
#define SHIFT 5 移动5个位,左移则相当于乘以32,右移相当于除以32取整
#define MASK 0x1F //16进制下的31
#define N 10000000
int bitmap[1+N/WORD];
/*
* 置位函数——用"|"操作符,i&MASK相当于mod操作
* m mod n 运算,当n = 2的X次幂的时候,m mod n = m&(n-1)
*/
void set(int i)
{
bitmap[i>>SHIFT]|=(1<<(i&MASK));
}
/* 清除位操作,用&~操作符 */
void clear(int i)
{
bitmap[i>>SHIFT]&=~(1<<(i & MASK));
}
/* 测试位操作用&操作符 */
int test(int i)
{
return bitmap[i>>SHIFT]&(1<<(i&MASK));
}
int main()
{
//unsigned i;
//i=(1<<32)-1;
//cout<<i<<endl;
return 0;
}