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