`
plussai
  • 浏览: 88332 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

位图bitmap

 
阅读更多

        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;	
}

 

       

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics