布隆过滤器

✍ dations ◷ 2024-12-23 14:38:52 #函数,散列

布隆过滤器(英语: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, 这样删除元素时将计数器减掉就可以了。然而要保证安全地删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面。这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。

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

相关

  • 电子作战电子作战(以下简称电战)泛指利用各种装备与手段来控制与使用电磁波段(包含无线电、可见光、红外线与紫外线波段)而进行的军事行动,这些行动包含维持我方使用与控制的能力,与抵挡敌
  • 作用力在物理学中,力是任何导致自由物体历经速度、方向或外型的变化的影响。力也可以借由直觉的概念来描述,例如推力或拉力,这可以导致一个有质量的物体改变速度(包括从静止状态开始运
  • 北投温泉坐标:25°08′10″N 121°30′35″E / 25.136163°N 121.509675°E / 25.136163; 121.509675北投温泉位于台湾台北市北投区,依范围大小,有广义及狭义两种说法:地热谷一带开发于1
  • 民主与独裁指数民主与独裁指数(英语:index of democracy and dictatorship),或称DD资料集(英语:DD index)或DD数据,一种政治学上用来分类民主程度与政体的量化指数。根据政治学者亚当·普热沃尔斯
  • 中非共和国2019冠状病毒病中非共和国疫情,介绍在2019新型冠状病毒疫情中,在中非共和国发生的情况。2020年3月14日,中非共和国确诊首例新冠肺炎病例。患者为意大利人,8日飞抵中非共和国首都
  • 文职白领族(英语:white-collar worker)是一个从西方传来的生活型态定义,经常拿来代表领较多薪水的专业人士。这个词可能最早是从1928年启用的,当时是代表非体力劳动的工作者,如公务员
  • 华秀华秀(Washoe,1967年-2007年10月31日),又译瓦苏、娃索,是世界上最早会使用手语的黑猩猩(她学美国手语),她的出现证明了人类以外的动物似乎也会使用人类的语言,但是依然有争议,像泰瑞斯(He
  • 明天会更好《明天会更好》(英语:)是台湾华语流行乐坛史上最成功的公益单曲之一。由台湾音乐家罗大佑作曲,罗大佑、张大春、许乃胜、李寿全、邱复生、张艾嘉、詹宏志等人共同作词,陈志远编曲
  • 爱德华·韦斯特马克爱德华·亚历山大·韦斯特马克(瑞典语:Edvard Alexander Westermarck,1862年11月20日-1939年9月3日)是一位芬兰哲学家、社会学。在其著作《人类婚姻史》(1891年)中提出了韦斯特马
  • 梅普尔伍德 (新泽西州)梅普尔伍德(Maplewood)是美国新泽西州埃塞克斯郡的一个城市。据2010年美国人口普查,梅普尔伍德有人口23,867人,比2000年人口普查的23,868减少1人,比1990年人口普查的21,652增加2,