问题引入:
1.给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
2.给定一个千万级别数据量的整数集合,判断哪些是重复元素。
3.给定一个千万级别数据量的整形数组,对其进行排序。
4.在5亿个整数中找出不重复的整数(注意,假设内存不足以容纳这5亿个整数)。
从数据量上看,使用常规的解法(普通排序算法,逐个比较等)明显不合适,所以这里我们引入一个新的解法,就是Bitmap。
Bitmap就是用一个bit位来标记某个元素对应的Value, 而Key即是该bit的位序。由于采用了Bit为单位来存储数据,因此可以大大节省存储空间。 bitmap通过1个位表示一个状态,比如:int类型有2^32个数字,即4G个数字,那么每个数字一个状态,就是2^32个bit,即512 MB(也就是说,用512兆存储空间就可以处理4G个数据,即40+亿数据)。
下面是我用C++写的一个bitmap类,可以通过构造对象时传入数据规模,动态申请所需的内存,然后处理用户的大量数据:
1 #include<iostream>
2 #include<fstream>
3 #include<ctime>
4 using namespace std;
5 const unsigned SIZE = 512000000;//512兆静态存储区可处理40.96亿数据
6
7 class Bitmap {
8 typedef struct Byte {
9 unsigned char bit8;
10 static const unsigned char mask[9];//用来取得一个字节每一位的辅助数组
11 Byte()
12 {
13 bit8 = 0;
14 }
15 //设置该位,就是存储该数
16 void set1(unsigned at)
17 {
18 bit8 |= mask[at];
19 }
20 //读取该位是否有数
21 bool get1(unsigned at)
22 {
23 return bit8 & mask[at];
24 }
25 <