布隆过滤器Bloom Filter简介

布隆过滤器Bloom Filter简介

背景:

如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率:

  • 采用线性表存储,查找时间复杂度为O(N)
  • 采用平衡二叉排序树(AVL、红黑树)存储,查找时间复杂度为O(logN)
  • 采用哈希表存储,考虑到哈希碰撞,整体时间复杂度也要O[log(n/m)]

当需要判断一个元素是否存在于海量数据集合中,不仅查找时间慢,还会占用大量存储空间,接下来看一下布隆过滤器如何解决这个问题

 

1、什么是布隆过滤器:

布隆过滤器是一种空间效率很高的随机数据结构,专门用来检测集合中是否存在特定的元素。布隆过滤器由一个长度为m比特的位数组与k个独立的哈希函数组成的数据结构。位数组初始化均为0,所有的哈希函数都可以分别把输入数据尽量均匀地散列。当要向布隆过滤器中插入一个元素时,该元素经过k个哈希函数计算产生k个哈希值,以哈希值作为位数组中的下标,将所有k个对应的比特值由0置为1。当要查询一个元素时,同样将其经过哈希函数计算产生哈希值,然后检查对应的k个比特值:如果有任意一个比特为0,表明该元素一定不在集合中;如果所有比特均为1,表明该元素有可能性在集合中。

由于可能出现哈希碰撞,不同元素计算的哈希值有可能一样,导致一个不存在的元素有可能对应的比特位为1,这就是所谓“假阳性”(false positive)。相对地,“假阴性”(false negative)在BF中是绝不会出现的。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。

所以,布隆过滤器认为不在的,一定不会在集合中;布隆过滤器认为在的,不一定存在集合中。

2、算法实现步骤:

  • (1)选取k个哈希函数,记为 {h1,h2,…,hk},至于参数k的选择问题,我后面再说。
  • (2)假设现在有n个元素需要被映射到bit数组中,bit数组的长度是m。初始时,将m位的bit数组的每个位置的元素都置为0。一样地,关于参数m的选择我之后说。
  • (3)现在,把这个n个元素依次用第1步选取的k个哈希函数映射到bit数组的位置上,bit数组被映射到的位置的元素变为1。显然,一个元素能被映射到k个位置上。过程如图所示,现在把元素集合{x,y,z}通过3个哈希函数映射到一个二进制数组中。
  • (4)最后,需要检查一个元素是否在已有的集合中时,同样用这k个哈希函数把要判断的元素映射到bit数组的位置上,只要bit数组被映射到的位中有一个位不是1,那一定说明了这个元素不在已有的集合内。如图所示,检查w是否在集合中时,有一个哈希函数将ww映射到了bit数组的元素为0的位置。

布隆过滤器Bloom Filter简介

3、布隆过滤器优缺点

(1)优点:

  • 节省空间:不需要存储数据本身,只需要存储数据对应hash比特位
  • 时间复杂度低:插入和查找的时间复杂度都为O(k),k为哈希函数的个数

(2)缺点:

  • 存在假阳性:布隆过滤器判断存在,但可能出现元素实际上不在集合中的情况;误判率取决于哈希函数的个数,对于哈希函数的个数选择,我们第4部分会讲
  • 不支持删除元素:如果一个元素被删除,但是却不能从布隆过滤器中删除,这也是存在假阳性的原因之一

4、参数的选择:

假设E表示错误率,n表示要插入的元素个数,m表示bit数组的长度,k表示hash函数的个数。

(1)当hash函数个数 k = (ln2) * (m/n)时,错误率E最小(此时bit数组中有一半的值为0)

(2)在错误率不大于E的情况下,bit数组的长度m需要满足的条件为:m ≥ n * lg(1/E)。

(3)结合上面两个公式,在hash函数个数k取到最优时,要求错误率不大于E,这时我们对bit数组长度m的要求是:m>=nlg(1/E) * lg(e) ,也就是 m ≥ 1.44n*lg(1/E)(lg表示以2为底的对数)

这里我给这几个参数最终的结论,对这几个参数的推导过程有兴趣的读者,可以阅读这篇文章:https://blog.csdn.net/guoziqing506/article/details/52852515

