1,在处理海量数据的时候,必须要高效利用内存空间,否则内存不可能存下这么多数据。如果我只想记录某个数据的存在性,可以利用bitmap原理,把每个数据映射为一个bit。1表示存在,0把表示不存在。
2,bitmap原理:
涉及到的变量
bitmap:一个char型数组,用于存储信息。
index:bitmap中的一个位置
size:bitmap中能存储的数据个数。
base:计划存储数据的最小值。base和size存在的意义是为了让处理数据限定在一个范围内,而不是int类型的整个范围,从而控制bitmap的大小。
data:所处理的一个数据,数据的范围在base~base+size。
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- char *g_bitmap = NULL;
- char g_size=0;
- char g_base=0;
- //Build a bitmap with base and size
- //the data should in [base~base+size]
- int bitmap_init(int size, int start)
- {
- g_size = size/8 + 1;
- g_base = start;
- g_bitmap = new char[g_size];
- if(NULL == g_bitmap)
- return 0;
- memset(g_bitmap, 0x0, g_size);
- return 1;
- }
- //translate data to mark
- //1 means 1, 0 means 0, -1 means error.
- int bitmap_get(int data)
- {
- int q = (data-g_base)/8;
- int r = (data-g_base)%8;
- unsigned char x = (0x1<<r);
- if(q > g_size)
- return -1;
- unsigned char res = (g_bitmap[q] & x);
- return res>0?1:0;
- }
- //mark data to 1
- int bitmap_set(int data)
- {
- int q = (data-g_base)/8;
- int r = (data-g_base)%8;
- unsigned char x = (0x1<<r);
- if(q > g_size)
- return -1;
- g_bitmap[q] |= x;
- return 1;
- }
- int bitmap_free()
- {
- delete[] g_bitmap;
- g_bitmap=NULL;
- return 0;
- }
- int main()
- {
- const int N=100;
- int a[]={5,8,7,6,78};
- int i;
- bitmap_init(N,0);
- for(i=0;i<5;i++)
- bitmap_set(a[i]);
- for(i=0;i<N;i++)
- if(bitmap_get(i))
- cout<<i<<" ";
- cout<<endl;
- bitmap_free();
- return 1;
- }