布隆过滤器基本对于做后端服务的同学,应该是耳熟能详。扫了一下比较容易搜到的资料,都能够比较明白的讲出布隆过滤器是一个什么东西?如何推导?如何选取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才能满足相同的 数据量和假正例的需求
版权声明:本文为博主原创文章,未经博主允许不得转载。