位图(bitmap)实现与应用

本文详细介绍了位图的原理,包括如何使用位图节省空间,以及位图在处理大规模数据集时的应用,如在2.5亿个整数中找出不重复的整数和在40亿个不重复的整数中快速查找特定数值。通过具体代码示例,展示了位图设置、测试和清除操作的实现。
摘要由CSDN通过智能技术生成

 

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

转载于:https://www.cnblogs.com/ZJUKasuosuo/archive/2012/08/07/2626550.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值