1. 位图主要是为了节省空间,如一个整数有32位,那么可以用这个整数的32位来表示32个整数。
2. 实现代码如下:
View Code
1 #include<iostream> 2 #include <fstream> 3 #include <cassert> 4 5 using namespace std; 6 7 #define INT_BITS sizeof(int) 8 #define SHIFT 5 //2^5=32 9 #define MASK 0x1f //31 10 #define MAX 1024*1024*1024 //可以表示的最大整数 11 int bitmap[MAX/INT_BITS+1]; 12 13 /* 14 * i>>SHIFT求出i存储在bitmap中的下标索引 15 * i & MASK相当于 i % MASK 16 * 思想是先找到i存储在bitmap哪一个位置,之后 17 * 再将这个位置上的相应位置为1 18 */ 19 void set(int i) 20 { 21 bitmap[i>>SHIFT] |= 1 << (i & MASK); 22 } 23 24 //获取i所在位是否为0 25 int test(int i) 26 { 27 return bitmap[i>>SHIFT] & (1 << (i & MASK)); 28 } 29 30 //将i所在位清零 31 int clear(int i) 32 { 33 return bitmap[i >> SHIFT] & (~(1 << (i & MASK))); 34 } 35 36 //位排序算法 37 //适应于整数排序 38 39 void BitCount(int *number,int length) 40 { 41 for (int i=0;i<=MAX;i++) 42 { 43 clear(i); 44 } 45 for(int i=0;i<length;i++) 46 { 47 set(*(number+i)); 48 } 49 } 50 51 void print() 52 { 53 for (int i=0;i<=MAX;i++) 54 { 55 if (test(i)) 56 { 57 cout<<i<<" "; 58 } 59 } 60 cout<<endl; 61 } 62 63 int main() 64 { 65 enum {length=10}; 66 int number[length]={234,123,345,1,0,32,31,63,64,9999}; 67 BitCount(number,length); 68 print(); 69 }
3. 位图的主要应用:压缩
两个小题目:
(1)在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数?
答:使用位存储,因为在位存储过程中,相同的元素只使用一位来存储。
(2)腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
答:使用为存储,然后用test检验i是否存在。
4. 位排序很重要。
参考文章:
http://dongxicheng.org/structure/bitmap/
http://blog.csdn.net/QIBAOYUAN/archive/2010/09/29/5914662.aspx