【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比特位置1 void 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 >= 8; } } return count; } private: vector _bit; size_t _bitCount; };
1.2 -> 位图的应用
- 快速查找某个数据是否在一个集合中。
- 排序 + 去重。
- 求两个集合的交集、并集等。
- 操作系统中磁盘块标记。
2 -> 布隆过滤器
2.1 -> 布隆过滤器的提出
我们在使用新闻客户端看新闻时,它会不停地给我们推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。那么问题来了,新闻客户端推荐系统是如何实现推送去重的呢?用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。如何快速查找呢?
- 用哈希表存储用户记录,缺点:浪费空间。
- 用位图存储用户记录,缺点:位图一般只能处理整形,如果内容编号是字符串,就无法处理了。
- 将哈希与位图结合,即布隆过滤器。
2.2 -> 布隆过滤器的概念
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方法不仅可以提升查询效率,也可以节省大量的内存空间。
2.3 -> 布隆过滤器的插入
向布隆过滤器中插入:“baidu”。
#define _CRT_SECURE_NO_WARNINGS 1 #include using namespace std; struct BKDRHash { size_t operator()(const string& s) { // BKDR size_t value = 0; for (auto ch : s) { value *= 31; value += ch; } return value; } }; struct APHash { size_t operator()(const string& s) { size_t hash = 0; for (long i = 0; i 3)); } else { hash ^= (~((hash > 5))); } } return hash; } }; struct DJBHash { size_t operator()(const string& s) { size_t hash = 5381; for (auto ch : s) { hash += (hash
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。