码迷,mamicode.com
首页 > 其他好文 > 详细

bloom filter(布隆过滤器)

时间:2015-03-20 18:47:25      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

今天中邪了, 觉得看看bloom filter。 看看海量数据处理的经典算法。 

这是1970年提出来。  是用于检测一个元素是不是一个集合的成员。 如果检测结果为True, 则该元素不一定在该集合中。 如果检测结果为False, 表明该元素一定在这个集合中。 这说明bloom filter 具有 100%的召回率。 每个检测请求返回的结果只有两种, 也就是“在集合内(可能错误)” 和 “绝对不在集合内”。 可见bloom filter 牺牲了正确率和时间, 换取空间的节省。

bloom filter的优点在于它的插入和查询元素均是常数的时间。但是当插入的元素越多, 判错的可能性就越大(false positive)。

下面给出简单的解释:

输入:

x: 一个要查询的元素。

S: a set of element(被查的集合)

输出:

--True if x in S

--False if x not in S

举一个例子: x = cow, S = {tree, cow, bird}

                       Q: x(cow)在集合中吗

bloom filter: 包含一个vector of n boolean values(或者是bit vector), 最开始这个vector的所有的集合均为false。  另外还包含k个独立的hash funcition: H0, H1, H2, .... Hk-1, 这些hash 函数给出的值域均在(0, 1, 2, 。。,  n -1)。 例如, H0(cow)∈(0, 1, 2, 。。,  n -1)。

技术分享

对于S中的每一个元素s, 我们把vector 在H0(s), H1(s)......, Hk-1(s)的位置处均设置为True。  注意, 可能某一个位置可能会设置好多次的True。

技术分享


下面我们计算false positive的概率:

技术分享

注意, 刚开始, S = {A, G }, x= K, 我们要判断K是否在S中的时候, 就出现了false positive。

技术分享


接下来, 化简得到:

技术分享

求解如下:

技术分享

我们的目的就是是p(false positive)越小越好。 有如下公式:

技术分享





bloom filter(布隆过滤器)

标签:

原文地址:http://blog.csdn.net/a130737/article/details/44493521

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!