布隆过滤器

想一下这样的题目:

  如果一个黑名单网站包含100亿个黑名单网页,每个网页最多占64B,设计一个系统,判断当前的URL是否在这个黑名单当中,要求额外空间不超过30GB,允许误差率为万分之一。 

  怎么做?? How to  solve  it ??       

  

(用于在一堆数据中,快速判断某个数据是否存在,结果是 一定不存在和可能存在)

  可能存在的原因是由于: 我们在用布隆过滤器的时候是用到了多个 散列函数(hash函数),每个hash函数生成一个位,然后将这个位置1,这样就会出现尽管某个数据不存在,但是它的多个hash位全部被置为了1的情况。

  布隆过滤器的删除操作不太好。因为不知道是不是应该删除这个数据的多个hash位。(而且更不好的是由于布隆过滤器的采用的是bit向量来存储的,也就是每一个位只有0和1两种状态,无法记录此hash位对应多少个数据!!!!)。所以布隆过滤器只是添加元素,不能删除元素。

  那么怎么能让布隆过滤器删除数据呢?

  (首先可能想到的是 将位表示变为整数表示,这样出现了一个问题,那就是使用的空间变大了。 而且不一定能确定要删除的元素就存在与数组当中啊!!! )

 

突然间,有了一个问题!!  为什么要用布隆过滤器呢??  用HashMap不行吗??或者说它的优势在哪里呢?

  (占用的空间少!!!!   而且不是少了一点。  hash的本质都是通过hash函数对输入进行运算,得到一个数值。在HashMap中我们是用这个数值来作为数组的下标,但是数组中的值可不是只有一个bit位那么简单! 当然我们可以让其变为一个比特位。通常情况下HashMap中存储的就是value对象,我们可以存一个位,用0 和 1 表示不存在和存在,而不是存储具体的数值了!!!)

继续思考:

  (首先清楚了,布隆过滤器没有什么神奇的,只不过是在某个位置存储的bit位,即0或1,而HashMap中存储的是对象。如果有一个hash函数,要求它的错误率低于0.1,那么)

 

我的想法:

  过段时间再写!!!!

 

参考文档:

  https://zhuanlan.zhihu.com/p/72378274

posted @ 2020-08-03 17:47  你眼里的星辰  阅读(87)  评论(0)    收藏  举报