布隆过滤器
想一下这样的题目:
如果一个黑名单网站包含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,那么)
我的想法:
过段时间再写!!!!
参考文档:
浙公网安备 33010602011771号