【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
目录
1 -> 位图
1.1 -> 位图的概念
1.2 -> 位图的应用
2 -> 布隆过滤器
2.1 -> 布隆过滤器的提出
2.2 -> 布隆过滤器的概念
2.3 -> 布隆过滤器的插入
2.4 -> 布隆过滤器的查找
2.5 -> 布隆过滤器的删除
2.6 -> 布隆过滤器的优点
2.7 -> 布隆过滤器的缺陷
1 -> 位图
1.1 -> 位图的概念
位图的概念:所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据是否存在的。
下面是一道面试题:
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。
- 遍历,时间复杂度O(N)。
- 排序(O(NlogN)),利用二分查找:logN。
- 位图解决:数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:
#define _CRT_SECURE_NO_WARNINGS 1#include #include using namespace std;class bitset{public:bitset(size_t bitCount): _bit((bitCount >> 5) + 1), _bitCount(bitCount){}// 将which比特位置1void set(size_t which){if (which > _bitCount)return;size_t index = (which >> 5);size_t pos = which % 32;_bit[index] |= (1 < _bitCount)return;size_t index = (which >> 5);size_t pos = which % 32;_bit[index] &= ~(1 < _bitCount)return false;size_t index = (which >> 5);size_t pos = which % 32;return _bit[index] & (1 << pos);}// 获取位图中比特位的总个数size_t size()const { return _bitCount; }// 位图中比特为1的个数size_t Count()const{int bitCnttable[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5,