为什么bloom filter比bitmap更加有效?

布隆过滤器基本对于做后端服务的同学,应该是耳熟能详。扫了一下比较容易搜到的资料,都能够比较明白的讲出布隆过滤器是一个什么东西?如何推导?如何选取k值?如何根据数据量的大小和冲突率的需求,选择布隆过滤器的容器大小。如果有不明白,参见下面的链接。但是我发现似乎没有哪个资料讲了,布隆过滤器为什么会比bitmap更加优秀?

布隆过滤器基本原理参见 http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html

这篇博客想要用简单的数学推导分析一下,为什么布隆过滤器优于bitmap?用数据曲线做一下简单的展示。

注:n是插入元素的个数,m是布隆过滤器或者bitmap的比特位的数目

1、布隆过滤器的假正例概率:p =  (1- e^(-kn/m))^k, 当k=(m/n)*ln2时,p=e^(-m/n)

2、bitmap的假正例概率推导:

每次插入一个元素,某一位被置1的概率是 1/m,那么0的概率是(1-1/m);经过n次插入之后,该一位还是0的概率是(1-1/m)^n;

那么经过n次插入之后,该位是1的概率是 1-(1-1/m)^n;根据概率公示,p=1-(1-1/m)^n ~ 近似于~ (1- e^(1-n/m))

也就是 p=1- e^(1-n/m)

于是可以把两种算法的 假正例概率绘成曲线图如下。在曲线图中,从整体上,布隆过滤器的表现似乎只是略优于bitmap,但是我们关注的应该是假正例概率比较低的部分。关注一下当假正例概率低于0.1的时候,布隆过滤器优势想当明显。

当然,这个结论也可以做一个简单的数学分析。当我们在一定的数据量n和假正例概率需求的情况下,

布隆过滤器的比特位需求是m1=-ln(p) * n

bitmap的比特位需求是m2=n/ln(1-p)

求解 diff = m2-m1 = 1/(1-ln(1-p)) + ln(p)

对于这个函数f(p) = 1/(1-ln(1-p)) + ln(p) 求导求极值后发现,当p=1的时候,f(p)有极小值小值1且在0~1内是最小值

也就是说,当p在0~1的区间内,bitmap都至少要比布隆过滤器多一个bit才能满足相同的 数据量和假正例的需求

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-20 01:27:30

为什么bloom filter比bitmap更加有效?的相关文章

php实现Bloom Filter

Bloom Filter(BF) 是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法,用于快速查找某个元素是否属于集合, 但不要求百分百的准确率. Bloom filter通常用于爬虫的url去重,即判断某个url是否已经被爬过. 原理方面我引用一篇别人的文章,讲的比较清晰了,在此我不予赘述, 更多信息可以参考其论文. 看过几个php实现的BF,都觉得可读性不是很强, 本文主要给出我对Bloom Filter的一个php实现. 原理: <引用自这篇文章> 一. 实例 为了说明Bl

Bloom Filter 大规模数据处理利器

BloomFilter–大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. 一. 实例 为了说明Bloom Filter存在的重要意义,举一个实例: 假设要你写一个网络爬虫程序(web crawler).由于网络间的链接错综复杂,爬虫在网络间爬行很可能会形成“环”.为了避免形成“环”,就需要知道爬虫程序已经访问过那些URL.给一个URL,怎样知道爬虫程序

大数据处理算法二:Bloom Filter算法

百度面试题:给定a.b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a.b文件共同的url? Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合.   一. 实例  为了说明Bloom Filter存在的重要意义,举一个实例: (实例一),假设要你写一个网络蜘蛛(web crawler).由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成

Bloom Filter 实例

转自 http://www.dbafree.net/?p=36 BloomFilter–大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. 一. 实例 为了说明Bloom Filter存在的重要意义,举一个实例: 假设要你写一个网络爬虫程序(web crawler).由于网络间的链接错综复杂,爬虫在网络间爬行很可能会形成“环”.为了避免形成“环”,就需要

大数据量下的集合过滤—Bloom Filter

算法背景 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构都是这种思路,存储位置要么是磁盘,要么是内存.很多时候要么是以时间换空间,要么是以空间换时间. 在响应时间要求比较严格的情况下,如果我们存在内里,那么随着集合中元素的增加,我们需要的存储空间越来越大,以及检索的时间越来越长,导致内存开销太大.时间效率变低. 此时需要考虑解决的问题就是,在数据量比较大的情况下,既满足时间要求,又满足

布隆过滤器(Bloom Filter)的原理和实现

什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, gmail等邮箱垃圾邮件过滤功能 这几个例子有一个共同的特点: 如何判断一个元素是否存在一个集合中? 常规思路 数组 链表 树.平衡二叉树.Trie Map (红黑树) 哈希表 虽然上面描述的这几种数据结构配合常见的排序.二分搜索可以快速高效的处理绝大部分判断元素是否存在集合中的需求.但是当集合里

[转载] 布隆过滤器(Bloom Filter)详解

转载自http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一

redis 和 bloom filter

今天打算使用redis 的bitset搞一个 bloom filter, 这样的好处是可以节省内存,坏处是可能在会有一些数据因为提示重复而无法保存. bloom filter 的大体原理就是通过不同的hash函数将一个字符串映射到几个不同的位,并将这几个不同的位设置为1. 如果在查找某个字符串的时候,发现通过hash映射后的位有的不为1,说明该字符串不存在. 如果发现所有的位都为1,那该字符串有一定的概率不存在,通常这个概率会很小. 相关内容可以查看: http://olylakers.itey

Bloom Filter(布隆过滤器)

布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制矢量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难. 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构都是这种思路.但是随着集合中元素的增加,我们需要的存储空间越来越大.同时检索速度也越来