BitSet位图
腾讯面试题:
给40亿个无符号整形的不重复的数据,如何迅速判断一个数是否在这40亿个数中。
分析:40亿个数据实在太多并且不重复,并且我们不必知道这些数据的大小,只需标记这些数是否存在。因此我们可以想到用位图来解决这个问题,这样只需占大概500M的内存空间。实现方法如下:
#pragma once
#include<vector>
class BitMap
{
public:
BitMap()
{}
BitMap(size_t n)
{
_bitMap.resize((n >> 5) + 1);
}
void set(size_t x) //把位置1
{
size_t index = x >> 5; //index表示的是占用的是第几个字符
size_t num = x % 32; //num表示的是占用字符中的第几个位置
_bitMap[index] |= (1 << num); //将num所指的位置为1
}
void reset(size_t x) //把位置0
{
size_t index = x >> 5;
size_t num = x % 32;
_bitMap[index] &= (~(1 << num)); //将num所指的位置为0
}
bool Test(size_t x) //测试某一位是0还是1
{
size_t index = x >> 5;
size_t num = x % 32;
return _bitMap[index] & (1 << num);
}
private:
vector<size_t> _bitMap;
};
void test() //测试
{
BitMap bm1(500);
bm1.set(4);
bm1.set(44);
bm1.set(444);
bm1.reset(44);
cout<<bm1.Test(444)<<endl;
cout<<bm1.Test(23)<<endl;
}