布隆过滤器

布隆过滤器要解决的问题:黑名单问题

问题描述:
在这里插入图片描述
即:URL属于 黑名单则为true,不属于则为false。

介绍:URL是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息包括:文件的位置以及浏览器应该怎么处理它。

经典方法:用哈希表,查每一个url,返回对应true or false。但是要占很大的空间,不满足第二个条件。哈希表里面不用存value。只存key。所以是一个hashset(hashset这是什么意思?)

布隆过滤器的短板:存在失误率。 失误类型:宁可错杀三千,绝不放过一个 !
即如果有一个URL,确实属于黑名单里的东西,是不会误报的。比如url明明在黑名单里,却返回的是false,这种情况是不会出现的。会出现的是这种情况:一个url明明不再黑名单里,但是返回了true(在黑名单里),只有这种类型的失误

所以:如果面试者遇到网页黑名单系统、垃圾邮件过滤系统,爬虫的网页判重系统等题目,又看到系统容忍一定程
度的失误率,但是对空间要求比较严格
,那么很可能是面试官希望面试者具备布隆过滤器的知识。一个布隆
过滤器精确地代表一个集合,并可以精确判断一个元素是否在集合中(什么意思)
。注意,只是精确代表和精确判断,到
底有多精确呢?则完全在于你具体的设计,但想做到完全正确是不可能的。布隆过滤器的优势就在于使用很
少的空间就可以将准确率做到很高的程度
。该结构由 Burton Howard Bloom 于1970年提出。

布隆过滤器本质上是一个bit类型的map,即数组的每个位置只占一个bit 我们把bit类型的数组记为 bitMap
假设有一个长度为 m 的bit类型的数组,如果我们所知,每一个bit只有0和1两种状态,如图所示:
在这里插入图片描述
一个整型int 包含四个字节! 四个字节 即 32个比特(1个字节8比特)
所以一个整数可以表示32个比特
所以,这个arr虽然是长度为1000的整型数组,但是可以表示32000个字节
在这里插入图片描述
如果我 想把30000个位置上描黑,
应该怎么操作呢

实际数组是长度为1000的,但是每个位置表示32个bit
在这里插入图片描述
在这里插入图片描述

相当于0-999个桶,每个桶里有32个位置,
先让3万除以32(然后取整),定位到来自哪一个桶

再让3万**%**32,定位到来自桶的哪一个位置!

在937个桶里面的16号位置!

在这里插入图片描述
最后一段代码含义:
1<<16指的是,1左移到第16个位置
原来的数是arr [ intindex ],和1<<16取 或,则相应的位置变1

以上,讲述了如何实现0-m-1 bit的 数组
有了这个数组之后
我们 看黑名单问题如何设置
拿url举例

布隆过滤器先准备一个 0-m-1的数组,先经过哈希函数,算出一个哈希值,这个哈希值再去%m,得到的结果,对应于0-m-1上的一个

再假设一共有 k 个哈希函数,这些函数的输出域S都大于或等于m,并且这些哈希函数都足够优秀且彼此之间相互
独立
(将一个哈希函数的计算结果乘以6除以7得出的新哈希函数和原函数就是相互独立的)。
那么对同一个输入对象(假设是一个字符串,记为URL),经过k个哈希函数算出来的结果也是独立的。可能相同,也可能不同,但彼
此独立。对算出来的每一个结果都对m取余(%m),然后在bit array 上把相应位置设置为1(我们形象的称为涂黑)。如图所

在这里插入图片描述
有可能两个哈希函数会描到同一个位置,那么就让其描黑两次
在这里插入图片描述
我们把bit类型的数组记为 bitMap 。至此,一个输入对象对 bitMap 的影响过程就结束了,也就是 bitMap 的一
些位置会被涂黑。接下来按照该方法,处理所有的输入对象(黑名单中的100亿个URL)。每个对象都可能把
bitMap 中的一些白位置涂黑,也可能遇到已经涂黑的位置,遇到已经涂黑的位置让其继续为黑即可处理完所有
的输入对象后,可能 bitMap 中已经有相当多的位置被涂黑。至此,一个布隆过滤器生成完毕,这个布隆过滤器代表之前所有输入对象组成的集合。

那么在检查阶段时,如何检查一个对象是否是之前的某一个输入对象呢(判断一个URL是否是黑名单中的URL)?

假设一个对象为a,想检查它是否是之前的输入对象,就把a通过k个哈希函数算出k个值然后把k个值都取余
(%m),就得到在[0,m-1]范围伤的k个值
。接下来在 bitMap 上看这些位置是不是都为黑。如果有一个不为黑,
说明a一定不再这个集合里。如果都为黑,说明a在这个集合里,但可能误判

再解释具体一点,如果a的确是输入对象 ,那么在生成布隆过滤器时, bitMap 中相应的k个位置一定已经涂黑
了,所以在检查阶段,a一定不会被漏过,这个不会产生误判。会产生误判的是,a明明不是输入对象,但如果在生
成布隆过滤器的阶段因为输入对象过多,而 bitMap 过小,则会导致 bitMap 绝大多数的位置都已经变黑。那么在
检查a时,可能a对应的k个位置都是黑的,从而错误地认为a是输入对象(即是黑名单中的URL)
。通俗地说,布隆
过滤器的失误类型是“宁可错杀三千,绝不放过一个”。

比如,最极端的情况,如果数组开的很小,数组上所有位置都变黑了,那么接下来检查的每个黑名单里 都是url中的

通过调整 哈希函数个数和数组大小,可以得到不同的失误率
数组越大,失误率越低

但是要记住:哈希函数的大小和单样本大小是没有关系的!比如url是64字节,还是128字节,还是256字节不影响布隆过滤器。这是一个数学推论!

数组空间开多大,除了和样本量有关系,还和预期的失误率有关!

要记住下面三个公式

1.布隆过滤器大小:

在这里插入图片描述
在这里插入图片描述
这时m单位为bit,对应的实际字节数 应当乘以8

2:哈希函数个数

在这里插入图片描述
在这里插入图片描述
两者均是向上取整!

3.失误率:

在这里插入图片描述
在这里插入图片描述
若是面试场上问出了这个题,则先按经典方法解决,若是面试官进一步追问,你这个空间可以再精简一点吗,那此时我们反问一句:老师,您这个,对错误率有要求吗?面试官一听,微微一笑,小伙子上道!然后你大声说出,布隆过滤器!
之后讲布隆过滤器是怎么样一个原理!每个url经过几个哈希函数对应相应位置上描黑,所有黑名单的每一个url描黑之后,
然后在讲怎么检查!
以及具体布隆过滤器的参数如何确定!

其他补充:

一个服务器内存轻松过30G

和搜索相关的公司,几乎都会问到 布隆过滤器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值