Bloom Filter算法

Bloom Filter 数据结构广泛地应用于网络技术中,它是由 Burton Bloom 在 1970 年提出来的。
它的优点是可以有效地节省空间,缺点是不能做到精确无误,不过这个看似很郁闷的缺点却可以使用调节参数的方法有效控制,
也可以通过不同的应用手段来避免差错。Bloom Filter 数据结构有很多应用,将在下一篇文章里叙述,
而这篇文章将简要叙述这个算法的原理和分析。

问题定义:如何用简单节省的方法将一个集合中的所有元素表述出来?
原理:有一个集合 S = ( x1, x2, ... , xn), 用一个 n bit 的数组把这个集合表示出来。
使用 k 个独立的哈希函数,将 S 中的每个元素 xi 映射到这个 n bit 的数组中的某一位上,
对于 S 中的每个元素要做 k 次哈希。n bit 的数组初始化每一位为 0 。

如图所示:

0 0 0 0 0 0 0 0 0 0 0 0

    x2_______________
x1________|   |   |
|   |   |   |   |
0 1 0 1 0 1 0 1 0 0 1 0

  x2'_______________
x1'______|   |   |
    | | |   |   |
0 1 0 1 0 1 0 1 0 0 1 0

从上图可见,x1 , x2 被映射到 n-bit 中,来了两个查询,x1' 和 x2' ,
对这两个查询也分别做 k 个哈希映射,结果 x1' 对应的值不全是 1 ,
这说明在集合S中肯定不存在和 x1' 相同的元素。而 x2' 对应的 bit 都是1,这说明 x2' 有可能存在于集合中。
但是它不存在的可能性也是有的,因为不能保证不同的元素的哈希值不同。

下面是几个关于 bloom filter 的延伸分析。
1)使用 bloom filter 可以做集合的并、交运算。只需将 n-bit 数组 OR 或 AND 就可以了。
但是结果并不精确。
2)bloom filter 有时会用在描述一个变化的集合上。
添加一个新的集合元素进入 bloom filter 很容易,而删除从集合中删除一个元素,
却不是那么简单,因为会附带着把其他元素的信息也删除掉。为了解决这个问题,
使用多个 bit 位取代使用一个 bit 位。每次映射到这个位置,就加 1 。
}


Bloom Filter是可作为URL排重算法的一种算法.
它的基本思想来源于Hash表.但又不同.
Hash表的思想是通过散过函数快速定位的Hash桶位置.如果Hash冲突则开链表保存.
基本上一个合适的Hash函数,和合适的Hash桶大小,会使Hash冲突变得很小.
因而Hash表具有极快速的添加,查找,删除功能.也非常适合用于URL排重. 但是Hash表的实现空间效率不好.
而Bloom Filter是一种Hash表思想的延伸.它并不通过Hash表开链表的形式来解决冲突.
而是用多个Hash函数来计算数据,而取得多个Hash数组的下标,并标记,以多个Hash函数的计算结果来稀释冲突的机率.
例如用10个Hash函数分别计算同一个数据,而得到10个数组下标,通过判断这十个下标相对应的标记位的标记即可判断是否存在.

你可能感兴趣的:(程序设计)