位图查找

分析

  1. 为什么要这样做:还是用网上的例子,从10亿个未排序整型数字查找一个数字
    • 整型int:4字节,32位,10亿个,查找过程需要内存大概4GB,10亿约等于2的30次方
    • 使用位图:查找过程需要内存大概4KB
  2. 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
  3. 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();
}
posted @ 2020-10-10 17:19  肥斯大只仔  阅读(134)  评论(0编辑  收藏  举报