谈谈Bloom Filter

2024-03-28 15:32
文章标签 filter 谈谈 bloom

本文主要是介绍谈谈Bloom Filter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

海量数据的过滤及去重,老生常谈的话题了。Bitmap和Bloom Filter是常见的解决办法。

Bitmap的思路很单纯,一条数据是否存在只需要一个Bit就可以表示,因此一个Byte可以表示8条数据的布尔值,一般Bitmap用来解决某个数字是否存在,这个数字就是Index。在JDK中的实现为BitSet,底层实现为long数组。Bitmap不做过多介绍,原理实现比较通俗易懂。

Bitmap对于每一个可能的整型值,通过直接寻址的方式进行映射,相当于使用了一个哈希函数。那布隆过滤器就是引入了 k ( k > 1 ) k(k>1) k(k>1)个相互独立的哈希函数,保证在给定的空间、误判率下,完成元素判重的过程。下图中是 k = 3 k=3 k=3时的布隆过滤器。
bloom filter
x , y , z x,y,z x,y,z经由哈希函数映射将各自在Bitmap中的3个位置置为1,判断 w w w是否存在,仅当3个标志位都为1时,才表示w可能在集合中,否则一定不再集合中。图中所示的情况,布隆过滤器将判定w不在集合中。

k k k个标志位都为1时为什么说是可能存在,这其实也好理解,比如从来没有插入过元素 a a a,但是它对应的标志位已经被其他的元素置为1了,因此即使标志位全部为1,也不能说明该元素存在。当插入一个元素时它的标志位已经全部为1的概率成为错误率。

假设 m m m是该bit数组的大小, k k k是哈希函数的个数, n n n是插入的元素的个数,hash函数以等概率条件选择并设置bit位为 1 1 1,其概率为 1 m \frac 1m m1,因此bit数组中某一特定的位在进行元素插入时的hash操作中没有被置为1的概率是 1 − 1 m 1− \frac{1}{m} 1m1

在经过k个哈希函数之后,该位仍然没有被全部置1的概率是: ( 1 − 1 m ) k (1 - \frac{1}{m})^k (1m1)k

若插入了n个元素,该没有被置1的概率是: ( 1 − 1 m ) k n (1 - \frac{1}{m})^{kn} (1m1)kn

那么该位置为1的概率为: 1 − ( 1 − 1 m ) k n 1-(1 - \frac{1}{m})^{kn} 1(1m1)kn

现在检测某一元素是否在该集合中,则表明需要判断是否所有hash值对应的位都置1,但是该方法可能会错误的认为原本不在集合中的元素是在Bloom Filter中的,即导致误判率的发生,其概率为: ( 1 − ( 1 − 1 m ) k n ) k (1-(1 - \frac{1}{m})^{kn})^k (1(1m1)kn)k

这里使用极限公式 lim ⁡ x → ∞ ( 1 − 1 x ) − x = e \lim_{x \to \infty}{(1- \frac{1}{x})^{-x}}=e limx(1x1)x=e,m一般至少都是亿级别,近似的看做无穷大,最终简化的公式为: ( 1 − e − k n m ) k (1 - e^{-\frac {kn}{m}})^k (1emkn)k

至于最优解推导就不装了,因为我实在是推不出来😂。这里贴一张误差表,使用的时候好心里有个数。

m/nkk=1k=2k=3k=4k=5k=6k=7k=8
21.390.3930.400
32.080.2830.2370.253
42.770.2210.1550.1470.160
53.460.1810.1090.0920.0920.101
64.160.1540.08040.06090.05610.05780.0638
74.850.1330.06180.04230.03590.03470.0364
85.550.1180.04890.03060.0240.02170.02160.0229
96.240.1050.03970.02280.01660.01410.01330.01350.0145
106.930.09520.03290.01740.01180.009430.008440.008190.00846

数据来源:http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html

Bitmap一般当作BitArray/BitSet来使用,一般键值为Index,因此比较适用密集的数据,并且key为整数类型。而Bloom Filter经过多个Hash,占用了多个Bit,在内存占用上没有优势,但是它的键可以是任意值,且无关密集稀疏。

这篇关于谈谈Bloom Filter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855988

相关文章

Hbase Filter+Scan 查询效率优化

