分析
- 为什么要这样做:还是用网上的例子,从10亿个未排序整型数字查找一个数字
- 整型int:4字节,32位,10亿个,查找过程需要内存大概4GB,10亿约等于2的30次方
- 使用位图:查找过程需要内存大概4KB
- set函数
- index为数组索引
- pos,一个int整型数字转化为二进制有32位,所以我们可以将这32位当作32个数字
- 当index=0时,二进制从左到右分别代表0 1 2 3 4 5...30 31
- 当index=1时,二进制从左到右分别代表32 33 34 35...62 63
- 用或运算更改二进制相应位置的数字
- 比如当前index=0位置的二进制为0 0 0...0 0,bitMap[index]=0
- 完成set(31)后,变为0 0 0...0 1,bitMap[index]=1
- 完成set(1)后,变为1 0 0...0 1,bitMap[index]=32
- find函数
- 完成set后,那么只要求出index和pos,进行与运算即可完成查找
代码
#include <iostream>
#include <vector>
using namespace std;
#define N 20//bitMap大小
vector<int> bitMap(N);
void set(int num){
int index=num>>5; //位运算,右移5位,即除以32
int pos=num%32;
bitMap[index]|=1<<(31-pos);
}
bool find(int num){
int index=num>>5;
int pos=num%32;
if(bitMap[index]&(1<<(31-pos))) return true;
else return false;
}
void test(){
set(1);
set(31);
set(32);
set(1000);
cout << find(32) << endl;
cout << find(100) << endl;
}
int main(){
test();
}