【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器

07-16 1656阅读

目录

1 -> 位图

1.1 -> 位图的概念

1.2 -> 位图的应用

2 -> 布隆过滤器

2.1 -> 布隆过滤器的提出 

2.2 -> 布隆过滤器的概念

2.3 -> 布隆过滤器的插入

2.4 -> 布隆过滤器的查找

2.5 -> 布隆过滤器的删除

2.6 -> 布隆过滤器的优点

2.7 -> 布隆过滤器的缺陷


【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器

1 -> 位图

1.1 -> 位图的概念

位图的概念:所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据是否存在的。

下面是一道面试题:

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

  1. 遍历,时间复杂度O(N)。
  2. 排序(O(NlogN)),利用二分查找:logN。
  3. 位图解决:数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:

【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器

#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 -> 位图的应用

  1. 快速查找某个数据是否在一个集合中。
  2. 排序 + 去重。
  3. 求两个集合的交集、并集等。
  4. 操作系统中磁盘块标记。

2 -> 布隆过滤器

2.1 -> 布隆过滤器的提出 

我们在使用新闻客户端看新闻时,它会不停地给我们推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。那么问题来了,新闻客户端推荐系统是如何实现推送去重的呢?用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。如何快速查找呢?

  1. 用哈希表存储用户记录,缺点:浪费空间。
  2. 用位图存储用户记录,缺点:位图一般只能处理整形,如果内容编号是字符串,就无法处理了。
  3. 将哈希与位图结合,即布隆过滤器。

2.2 -> 布隆过滤器的概念

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方法不仅可以提升查询效率,也可以节省大量的内存空间。

【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器

2.3 -> 布隆过滤器的插入

【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器

向布隆过滤器中插入:“baidu”。

【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器

【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器

#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 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]