ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

大数据和空间限制

2021-04-01 20:58:14  阅读:158  来源: 互联网

标签:限制 对象 布隆 过滤器 涂黑 哈希 空间 数据 输入


布隆过滤器

题目:

不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL最多占用64B。现在想要实现一种网页过滤系统,可以根据网页的URL判断网页是否再黑名单上,请设计该系统。

要求:

  • 该系统允许有万分之一以下的判断失误率
  • 使用的额外空间不要超过30GB

解答:

如果把黑名单中所有的URL通过数据库或哈希表保存下来,就可以对每条URL进行查询,但是每个URL有64B,数量是100亿个,所以至少需要640GB的空间,不满足要求。

如果面试者遇到网页黑名单系统,垃圾邮件过滤系统,爬虫的网页判重系统等题目,又看到系统容忍一定程度的失误率,但是对空间要求比较严格,那么很可能面试官希望面试者具备布隆过滤器的知识。

一个布隆过滤器精确的代表一个集合,并可以精确判断一个元素是否在集合中。注意,只是精确代表和精确判断,到底有多精确呢?则完全在于你具体的设计,但想做到完全正确是不可能的。布隆过滤器的优势在于使用很少的空间就可以将准确率做到很高的程度。

布隆过滤器

假设有一个长度为m的bit类型的数组 ,即数组中的每一个位置只占一个bit,如我们说只,每个bit只有0和1两种状态,

在这里插入图片描述

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

在这里插入图片描述

我们把bit类型的数组记为bitMap。至此,一个输入对象对bitMap的影响过程就结束了,也就是BitMap中的一些位置会被涂黑。接下来按照该方法处理所有的输入对象,每个对象都可能把bitMap中的一些白位置涂黑,也可能遇到已经涂黑的位置,遇到已经涂黑的位置让其继续为黑即可。处理完所有的输入对象后,可能BitMap中已经有相当多的位置被涂黑。至此,一个布隆过滤器生成完毕,这个布隆过滤器代表之前所有输入对象组成的集合

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

再解释具体一点,如果a的确是输入对象,那么在生成布隆过滤器时,bitMap中相应的k个位置一定已经是涂黑了,所以在检查阶段,a一定不会被漏过,这个不会产生误判。会产生误判的是,a明明不是输入对象,但如果在生成布隆过滤器的阶段因为输入对象过多,而bitMap过小,则会导致bitMap绝大多数的位置都已经变黑。那么在检查a时,可能a对应的k个位置都是黑的,从而错误的认为a是输入对象。

黑名单中样本的个数为100亿个,记为n;失误率不能超过0.01%,记为p ;每个样本的大小为64B,这个信息不会影响布隆过滤器的大小,只和选择哈希函数有关,一般的哈希函数都可以接受64B的输入对象,所以使用布隆过滤器还有一个好处就是不用顾忌单个样本的大小,它丝毫不能影响布隆过滤器的大小。

布隆过滤器的大小m由以下公式确定:
m = − n × l n p ( l n 2 ) 2 m=-\frac{n\times lnp}{(ln2)^2} m=−(ln2)2n×lnp​
哈希函数数量k的公式:
k = 0.7 × m n k=0.7\times\frac{m}{n} k=0.7×nm​
布隆过滤器会有误报,对已经发现的误报样本可以通过建立白名单来防止误报 。比如,已经发现“aaaaaa5”这个样本不在布隆过滤器中,但是每次计算后的结果都显示其在布隆过滤器中,那么就可以把这个样本加入到白名单中,以后就可以知道这个样本确实不在布隆过滤器中。

标签:限制,对象,布隆,过滤器,涂黑,哈希,空间,数据,输入
来源: https://blog.csdn.net/qq_36553387/article/details/115384093

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有