Hbase Filter+Scan 查询效率问题 众所周知,Hbase利用filter过滤器查询时候会进行全表扫描,查询效率低下,如果没有二级索引,在项目中很多情况需要利用filter,下面针对这种情况尝试了几种优化的方案,仅供参考,欢迎交流。 根据业务要求,作者需要根据时间范围搜索所需要的数据,所以作者设计的rowKey是以时间戳为起始字符串的。 正确尝试: 1.scan 设置 开始行和结

Filter基本原理和使用

https://www.cnblogs.com/xdp-gacl/p/3948353.html 一、Filter简介   Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控

在UE的内容浏览器中添加自定义的Filter

目标需求 在UE的内容浏览器中,可以使用Filter来过滤资源: 目标需求是在这之中添加一个自定义的Filter。 其代码上是非常简单的,在本文末尾。 然而我觉得找到方法的过程也是挺有意思的,因此我也记录了下来。 探索过程 1. 在哪定义? 首先,我猜测Other Filters下的各个项目,也都是通过代码添加的。因此,我调了其中一项,比如Show Redirectors,然后对代码进

谈谈我的8年编程自学辛酸史

2008年:第一个脚印 2008年的一个周末,我一如既往读着最爱的《电脑迷》和《电脑爱好者》,不经意间看见一篇文章,教读者如何自己制作一个exe来说生日快乐,于是,或许是我一生的道路就从这里开始了。 当时已经痴迷于电脑软件,但是身为初中生的我并没有机会玩电脑,只能苦苦地看着杂志记录好玩的软件,并没有想过真的要自己去制作软件。直到去新华书店买辅导书的一次契机,我看见了一本《Java语言教程》

作为面试官的一点点感悟,谈谈技术人的成长之路

因为工作上的原因,做过几次面试官,面试的同学有应届生,也有工作3-5年的老技术人。最近也频繁作为面试官帮助筛选候选人,中间有很多值得深思的东西,我记录了下来分享给大家。 以下观点仅为个人观点,不代表任何公司的立场。        01 面试不是简单的你问我答 一般来讲,作为面试官和候选人进行沟通的第一个问题是一般是自我介绍,整个自我介绍的情况应该控制在2分钟左右,阐述自己的教育背景,项目经历

谈谈经典限流方法—漏桶、令牌桶与Guava RateLimiter的实现

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 高并发的业务系统经常要接受大流量的考验,为了保证系统的响应度和稳定性,往往都需要对有风险的接口实施限流(rate limiting),更高大上的说法则是“流量整形”(traffic shaping)。限流的思想最初来源于计算机网络,有两种经典的方法:漏桶和令牌桶。本文先来稍微研究一下它们。

Flink实例(六十八):布隆过滤器(Bloom Filter)的原理和实现

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

uni-app 扫码优化:谈谈我是如何提升安卓 App 扫码准确率的

一. 前言 之前的一个项目遭到用户吐槽:“你们这个 App 扫码的正确率太低了,尤其是安卓的设备。经常性的扫码扫不出来,就算是扫出来了,也是错误的结果!” 由于之前是扫描二维码的需求,所以没有对扫描条形码做严格的测试,客户提示说是条形码扫描效率低下。随即,我用自己的手机测试了一下,在安卓手机上确实有这样的问题,扫码准确率确实是低,尤其是条形码,扫码效率慢且不准确。扫描二维码的的效率还算可以

谈谈singelton单例模式

 单例模式是一种常用设计模式。该类只有一个实例,而且该类自行创建实例。         很多时候,服务器都只需要一个全局对象,这样方便协调系统的整体行为。比如系统的配置文件,系统只需要一个单例对象读取加载,其他对象只需要通过该单例对象获取配置信息。这样方便在复杂模式下对系统配置的管理。          java中常用单例模式: public class Singleton(

谈谈函数返回值为什么不能重载

一、函数的定义:       函数将有效的输入值变换为唯一的输出值,同一输入总是对应同一输出。       计算机本质是对抽象数学公式的具体实现,并以此具体实现来解决现实生活中的实际问题。 注:wiki百科对 “函数” 的定义如图,图比较大,请点击打开详情,左右拖动查看 全部内容。 二、悖论      反过来设想一下,如果返回值的类型 能用来 重载,那么对于相同的输入值,程序怎么决定