5、布隆过滤器的应用场景:

  • 爬虫系统url去重
  • 垃圾邮件过滤
  • 黑名单

问题实例:

给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢? 

如果允许找过的URL有一定的错误率,那么我们可以使用布隆过滤器来实现。根据这个问题我们来计算下内存占用,4G = 2^32大概是40亿*8大概是340亿的bit数组,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。 现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一一对应的,就可以转换成ip,则大大简单了。 

具体做法就是:将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url

5、如何解决布隆过滤器不支持删除的问题:

(1)counting bloom filter:

Counting Bloom Filter将标准 Bloom Filter位数组的每一位扩展为一个小的计数器(counter),在插入元素时给对应的k(k为哈希函数个数)个Counter的值分别加1,删除元素时给对应的k个Counter的值分别减1。Counting Bloom Filter通过多占用几倍的存储空间的代价,给Bloom Filter增加了删除操作。

布隆过滤器Bloom Filter简介

(2)布谷鸟过滤器:

对于这种方式有兴趣的读者可以阅读这篇文章:https://juejin.cn/post/6924636027948630029#heading-1

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100024.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 由3个a,5个b,2个c构成的所有字符串_如何计算A且B的概率

    由3个a,5个b,2个c构成的所有字符串_如何计算A且B的概率7-3 A-B 本题要求你计算A−B。不过麻烦的是,A和B都是字符串 ——即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。输入格式: 输入在2行中先后给出字符串A和B。两字符串的长度都不超过10 ​4 ​​,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。输出格式: 在一行中打印出A−B的结果字符串。输入样例: I love …

    2022年8月18日
  • 参考平面及其高度_某层平面图的剖切位置高度一般是离该层地面1.0米–求规范出处…

    参考平面及其高度_某层平面图的剖切位置高度一般是离该层地面1.0米–求规范出处…某层平面图的剖切位置高度一般是离该层地面1.0米–求规范出处通气孔,图内应包括剖切面及投影方向可见的建筑构造以及必要的尺寸,如需表示高窗、洞口、标高等没有规范规定剖切高度一般来说剖切高度是1500左右吧人视线位置可以剖到正常高度的门窗洞口建筑制图标准GB/T50104—20014.1.4建筑物平面图应在建筑物的门窗洞口处水平剖切俯视(屋顶平面图应在屋面以上俯视)、槽一般情况下都…

    2022年5月9日
  • 怎样将生成的xml文件进行格式化

    怎样将生成的xml文件进行格式化最近有在项目中生成xml文件,但是生成之后的xml文件打开之后,是一坨,看起来真的不美观,要是能够格式化输出来就好了。这里说明一下,我使用DOM4J的方式生成的xmlpublicstaticv

    2022年7月1日
  • css让div居中显示_css页面居中

    css让div居中显示_css页面居中css中设置div元素居中显示的四种方法一、先确定div的基本样式二、具体实现方法第一种:利用子绝父相和margin:auto实现第二种:利用子绝父相和过渡动画tranform实现第三种:同样是利用子绝父相和margin负值实现第四种:利用flex弹性盒布局实现一、先确定div的基本样式先给div随便设置些基本的样式,这样所得到的结果容易看出效果。css结构: <styletype=”text/css”> *{ margin:0; height:0; }..

    2022年10月26日
  • 2021-IP地址详解02「建议收藏」

    2021-IP地址详解02「建议收藏」网络域网:一般称为内网单局域网的构成:交换机,网线,PC()交换机:用来组件内网的局域网的设备ip地址ip地址就是一个唯一的标识,是一段网络编码(二进制)由32位构成11010010.01001001.10001100.00000110=210.73.140.6ip地址的形式:X.X.X.XX的范围:0-255子网掩码局域网通信规则:在同一局域网中,所有的IP必须在同一网段中才能互通通信!IP地址构成:网络位:网络位+主机位(网络位相同的IP地址,位同一网段)

    2022年6月24日
  • 算法导论——lec 10 图的基本算法及应用

    算法导论——lec 10 图的基本算法及应用

    2022年1月28日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号