Bloom Filter一般用于数据的去重计算,近似于HashSet的功能;但是不同于Bitmap(用于精确计算),其为一种估算的数据结构,存在误判(false positive)的情况。

1. 基本原理

Bloom Filter能高效地表征数据集合\(S = \lbrace x_1 ,x_2 ,...,x_n \rbrace\),判断某个数据是否属于这个集合。其基本思想如下:用长度为\(m\)的位数组\(A\)来存储集合信息,同时是有\(k\)个独立的hash函数\(h_i(1\le i \le k)\)将数据映射到位数组空间。具体流程如下:

  1. 将长度为\(m\)的位数组全置为0;
  2. 对于数据\(x \in S\),依次计算其\(k\)个hash函数值\(h_i(x)=w,且1\le i \le k, 1 \le w \le m\),将位数组中的第\(a\)位bit置为1,即A[w]=1.

当查询数据\(y\)是否属于集合\(S\)时,计算其\(k\)个hash函数值,如果\(h_i(y)\)对应的位数组均为1,则数据\(y\)属于集合\(S\);反之,则不属于。

2. 相关计算

在上述判断中,可能存在误判(false positive, FP),比如某数的\(k\)个hash函数值可能属于集合\(S\)中某几个数\(k\)个hash函数值组成的集合。显然,误判率跟集合大小\(n\)、位数组大小\(m\)、hash函数的个数\(k\)有关;在其他条件不变的情况下,若\(n\)越大(\(m\)越小,或\(k\)越多),则误判率越高。误判率估算公式如下:

\[ P_{fp} \approx (1-e^{-kn/m})^k \]

在实际的场景中,常常是已知集合大小\(n\),预设误判率\(P_{fp}\),需要计算位数组大小\(m\)、hash函数的个数\(k\)。通过一系列的数学推导,可得到如下公式:

\[ m= - \frac{n\ln P_{fp}}{(\ln 2)^2} \]

\[ k=\frac{m}{n}\ln 2 \]

详细的数学推导可参看相关文档。

3. 实战

Bloom Filter的Java实现有Guava、stream-lib,Scala实现有breeze、bloom-filter-scala。采用breeze库的Distinct Count实现如下:

import breeze.util.BloomFilterval bf = BloomFilter.optimallySized[Int](5, 0.01)
val arr = Array(1, 3, 4, 5, 1, 2, 6, 3, 1)
var cnt = 0
arr.foreach { t =>bf.contains(t) match {case false => cnt += 1; bf.+=(t)case _ =>}
}
println(arr.distinct.length) // 6
println(cnt) // 6

从上面的Scala代码中,不难发现:在Distinct Count计算过程中,需要定义一个global变量,逐一用于对每个不属于集合元素进行计算。显然,在分布式计算中,这种方法不太适用;因为global变量没法做到实时的传递更新。因此,另一种估算算法HyperLogLog,拥有优秀的可加性、易于并行化,在大数据的场景下应用广泛——Spark、Kylin中的近似Distinct Count便是基于此。

4. 参考资料

[1] Broder, Andrei, and Michael Mitzenmacher. "Network Applications of Bloom Filters: A Survey." Internet Mathematics 1.4 (2011): 485-509.
[2] 张俊林, 《大数据日知录》.

Bloom Filter:海量数据的HashSet相关推荐

  1. Bloom Filter 大规模数据处理利器

    2019独角兽企业重金招聘Python工程师标准>>> 最近工作中涉及到bloom Filter,真是一把科研利器呀,大数据.网络.云等等都可以用到! Bloom Filter是由B ...

  2. 布隆过滤器Bloom Filter简介

    背景: 如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率: 采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL.红黑树)存储,查 ...

  3. java 布隆过滤器_什么是布隆过滤器(Bloom Filter)?

    在日常工作中,有一个比较常见的需求,就是需要判断一个元素是否在集合中. 例如以下场景: 给定一个IP黑名单库,检查指定IP是否在黑名单中? 在接收邮件的时候,判断一个邮箱地址是否为垃圾邮件? 在文字处 ...

  4. 布隆过滤器(Bloom Filter)- 原理、实现和推导

    目录 算法背景 布隆过滤器–概念 布隆过滤器-原理 布隆过滤器-缺点 布隆过滤器-实现 布隆过滤器-应用 布隆过滤器-公式推导 算法背景 问题: 在开发中,经常要判断一个元素是否在一个集合中. 实现方 ...

  5. 【恋上数据结构】布隆过滤器(Bloom Filter)原理及实现

    布隆过滤器(Bloom Filter) 引出布隆过滤器(判断元素是否存在) 布隆过滤器介绍(概率型数据结构) 布隆过滤器的原理(二进制 + 哈希函数) 布隆过滤器的误判率(公式) 布隆过滤器的实现 布 ...

  6. Bloom Filter

    场景 判断某一元素是否在某个集合内? 一般使用HashMap/Set,但是当集合非常庞大时,需要极大的空间,现实状况不允许.此时,可以考虑使用 Bloom Filter. 具体步骤: 申请足够的bit ...

  7. oracle bloom过滤,布隆过滤(Bloom Filter)-必须了解的优化器算法

    布隆过滤(Bloom Filter)-必须了解的优化器算法 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一 ...

  8. Bloom Filter(布隆过滤器)

    一.介绍 Bloom Filter是一个有m bits的bit array,每一个bit位都初始化为0.并且定义有k个不同的hash function,每个都以uniform random distr ...

  9. 布隆过滤器(Bloom Filter)、布谷鸟过滤器(Cuckoo Filter)、商过滤器(quotient filter)(持续更新~~~~)

    过滤器 位图 布隆过滤器(Bloom Filter) 布谷鸟过滤器(Cuckoo Filter) 商过滤器(quotient filter) 文章参考链接 位图 在讨论布隆过滤器之前,先看一下位图是什 ...

最新文章

  1. 喜欢把代码写一行的人_我最喜欢的代码行
  2. reportNG定制化之失败截图及日志
  3. vector 指针 的指针
  4. [Android工具]安卓音乐下载软件,无损音乐FLAC音乐下载器
  5. OpenSceneGraph学习笔记
  6. python导入机制及importlib模块
  7. 写一个工具生成数据库实体类
  8. echarts地图json实现
  9. React中antd的按需引入+自定主题
  10. 从 Windows 换到 Mac,真没有想象中的那么难
  11. Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
  12. java wado_dcm4che,WADO相关
  13. html src data:image,Browser/HTML Force download of image from src=“data:image/jpeg;base64…”
  14. 桌面计算机打不开win8.1,Win8.1怎么进桌面 2种Win8.1开机直接进桌面方法
  15. Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)
  16. abap 创建出口历程_(发展战略)ABAP历史发展
  17. NOPI导出excel
  18. NLPIR词性标记集
  19. 常用数据库分页查询SQL汇总
  20. 【单镜头反光相机】弥散圆、焦平面、景深、光圈

热门文章

  1. 如何给页面加上loding_如何给片头添加字幕?视频剪辑大神们都这样玩
  2. python中str的index什么意思_python中index的用法是什么
  3. 为啥我从后台查到的值在页面显示的是undefined_再谈一个管理后台列表功能应有的素质...
  4. MySQL中字段约束有哪些_mysql字段约束
  5. python代码画皮卡丘_Python气象绘图实例我们一起画台风(代码+数据)
  6. 【Linux】Linux简单操作之安装jdk
  7. Spark的安装和使用
  8. xCode BuildSetting 设置
  9. 网络工程师课程---4、网络层(网关是什么)
  10. 19.04.02笔记