No. 15【大数据算法】Bloom Filter 的原理和实现
2017-10-09 20:34
218 查看
0x00 前言
Bloom Filter 是由 Burton H. Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员。Bloom Filter 最初的论文发表在ACM,名为《Space/Time Trade-offs in Hash Coding with Allowable Errors》,感兴趣可以下载阅读。本篇主要分享 Bloom Filter 的基本原理、代码实现以及误判率的计算,看过 BitMap 那篇文章的童鞋再看这一篇会十分简单。
Bloom Filter 也就是常说的布隆过滤器,后面就统一称为 BF。
0x01 原理
BF 可以高效地表示集合数据,它使用长度为 m 的位数组来存储集合信息,同时使用 k 个相互独立的哈希函数将数据映射到位数组空间。直接上图,根据图来大致梳理一下算法流程。
初始化一个长度为m的位数组,并将所有元素置为0;
对于集合
S={a1, a2,…,an}中的任一元素a,分别使用k个哈希函数对其计算: wi=hashi(a),并将位数组中的第 wi 位置为1;
对S中所有的成员执行同样的操作。
基本的原理就是这么多,看一下图中的例子就能明白了。比如现在要
dantezhao用 BF 表示,我们会用两个哈希函数分别对
dantezhao计算,计算结果分别是5和19, 然后对位数组中的第5位和第19位分别置1即可。
当查询
dantezhao是否在集合的时候,只需使用同样的哈希函数计算,如果对应位数组的位都为1,则说明存在。只要有任意一位为0, 则说明不存在。
0x02 实现
具体的实现可以直接看代码,用 Python 写的一个简单的版本,总共也就20行左右。代码和 BitMap 的代码实现很接近,不同的是,哈希函数变成了多个。0x03 误判率
BF 的基本原理说起来也很简单的,但是还有一些知识点需要关注一下。比如在 BF 中,会出现误判,就是某个成员本来不在集合中,但是会被判断成在集合中。为了把误判率控制在一个可以接受的范围,我们就需要适当地调配能够影响误判率的几个因素:集合大小n、哈希函数个数k和位数组大小m。这三个影响因素中,m和n对于误判率的影响比较直观。
集合大小n:当其它条件固定的时候,集合大小n越大,则位数组中就会更多比例的位置被置为1,因此误判率会更大。
位数组大小m:同理,当其它条件固定时,位数组大小m的值越大,那么数组中剩余为0的位就会更多,因此误判率就会更小。
哈希函数的个数k:比较难分析,比如将m和n固定,使用的哈希函数越多,则位数组中会有更多比例的位置会被置为1,即增大的误判率,但是在查询时,如果哈希函数个数越多,则被误判的可能就越小。
然后该怎么找到3个因素的最佳取值呢?这里省略推导过程,直接给出结论。
如果给定 m 和 n,当 k 取以下值时,误判率 p 的值最小:
k=ln2∗mn=0.7∗mn(1.1)
此时误判率 p 等于:
pmin≈(1−eknm)k=(1−12)k=0.6185mn(1.2)
在实际应用中,更常见的需求是,已知集合大小n,并设定好误判率p,需要计算出该给 BF 分配多大内存合适,也就是要确认m的大小,可使用如下公式解决问题:
m=−nlnp(ln2)2(1.3)
有了这三个公式,可以在实际应用中灵活地设置各种参数来合理使用BF。
0xFF 总结
传统 BF 只能添加元素,不能对元素计数,也无法删除元素。如果把底层数组的 bit 换成 int,就可以支持计数和删除动作。每次插入元素时,将对应的 k 个 int 加一;查询时,返回 k 个 int 的最小值;删除时,将对应的 k 个 int 减一。这就是BF的改进版:Couting Bloom Filter,后面再来专门分享。作者:dantezhao |简书 | CSDN | GITHUB
个人主页:http://dantezhao.com
文章可以转载, 但必须以超链接形式标明文章原始出处和作者信息
欢迎关注我的微信公众号:木东居士
相关文章推荐
- No.14 【大数据算法】BitMap的原理和实现
- 数据挖掘分类算法之贝叶斯分类法原理及C++实现
- 深度学习算法实践15---堆叠去噪自动编码机(SdA)原理及实现
- 基于.NET实现数据挖掘--神经网络算法原理
- 数据挖掘:Apriori 关联规则分析算法原理分析与代码实现
- 深度学习算法实践15---堆叠去噪自动编码机(SdA)原理及实现
- 数据结构——快速排序原理及算法Java实现
- 深度学习算法实践15---堆叠去噪自动编码机(SdA)原理及实现
- LZW for GIF 算法原理和实现
- 邮件服务器的原理,算法及实现(二) MIME
- 邮件服务器的原理,算法及实现(一) SMTP && POP
- 用SHA1或MD5 算法加密数据(示例:对用户身份验证的简单实现)
- 使用JavaScript实现跨域数据提交的原理与实现
- 整数划分算法原理与实现
- 整数划分算法原理与实现
- Linux集群之负载平衡原理和实现算法
- 数据结构与算法(C#实现)系列---二叉树
- 海量数据库的查询优化及分页算法方案(二)-实现小数据量和海量数据的通用分页显示存储过程 [转]
- 用SHA1或MD5 算法加密数据(示例:对用户身份验证的简单实现)
- 用SHA1或MD5 算法加密数据(示例:对用户身份验证的简单实现)