布隆过滤器

✍ dations ◷ 2025-11-07 10:39:39 #函数,散列

布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢,上述三种结构的检索时间复杂度分别为 O ( n ) , O ( log n ) , O ( 1 ) {\displaystyle O(n),O(\log n),O(1)}

布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。

相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数( O ( k ) {\displaystyle O(k)} )。另外,散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

布隆过滤器可以表示全集,其它任何数据结构都不能;

k {\displaystyle k} m {\displaystyle m} 相同,使用同一组散列函数的两个布隆过滤器的交并运算可以使用位操作进行。

但是布隆过滤器的缺点和优点一样明显。误算率是其中之一。随着存入的元素数量增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣。

另外,一般情况下不能从布隆过滤器中删除元素。我们很容易想到把位数组变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全地删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面。这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。

在降低误算率方面,有不少工作,使得出现了很多布隆过滤器的变种。

相关

  • 郑袭郑袭(台湾话:.mw-parser-output .sans-serif{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Lato,"Helvetica Neue",Helvetica,Arial,sans-serif} 鄭襲,台
  • 故居富兰克林·D·罗斯福故居(Home of Franklin D. Roosevelt National Historic Site)也称斯普林伍德庄园(Springwood Estate)位于美国纽约州海德公园,是第32任美国总统富兰克林·D
  • 舌曲林舍曲林(英语:Sertraline)(商品名:左洛复、彼迈乐等)是一种选择性5-羟色胺再吸收抑制剂(SSRI)类抗抑郁药,1991年由辉瑞制药公司发明。舍曲林主要用于治疗成人重度抑郁症(MDD),也用来治疗
  • 湖南平原湖南平原(韩语:호남평야)又名“全州平原”。韩国最大的平原,也是朝鲜半岛三大平原之一。东南背依芦岭山脉,西临黄海。平原大部为花岗岩侵蚀的剥蚀平原,小部分是由锦江、万顷江和东
  • 米尔福德坐标:41°13′27″N 73°03′35″W / 41.22417°N 73.05972°W / 41.22417; -73.05972米尔福德(Milford, Connecticut),是美国康乃狄克州纽黑文县的一个城市,南临长岛海湾。面积6
  • 苏禄苏丹国坐标:6°03′07″N 121°00′07″E / 6.05194°N 121.00194°E / 6.05194; 121.00194苏禄苏丹国(阿拉伯语:سلطنة سولو دار الإسلام‎),全称苏禄和平之家伊斯
  • 迦楼罗 (佛教)迦楼罗(梵语:गरुड,转写:Garuḍa;巴利语:Garuḷa),又音译作揭路荼、迦娄罗、蘗噜拏、羯路荼、迦留罗、迦喽荼,伽楼罗、誐噜拏,汉译大鹏金翅鸟、金翅鸟、妙翅鸟、大鹏仙,原是印度神话
  • 土肥原贤二土肥原贤二(1883年8月8日-1948年12月23日),日本帝国昭和时代的陆军大将。从1913年起在中国从事策划侵略活动,有“帝国陆军头号中国通”之称,参与策划了九一八事变,扶植清逊帝溥仪在
  • 调度场算法调度场算法(Shunting Yard Algorithm)是一个用于将中缀表达式转换为后缀表达式的经典算法,由艾兹格·迪杰斯特拉引入,因其操作类似于火车编组场而得名。通过这个例子可以看出两
  • 常乃花宽市常乃花寛市(1896年11月23日-1960年11月28日),本名山野边寛一,日本冈山县出身的大相扑力士,第31代横纲。他身高179cm,体重112kg。他生于冈山县冈山市,出生时体重达5公斤,被称为怪童。