布隆过滤器和位图

海量数据查询

方法:

用哈希表和数组,空间都太大,而且哈希表还会产生哈希冲突。

1,位图

用位来标记一个数字是否存在

class bitMap{
private:
	vector _bit;//4*8=32位
public:
	bitMap(int range) {
		_bit.resize(range/32+1,0);
		/*
		32位数就可以存储在一个整数的32位当中,range/32就是看一看需要多少个整数,
		+1是因为range/32不一定整除,可能还有几个数,或者range小于32.
		*/
	}
	void set(int num) {
		//找到应该存储在哪一个下标中
		int idx = num / 32;
		//找到存储在下标中的哪一个位上,一定要注意:每一个数据在32位上只占据一个位,一一对应的关系 
		int bitIdx = num % 32;
		//注意,移动的对象是1,
		_bit[idx] |= 1 << bitIdx;
	}
	bool find(const int num) {
	    //找到下标
		int idx = num / 32;
		//找到位下标
		int bitIdx = num % 32;
		//把1移动指定位置,看看这个位置是否也是1
		return _bit[idx] & (1 << bitIdx);
	}
	void reset(int num) {
		//找到下标
		int idx = num / 32;
		//找到位下标
		int bitIdx = num % 32;
		_bit[idx] &= ~(1<

详情链接

2,布隆过滤器

就是当数据类特别大的时候,位图已经不能继续变大了,那么位图大小不变,怎么表示数据。

位图加上n个哈希函数表示一个数字。也就是利用位图中的多个下标表示一个数据。

用这n个哈希函数计算出这个数在位图中的n个下标,这些下标都设置为1,用来 表示这个数。

缺点--误判:

有一个位0一定不存在,全都为1,这个1不一定是这个数设置的。

不存在必真,存在不一定。

你可能感兴趣的:(c++)