Bloofi: A Hierarchical Bloom Filter Index with Applications

来源:互联网 发布:nginx 二级域名 转发 编辑:程序博客网 时间:2024/06/16 14:29

一、Bloom-Filter简介

Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。

BLoomFilter example
优点:
1.时空优势
1)采用hash函数判断一个元素是否存在,快速!
2)用一个二进制数组来表示元素是否存在,不存放真实数据,大大节省空间。
缺点:
1.误算率(False Positive)
2.不能直接删除元素
Bloom Filter 用例
Google Chrome浏览器使用了布隆过滤器加速安全浏览服务
垃圾邮件过滤
P2P网络中资源查找

二、思考?

假设有在某分布式环境下,N个用于存储数据的分支节点分布在不同的物理点。
问题一:查询一个元素是存在?
问题二:如果存在,那么又具体存放在哪个分支节点?

解决方案一:每个分支节点维护一个Bloom Filter,该分支节点上存储的数据都可以通过这个BloomFilter查找,但是如果不在本节点时,则需要查找其他的节点,这样就造成了大量的节点之间的通信,且需要挨个在每个分支节点中查找。

解决方案二:每个分支节点维护一个Bloom Filter,并将自己的Bloom Filter 分享给一个中心节点,这个中心节点可以与所有的分支节点通信。
1.构建一个类似于B+ tree的树形结构,叶子节点是各个分支节点BloomFilter.

2.多个分支节点BloomFilter按位进行OR运算得到一个中间Node,具体多少个分支节点一起进行OR操作?或者说每个中间Node有多少个分支?这里我们定义一个d,类似于二叉树的分支只能有2个分支,我们这个结构有d~2d个分支。(下面的实例我们令d=2)

3.中间节点再依次按照2中的规则向上进行OR操作,最终的到一个根结点。同样是一个BloomFilter,这里保存了所有分支节点BloomFilter进行OR操作的结果。
如下图所示:
Bloofi树形索引结构
我们把这样一个结构叫做Bloofi(Bloom Filter Index),也就是给各个分支节点上的Bloofi加上索引结构,并且构建一个类似于B+tree的平衡树形结构,且满足上面三个条件。

三、Bloofi增删改查

1.查询操作

查询一个hash值为4 的元素是否在集合中,并且找到具体地理位置。
1)查找根结点Id:9中对应第5位(BloomFilter下标从0开始)是否为1,如果是则继续查询左右子树Id:7he Id:8,否则停止。
2)查找左右子树,发现Id:7对应位上为0,对应Id:7下面的子树都不许要查找,而Id:8中对应第5位为1,则继续往下查找。
3)找到对应的元素,存在于Id:5中

2.插入操作

插入操作涉及到三个问题:
1)这里我们所说的插入并不是插入一个元素,而是插入一个新的BloomFilter
2)尽量将两个相似度最高的BloomFilter 放在同一子树下面,一提高查询速度,减少查询次数。(计算BloomFilter 我们可以采用Hamming distance,直接将两个BloomFilter进行XOR )
3)前面我们规定这种树形结构的非叶子节点的分支数为[d,2d],所以当某个节点的所有分支数大于这个数时,则需要生成一个新的中间节点,并将要插入的新节点作为该中间节点的分支。
4)个分支节点从新进行OR操作。
实例:(插入的BloomFilter为00100100)
insert

这里在计算新插入的BloomFilter与Id:7和Id:8相似度时,发现相似度都为4,这个时候我们采用一种默认的方式,即从左边开始。

3.删除操作

可能出现的问题:
1)下溢。前面我们规定,每个非叶子节点的分支数不得少于d。所以当删除一个BloomFilter时,可能导致不满足这个条件,这个时候就涉及到其他分支节点的分裂问题。
2)删除后个分支再进行OR操作

实例(删除Id:5)
Delete

4.更新操作

1)这里的更新,指的是对单个BloomFilter的更新,即对具体的元素的更新。
2)更新后依然要进行OR操作

实例(将Id:6更新为00000011,即插入一个元素)
Update

5.时空复杂度分析

1)时间复杂度:Search、Delete、Insert的时间复杂度都为这里写图片描述实际上Delete和Insert都是一个Search的过程。
Update的时间复杂度为:这里写图片描述
2)空间复杂度:比单独存储各个BloomFilter消耗的空间要多些,这主要是因为需要生成一些中间节点和一个根节点,但是对于节省通信开销来说,这些都是值得的。

1 0