bloom filter作为一种近似的集合成员查询结构,最早由1970的论文 “Space/time trade-offs in hash coding with allowable errors” 提出,其动机在于用紧凑的空间简洁地表示一个集合,同时有较高的查询效率,代价则是有一定的误报率。随着大数据时代的来临,海量数据对存储空间提出了更高的要求,在存储资源非常珍贵并且可容忍一定假阳性率的场合,bloom filter这一简洁高效的数据结构大放异彩,被广泛地应用于网络路由、数据库、存储系统、流数据处理等领域中。针对于不同的特性和应用场景,bloom filter有高达几十种变体,同时催生了cuckoo filter、quotient filter等同类型的数据结构。本文旨在介绍bloom filter的其中一种变体bloomier filter。

1. 基本原理

  bloom filter旨在回答 [某一个元素是否存在],至于元素本身是什么它并不知道。而bloomier filter的动机则是存储一个函数值,即(key,value)中的value,目的是给定一个key,从bloomier filter中可以快速查找到它对应的value值,当然也存在一定的false positive。它确保了无冲突哈希(每一个哈希位置只会对应一个value)和常数时间的查询开销。实际上,bloomier filter是传统哈希表的一种改进:传统哈希表在存储value时,存在一定的冲突率,虽然可以用链式结构来存储冲突元素的value,如图1,但这增加了查询开销;而bloomier filter实际上是寻求构建一种perfect hashing方案,使得每一个位置最多只会存储一个value,并通过hash(key)和异或操作能够取出这个value,实现常数查询时间,如图2,取2、5、8三个位置的值即可达到data,即要存储的value。

图1 hash table 图2 bloomier filter基本原理

2. 构建过程

  bloomier filter名为filter,实则不只是实现了filter的功能,它构建了一个由m个cell组成的table,每个cell为q位。假设要表示的key属于集合S,而S属于D,key和value之间满足:若key属于S,则value包含于R (R的范围为1~2^r-1,即r bits可以表示的范围,r<q)。其构建总体分为两步:1)确定插入位置和次序;2)根据位置和次序依次插入建立hash table。

2.1 确定插入位次

  这一步骤的目的是在插入元素之前,找到一种插入方案,使得每个元素独自占有一个更新位置,即不与其他元素冲突。bloomier filter提出的策略是:每次找出只被一个元素参考的位置,将其设置为该元素的更新位置,并将其位次设为最后,那么所有在该元素之后确定更新位置的元素一定不会与其冲突。图3所示为确定插入位次的具体过程。A,B,C,D为四个key,f记为对应的value,也就是要存储的对象。M为额外设置的一个值(目的是减小false positive),neighborhood为key对应的k个哈希值,也就是key的k个参考位置(这里取k=4),最后两列分别为每个key的具体更新位置和次序。具体过程为:如图3.1,在A,B,C,D的所有参考位置中,2出现了一次,所以首先确定D的更新位置为2,其次序为最后,即4,然后去掉D对应的参考位置2、3、8、7,发现只有7出现一次,于是设置A更新位置和次序分别为7,3;依次类推,最后的位次设置如图3.2。

图3.1 开始插入 图3.2 插入结束

2.2 建立完美hash table

  按照上一步确立的插入位置和次序,依次插入key对应的value,即可保证无冲突。然而,并不能将value直接存放在table中:在查询时,我们并不知道key对应的value的具体更新位置,而是只知道k个参考位置(hash计算得到),这样便不能确定那个位置的值才是正确的值。因此,bloomier filter利用k个参考位置取异或来得到value,具体操作如图4:首先插入B到3号位置,实际插入的值为f(B)、M(B)以及各个参考位置的值求异或;按此方法依次插入,直至结束,如图4.2。 如此,在查询时,就可以通过这一存储的值和M(B)以及各个参考位置的值求异或得到f。这正是异或操作的巧妙之处。

图4.1 插入B 图4.2 插入结束

