海量数据过滤——布隆过滤器

来源:互联网 发布:影集软件 编辑:程序博客网 时间:2024/05/02 04:32

笔试面试中经常有一些大量处理数据但是限制内存空间的题目,此处根据左神的《程序员代码面试指南》稍作总结,以便自己日后复习。

题目一:不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL最多占用64B,现在要实现一个网页过滤系统,根据网页的URL判断该网页是否在黑名单上。
允许一定的判断失误率,空间内存限制在30GB以内
如果是直接用哈希函数处理,肯定会长处空间限制,所以这里要用到的是:
布隆过滤器 ——“宁可错杀三千,绝不放过一个”。
布隆过滤器实际上是一个位图bitMap,我们现在假设有一个长度为m的bit类型的数组,以及 k 个互相独立的优秀的哈希函数,且这k个哈希函数的输出域都大于或等于 m。我们将网页的URL作为k个哈希函数的输入对象进行哈希处理,分别得到 k 个值,这k 个值中可能有相同的,但是值之间互相独立不关联的。我们将这k个值对m模运算,得到的 k 个值都在 0~m之间。最后将这 k 个值对应的bitMap的值置为1,当我们将所有的URL都处理完毕后,bitMap上的很多位都被置为了1。
当我们要查询一个URL是否在黑名单内时,我们先将这个URL进行哈希处理 ,因为有K个函数所以得到 k 个值。接着检查这 k 个值对应的bitMap 位是否为1,如果 有一个不为 1,那么说明这个URL不在这个这里面,是安全的网站,如果对应的 bitMap 位的值都是 1 那么说明这个URL可能在这里面。说可能是因为当URL的数量很多时 ,可能会出现不同URL哈希处理后得到相同的值,所以说是有可能在这里面。但是如果对应的位值为0,那么这个URL必然在这里面。所以说宁可杀错三千不放过一个可疑的。

阅读全文
0 0
原创粉丝点击