Bloom Filter(布隆过滤器)

最早看到这个精巧的数据结构是在《数学之美》上,今天梳理一下它的特点。

布隆过滤器:

       Bloom Filter是一个节省空间的概率型数据结构,被用来测试一个元素是否存在于集合中。“元素实际不存在于集合中但判定为存在“的这类错误(False positive)在该数据结构上可能发生(概率很低可以人为控制),但是“实际存在于集合中但是判定为不存在”的错误(False Negative)不可能发生,在采用传统的无差错的哈希技术时大量源数据需要不能接受的存储空间时,这种数据结构被提出解决这个问题。

       这里说一下统计学里的两类错误:第一类错误是正确的null假设被错误地拒绝(假正),第二类错误是错误的null假设被接受(假负)。在这里null假设(null hypothesis)为:待检测元素不存在于集合中。

       一个空的布隆过滤器是m个bit位数据,全部初始化为0.必须要有k个不同的哈希函数来定义,每一个哈希函数将集合中的元素映射到m个比特位数组的某个位置上,通常情况下k是一个常量,远比m小,正比于被添加到集合中的元素数量。K的精确取值和与m的比例系数可以通过可以容忍接受的false positive rate来唯一确定。

       要向集合里面添加一个元素,就要将这个元素喂给k个哈希函数以输出k个位置序号,把bit数组的这些位置设为1。为了检测一个元素是否已经存在于集合中,同样的将这个元素喂给k个哈希函数输出位置序号,如果bit数组这些位置上存在不为1的情况,则该元素不存在与该数组中,当插入该数组时,对应所有位置置为1。当所有位置都为1,则该元素存在于集合中,或者是这些位在其他元素插入时都被置为1(犯了false positive的错误)。

                                                        

       当k非常大时,设计k个不同且独立的哈希函数是相当困难的。另外,从一个布隆过滤器里删除一个元素是不可能的,因为False Negatives的错误不允许犯。即使通过将对应k个bit为置0可以清除该元素,但也可能清楚其他元素。

False Positives的概率计算:

       假设每个哈希函数以相同概率选择每个bit数组位,如果m是比特位的数量(数组大小),在插入操作过程中,某个位置不被该哈希函数置为1的概率为 。设k为哈希函数的数量并且相互独立,某个个位置不被k个哈希函数置为1的概率就是 ,如果我们插入n个元素,则某个位置仍然是0的概率为 , 某个位置是1的概率为 。现在测试一个不属于该集合的某个元素,k个哈希函数计算出来的数组位置被设置为1(引起False Positives,判断为存在于集合中)

能够最小化假正判断失误的k值:

                                                                       

                                                             

                                                                      

所以平均每个元素的最优比特位数为:

                                                  

                                                  

从上面的式子发现:布隆过滤器比特数组长度m与集合元素数量n成正比,另外所需的哈希函数的数量k只与false positive probability相关。

知道了实现原理下一步就来实现它。

参考文献:https://en.wikipedia.org/wiki/Bloom_filter

猜你喜欢

转载自blog.csdn.net/To_be_to_thought/article/details/84887435