C++——哈希4 布隆过滤器_布隆过滤器c++


布隆过滤器

位图只能映射整形,而对于字符串却无能为力。

把字符串用哈希算法转成整形,映射一个位置进行标记

下面就是布隆过滤器设计思路

位图是直接定址法,不存在冲突,而字符串可能转成整形后,会有重合的地方,发生下面这种冲突(误判)。

布隆过滤器存在误判,如这里如果美团不存在,而B站存在,此时美团的位置被B站占据,有可能会误判为美团此时存在。

这种误判不可能完全去掉,但我们可以通过优化降低误判率。

优化方法:让每个值多映射几个位,如美团映射好几个位,就能减少上面误判的概率。理论而言,一个值映射的位越多,误判冲突的概率就越低,但如果映射过多,空间消耗就会增大。

判断某邮箱是否在黑名单中,可用布隆过滤器进行简单的过滤

完整代码

struct HashBKDR
{
	// BKDR
	size_t operator()(const string& key)
	{
		size_t val = 0;
		for (auto ch : key)
		{
			val *= 131;
			val += ch;
		}

		return val;
	}
};
struct HashAP
{
	// BKDR
	size_t operator()(const string& key)
	{
		size_t hash = 0;
		for (size_t i = 0; i < key.size(); i++)
		{
			if ((i & 1) == 0)
			{
				hash ^= ((hash << 7) ^ key[i] ^ (hash >> 3));
			}
			else
			{
				hash ^= (~((hash << 11) ^ key[i] ^ (hash >> 5)));
			}
		}
		return hash;
	}
};

struct HashDJB
{
	// BKDR
	size_t operator()(const string& key)
	{
		size_t hash = 5381;
		for (auto ch : key)
		{
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值