bloom filter(布隆过滤器)

今天中邪了, 觉得看看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)越小越好。 有如下公式:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值