3. false positive和可变table

  bloomier filter的false positve源于key和value的映射关系: 若key包含于S,则查询返回值一定包含于R; 若key不包含于S,即key包含于D-S, 那么有一定的概率查询得到的值也包含于R。由于每个cell为q bits,而R的范围由r bits的非负整数表示,故false positve为2^(r-q)。 此外,为了应对value可变的场景,bloomier filter也可建立可变table:最终共建立两个表,表1如上所述,只是具体存储的是key对应的更新位置,表2则在对应位置存储value,查询时根据表1得到存储位置,然后根据表2得到value,因此value可任意改变。
  当然, false positive在构建位次表时也会出现失败的情况,但概率很小。

参考文献

The Bloomier Filter: An Efficient Data Structure for Static Support Lookup Tables(原文)
[Bloomier Filter] https://marco79423.net/articles/bloomier-filter/link
[bloom filter] https://www.cnblogs.com/liyulong1982/p/6013002.html link

Bloomier filter简介相关推荐

  1. endnote 选择一个导入过滤器_EndNote 的 Filter 简介,操作和基本结构 | 科研动力

    EndNote 的 Filter (滤件)是 EndNote 的一个重要部分,在导入文献时起到重要的作用.科研动力本文就滤件的简介,基本操作和基本结构作一个详细的介绍,理解这些内容对于新建滤件有很大帮 ...

  2. 布隆过滤器Bloom Filter简介

    背景: 如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率: 采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL.红黑树)存储,查 ...

  3. java 过滤器Filter

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  4. Filter学习(一)

    一.Filter简介 Filter:可以对web服务器管理的所有web资源(如Jsp, Servlet, 静态图片文件或静态 html 文件等)进行拦截,从而实现一些特殊的功能.例如实现URL级别的权 ...

  5. 布隆过滤器(Bloom Filter)原理及优缺点剖析

    直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中. 和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储 ...

  6. Tomcat Filter 自己动手实现

    Filter 简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文 ...

  7. javaweb学习总结(四十二)——Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  8. FFmpeg Filter基本使用

    FFmpeg Filter基本使用 目录 FFmpeg filter简介 filter的使⽤⽅法 filter的语法 filterchain的语法 filtergraph的语法 基本结构 创建简单的滤 ...

  9. 方立勋_30天掌握JavaWeb_Servlet Filter(过滤器)未完

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片 ...

最新文章

  1. GEB:中科院南土所梁玉婷组-大陆尺度下稻田土壤微生物β多样性的纬度分布特征...
  2. fragment中的onCreateView和onViewCreated的区别和
  3. 如何与风险投资商打交道
  4. P3957-跳房子【单调队列,dp,二分】
  5. PC软件开发技术之三:C#操作SQLite数据库
  6. 分组求和计算_excel聚合、累计、分组累计、分组聚合函数
  7. linux存储格式化和挂载
  8. python中属性与方法_python中属性和方法的动态绑定
  9. OpenCV图像处理(12)——保存图像到指定位置
  10. Wine——在Linux上运行Windows软件
  11. 浏览器对URL的长度限制
  12. 数据仓库分层设计,零基础一看就会
  13. 数理统计复习笔记八——Kolmogorov检验
  14. 仿迅雷播放器教程 -- 提取exe资源(12)
  15. android手机电池寿命,手机用多久换电池比较合适?
  16. Jmeter录制手机app脚本
  17. 室内设计——办公楼创意室内设计(包含预览图jpg和.psd文件)
  18. Element Black 打造 NFT 新形式
  19. python-匹配手机号-按号段-正则
  20. 网页小游戏源码丨FC模拟器网页版源码

热门文章

  1. Python 万能代码模版:自动办公,提升 X10 倍工作效率
  2. PPT计算机基础知识,计算机基础知识(精美版).ppt
  3. iOS项目中一定会用到的两种常用的弹框 从底部弹出 、中间弹出 Swift代码
  4. 临床输血技术规范(2000年6月1日卫生部发布)
  5. BUAA数据结构作业——基于Huffman码的文件压缩工具
  6. uni.downloadFile的400状态码
  7. Unity Shader 屏幕抓取,屏幕坐标
  8. html图片颜色加深,CSS教程:图片使用混合模式和颜色叠加filter滤镜,改变PNG图标颜色...
  9. 点位盘源码php,2020.10新版外汇微盘微交易 时间盘 点位盘白色版源码下载
  10. 配音剧本_网络的各个阶段:剧本如何传达更好的UX