目录
背景介绍
在一些场景下面,有大量数据需要判断是否存在,而这些数据不是整形,导致位图就派不上用场。这时,时代无比呼唤一种新的解决方案,布隆过滤器也就应运而生了。
简介
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好得多,缺点是有一定的误判率和删除困难。
布隆过滤器的实现思路
BloomFilter的实现思路就是把key通过哈希函数转换成整型后在映射一个二进制位。也就是说,BloomFilter = bitset(位图) + Hash函数。考虑到只映射一个位的话哈希冲突的概率较大,所以可以通过几个哈希函数转换出几个整型,然后映射多个二进制位,降低冲突率。

布隆过滤器的作用
布隆过滤器可以告诉我们“某样东西一定不存在或者可能存在”。换句话说,它判断一个值key在是不准确的,但是判断一个值key不在是准确的。下面对这句话做出解释。
判断一个值在是不准确的。原因在于布隆过滤器存在误判,也就是说不同的key映射的3个位置上都恰好与其他元素冲突,而且这些位置都被置为了1,返回结果就是在——这就是误判。
判断一个值不在是准确的。首先,导致返回结果为不存在有两种情况,第一:元素key本来就存在,但是由于误判,导致返回结果为不存在。第二:元素key本来就不存在,然后返回结果为不存在。针对第一种情况,因为布隆过滤器保证元素不被错误的删除,元素存在的话它映射的3个二进制位一定为1,所以这种情况不可能发生。只能是第二种情况,即只有不存在的值返回结果才是不存在,证明了判断一个值不在是准确的。
布隆过滤器误判率推导过程
数据量:n
误判率:p
bit数组的大小:m
哈希函数的个数:k
针对某个二进制位:
经过1次哈希函数映射后,不被置为1的概率:
经过k个哈希函数映射后该bit位仍未被置为1的概率:(某一个二进制位被置为1后,后面还是有可能会再次映射到该位置,故总的二进制位数还是m)
该二进制位在插入n个值后依旧未被置为1的概率:
则某个二进制位在插入n个值后被置为1的概率:
故误判的概率: ①
根据
①式可化为:

4万+

被折叠的 条评论
为什么被折叠?



