位图(bitmap)实现与应用

 

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

posted @ 2012-08-07 13:24  kasuosuo  阅读(763)  评论(0编辑  收藏  举报