布隆过滤器

123 阅读2分钟

定义

Bloom Filter,1970年由布隆提出,实际上是一个很长的二进制向量和一系列随机映射函数。

用途

可以用于检索一个元素是否在集合中。 判断一个元素是不是在一个集合中,一般做法是将集合中的所有元素保存起来,然后通过比较确定,如数组、链表、树、散列表等,随着集合中元素增加,需要的存储空间越来越大,同时检索速度也越来越慢,如数组O(n)、链表O(n)、树O(logn)、散列表O(1)

原理

当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,只要看看这些点是不是都是1就大约知道集合中有没有它了;如果这些点都为0,则被检索元素一定不在集合中;如果都是1,则被检索元素可能在集合中。

优点

  • 空间效率和查询时间都远远超过一般算法,存储空间和插入/查询都是常数O(k)
  • 散列函数相互之间没有关系,方便由硬件并行实现。
  • 布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。
  • 布隆过滤器可以表示全集,其他任何数据结构都不能

缺点

  • 是有一定的误识率,随着存入元素的数量增加,误识率随之增加,但是如果元素数量太少,使用散列表足以。 如何改进?选用增加位数组大小,增加散列函数的个数,选用相关性更弱的散列函数
  • 删除困难,一般情况下不能从布隆过滤器删除元素。由于碰撞的问题我们无法保证删除的元素的确在布隆过滤器中。 如何解决?1、可定期重建。2、建立已删除元素的新布隆过滤器,如果在原布隆过滤器命中(冲突率一般较低,命中 率也较低),新布隆过滤器命中,则认为该元素不存在,判定为未命中。