【数据结构取经之路】布隆过滤器BloomFilter原理、误判率推导、代码实现

目录

背景介绍 

简介

布隆过滤器的实现思路

布隆过滤器的作用

布隆过滤器误判率推导过程

布隆过滤器的实现

布隆过滤器的删除问题 

 布隆过滤器的优缺点

布隆过滤器的应用


背景介绍 

在一些场景下面,有大量数据需要判断是否存在,而这些数据不是整形,导致位图就派不上用场。这时,时代无比呼唤一种新的解决方案,布隆过滤器也就应运而生了。

简介

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好得多,缺点是有一定的误判率和删除困难。

布隆过滤器的实现思路

BloomFilter的实现思路就是把key通过哈希函数转换成整型后在映射一个二进制位。也就是说,BloomFilter = bitset(位图) + Hash函数。考虑到只映射一个位的话哈希冲突的概率较大,所以可以通过几个哈希函数转换出几个整型,然后映射多个二进制位,降低冲突率。

布隆过滤器的作用

布隆过滤器可以告诉我们“某样东西一定不存在或者可能存在”。换句话说,它判断一个值key在是不准确的,但是判断一个值key不在是准确的。下面对这句话做出解释。

判断一个值在是不准确的。原因在于布隆过滤器存在误判,也就是说不同的key映射的3个位置上都恰好与其他元素冲突,而且这些位置都被置为了1,返回结果就是在——这就是误判。

判断一个值不在是准确的。首先,导致返回结果为不存在有两种情况,第一:元素key本来就存在,但是由于误判,导致返回结果为不存在。第二:元素key本来就不存在,然后返回结果为不存在。针对第一种情况,因为布隆过滤器保证元素不被错误的删除,元素存在的话它映射的3个二进制位一定为1,所以这种情况不可能发生。只能是第二种情况,即只有不存在的值返回结果才是不存在,证明了判断一个值不在是准确的。

布隆过滤器误判率推导过程

数据量:n

误判率:p

bit数组的大小:m

哈希函数的个数:k

针对某个二进制位:

经过1次哈希函数映射后,不被置为1的概率:1 - \frac{1}{m}

经过k个哈希函数映射后该bit位仍未被置为1的概率:(1 - \frac{1}{m})^{k}(某一个二进制位被置为1后,后面还是有可能会再次映射到该位置,故总的二进制位数还是m)

该二进制位在插入n个值后依旧未被置为1的概率:(1 - \frac{1}{m})^{kn}

则某个二进制位在插入n个值后被置为1的概率:1 - (1 - \frac{1}{m})^{kn}

故误判的概率:(1 - (1 - \frac{1}{m})^{kn})^{k} ①

根据 lim(1 + \frac{1}{x})^{x}= e(x\rightarrow \Join ) 

①式可化为:(1 - (1 - \frac{1}{m})^{kn})^{k}=  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值