题目:
给40亿个不重复的无符号整型,没排过序。给一个无符号整数,如何快速判断这个数是否存在在这40亿个数中
set()函数图解
reset()函数图解
“BitMap.h”
<strong><span style="font-size:18px;">#pragma once
#include<vector>
class BitMap
{
public:
//range 范围
BitMap(size_t range)
{
//size_t有四个字节,每个字节有八个位
//右移5相当于除以32
_bitmap.resize((range>>5) + 1);
}
void Set(size_t x)//0->1
{
//先求出在第几个数上
size_t index = x/32;//相当于x>>5
//在求出在第几个位上
size_t num = x%32;
_bitmap[index] |= (1<<num);
}
void Reset(size_t x)//1->0
{
size_t index = x/32;
size_t num = x%32;
_bitmap[index] &= (~(1<< num));
}
bool Test(size_t x)//x存在与否
{
size_t index = x/32;
size_t num = x%32;
return _bitmap[index] & (1<<num);
}
private:
vector<size_t> _bitmap;
};</span></strong>
“test.cpp”
<strong><span style="font-size:18px;">#include<iostream>
using namespace std;
#include"bitset.h"
void test()
{
BitMap bm(400);
bm.Set(2);
bm.Set(22);
bm.Set(222);
cout<<"set(2) set(22) set(222)"<<endl;
cout<<"set(2) ? "<<bm.Test(2)<<endl;
cout<<"set(22) ? "<<bm.Test(22)<<endl;
cout<<"set(222) ? "<<bm.Test(222)<<endl;
cout<<"set(3) ? "<<bm.Test(3)<<endl;
bm.Reset(22);
cout<<endl<<"reset(22)"<<endl;
cout<<"set(2) ? "<<bm.Test(2)<<endl;
cout<<"set(22) ? "<<bm.Test(22)<<endl;
cout<<"set(222) ? "<<bm.Test(222)<<endl;
cout<<"set(3) ? "<<bm.Test(3)<<endl;
}
int main()
{
test();
return 0;
}</span></strong>