- 位图实现:在位图中采用比特位表示对应的元素存在或者不存在0:不存在 1:存在,例如一个int整数有32个比特位可以表示0-31个整数。
- 实现代码
class BitMap
{
public:
BitMap(int size = 100)
{
_map.resize((size >> 5) + 1);
}
void set(int num)
{
int bite = num >> 5;
int bit = num % 32;
_map[bite] |= (1 << bit);
}
void reset(int num)
{
int bite = num >> 5;
int bit = num % 32;
_map[bite] &= ~(1 << bit);
}
bool test(int num)
{
int bite = num >> 5;
int bit = num % 32;
if (_map[bite] & (1 << bit))
return true;
else
return false;
}
private:
vector<int> _map;
};
int main()
{
BitMap _map(1024);
_map.set(1);
bool ret = _map.test(1);
_map.reset(1);
ret = _map.test(1);
_map.set(33);
ret = _map.test(33);
_map.reset(33);
ret = _map.test(33);
_map.set(555);
ret = _map.test(555);
ret = _map.test(100);
}
- 位图优点:速度快,内存空间占用小,能表示大范围数据
- 位图的缺点
1.可读性差
2.存储元素的个数比一般元素要多,但是存储元素的大小受空间大小的限制。 - 位图的应用
1)给定100亿个整数,设计算法找到只出现一次的整数
100亿个整数采用位图存储的话需要1.5G的内存,并且如果需要记录出现次数的话一个比特位
是无法做到的,我们需要2个比特位那么就需要2.5G的内存,如果我们系统的内存不足够的话,
我们需要将100亿个数据分成1000份文件,将每个文件的数据通过位图存储,我们采用两个比特位
00:没有出现,01,出现一次,10出现多次,11舍弃,再将这1000个文件中出现一次的数据,
统计到一个文件里
2)给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集
将第一个文件的数据分成1000份存储到位图里,再判断第二份文件中的数据是否在位图中。
3)1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
我们需要将100亿个数据分成1000份文件,将每个文件的数据通过位图存储,我们采用两个比特位
00:没有出现,01,出现一次,10出现2次,11舍弃,再将这1000个文件中出现不超过两次次的数据