布隆过滤器简介

适用场景

检测某个元素是否是巨量数据集合中的成员。

一般操作

检测某个元素是否是一个数据集合中的成员,我们第一时间想到的就是使用哈希。
但是仅仅使用哈希是不够的,当数据非常多的时候,就会有这样的问题:

如果只使用一个哈希容器,多个数经过哈希计算后会得到一样的值,如果要查找到具体的某个值的话,单个节点必须存储原来的值。那么如果数据非常多,比如有10GB,那么这个哈希容器也不会小于10GB。

布隆过滤器原理

  1. 同时使用多个不同的哈希容器。

比如容器1,容器2,容器3分别为mapA,mapB,mapC。

  1. 如果在容器中该位置的数存在,那么该位置的值就设置为1。

比如容器1号为mapA,key在mapA的计算结果为5,那么就设置mapA[5]=1,表示5这个位置的数已经存在。同样mapB,mapC中该位置的值也设置为1。

  1. 查找元素的时候,查看多个容器中该值是否存在,如果多个容器中都存在,那么表明这个元素在数据集合中,如果有一个容器中该值不存在,那么该值就不再数据集合中。

比如现在有一个值key,三个容器mapA,mapB,mapC判断:
mapA.get(key)==1
mapB.get(key)==1
mapC.get(key)==1
如果三个都等于1,那么判断就在数据集合中,如果一个不为1就不在数据集合中。

误判率

布隆过滤器不会发生漏判,但是会有误判的情况。进过数学分析,能得到以下几个公式:

假设,集合大小为n,哈希容器的个数为k,哈希容器大小为m,误判率为p。

最优哈希容器个数为:
在这里插入图片描述
已知集合大小n,并设定好误判率p,求哈希容器大小。
在这里插入图片描述

布隆过滤器改进

布隆过滤器在使用时有个缺点:

无法删除集合成员,只能增加成员并对其查询。

改进方式:

每个位置不再是原来的1,而是一个计数器,该位置多一个值就加1。
如果要删除某个成员的时候就减1。

你可能感兴趣的:(bloom,布隆过滤器,后台,【后端】)