学习一个东西首先要知道这个东西是什么,可以做什么,接着再了解这个东西有什么好处和优势,然后再学习他的工作原理。下面我们分别从这三点简单介绍一下bloom filter,以及和他的变种。
  1. What:在允许一定的错误率的情况下,用于判断一个元素是否属于一个集合,Bloom Filter可能会将一个不属于集合的元素误判为属于这个集合,即false positive。可以应用于检查一个URL是否已经被爬虫爬过、网络缓存共享、字符串匹配等等
  2. Why:时间和空间效率较高(与hash比较)
  3. How
    • 存储元素:用一个m位的数组和k个hash函数,对一个元素用k个hash函数映射出k个值(范围是(0~m-1),即数组下标),对数组的这m个下标位置为1
    • 查询元素:同上获得一个元素的m个下标位置,如果这m个下标位置都为1,说明元素属于该集合
    • 优点:时间、空间效率高,只需k次hash就能找到元素,只需m位空间大小,时间、空间复杂度都是常数
    • 缺点:有一定错误率、无法删除元素、无法恢复原来元素的值(因为不直接存储元素值)
  4. 从hash到bloom filter:
    1. 传统hash:

      • 存储元素:开辟h个格子,对集合中的每个元素,hash出格子的下标,将元素存于格子中。存在hash冲突的情况,用hash链表、再hash的方法解决。
      • 查找:hash出格子下标、同格子下标位置存储的元素值比较
      • 缺点:需要存储所有集合的值,空间占用大;遇到hash冲突需要再查找链表或者再hash,时间复杂度不确定
    2. 改进hash:
      1. 存储元素:开辟h个格子,对集合中的每个元素,hash出格子的下标,不直接存储元素的值,而是存储元素的编码,通常编码的位数比元素值的位数小,把元素值映射成新的编码(hash)可能会有冲突(不同元素的编码相同)
      2. 查找:同传统hash
      3. 优点:较传统hash空间复杂度低
      4. 缺点:存在一定的错误率,用正确率换取空间;无法恢复原来元素的值
    3. bloom filter:
      1. 存储和查找童第3点
      2. 优点:不用考虑冲突的情况,因为允许一定的错误率,时空效率高
  5. Bloom Filter的变种
    1. Counting Bloom Filter:原始的bloom filter不支持删除操作,CBF通过对位数组进行扩展,把原来1位扩展为t位用于计数。每次存储时将对应k个hash下标的位计数+1,删除时相应的对k个hash下标计数-1,从而支持集合删除操作
    2. Partial Bloom Filter: 原始bloom filter的hash函数值的范围是0~m-1,即整个位数组的下标范围,而在PBF中每个hash函数的取值范围较小,相互间没有交集,位数组被分成 k个区域,每个hash函数值负责一个区域。好处是准确率比原始的高,且可以并行访问数组,优化程序性能
    3. Compressed Bloom Filter:对原始的bloom filter进行压缩,用于网络传输应用。好处是经过压缩的bloom filter的错误率更低、所需位数更少、所需hash函数更少

Bloom Filter的基本原理和变种的更多相关文章

  1. 实例学习Bloom Filter

    0. 科普1. 为什么需要Bloom Filter2. 基本原理3. 如何设计Bloom Filter4. 实例操作5. 扩展 0. 科普 Bloom Filter是由Bloom在1970年提出的一种 ...

  2. Bloom Filter(布隆过滤器)如何解决缓存穿透

    本文摘抄自我的微信公众号"程序员柯南",欢迎关注!原文阅读 缓存穿透是什么? 关于缓存穿透,简单来说就是系统处理了大量不存在的数据查询.正常的使用缓存流程大致是,数据查询先进行缓存 ...

  3. Bloom Filter(布隆过滤器)的概念和原理

    Bloom filter 适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,位数组+k个独立hash函数.将hash函数对应的值的位数组置1,查找时 ...

  4. Bloom Filter:海量数据的HashSet

    Bloom Filter一般用于数据的去重计算,近似于HashSet的功能:但是不同于Bitmap(用于精确计算),其为一种估算的数据结构,存在误判(false positive)的情况. 1. 基本 ...

  5. Bloom Filter 概念和原理

    Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员.如果检测结果为是,该元素不一定 ...

  6. 【转】Bloom Filter布隆过滤器的概念和原理

    转自:http://blog.csdn.net/jiaomeng/article/details/1495500 之前看数学之美丽,里面有提到布隆过滤器的过滤垃圾邮件,感觉到何其的牛,竟然有这么高效的 ...

  7. bloom filter 详解[转]

    Bloom Filter概念和原理 焦萌 2007年1月27日 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.Bloom ...

  8. 1.Bloom filter

    Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员,这种检测只会对在集合内的数据错 ...

  9. Bloom Filter概念和原理

    Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某 ...

随机推荐

  1. Delph组件如何使用自己的图标(转)

    源:http://blog.csdn.net/henreash/article/details/7298451

  2. postgres 数据库命令行客户端psql的使用命令总结

    1.切换到 postgres 用户: 2.输入: psql , 进入到postgresql的客户端psql: 3.\l           查看当前所有的数据库: 4.psql database1   ...

  3. ZjDroid工具介绍及脱壳详细示例

    前提条件: 1.Root手机一部 2.需要通过Xposed installer(http://dl.xposed.info/latest.apk)安装Xposed Framework; 一.ZjDro ...

  4. [转] Eclipse 使用 Link 方式进行插件的安装

    下方来自 http://www.iteye.com/topic/1113353 Eclipse 的插件安装方法一般有以下几种(以安装 SVN 插件为例说明,Eclipse 版本为:3.7/Indigo ...

  5. 4、手把手教你Extjs5(四)主界面上加入顶部和底部区域

    这一节为主界面加一个顶部区域和底部区域.一个管理系统的界面可以粗分为顶部标题部分.中间数据展示和处理的部分.底部备注和状态部分. 在增加这二个区域之前,我们先在MainModel.js中加入一些数据. ...

  6. jqgrid的外观重绘

    1.如果你想随时更改jqGrid的外观和列,可以先将jqGrid卸载掉再重新加载:$(grid).GridUnload();  $("#list_server_table").tr ...

  7. BZOJ 2209: [Jsoi2011]括号序列 [splay 括号]

    2209: [Jsoi2011]括号序列 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1111  Solved: 541[Submit][Statu ...

  8. TcpView 查看端口的小工具(推荐)

    介绍: TCPView是一个Windows程序,将显示你的详细清单的所有TCP和UDP端点在您的系统,包括拥有进程名称,远程地址和状态的TCP连接. 打开下面的链接就可以下载了. https://te ...

  9. STM32 PWM波

    利用STM32产生占空比可以调节的PWM波 科普:pwm(Pulse Width Modulation)脉宽调制 关于pwm波的产生:1.首先来看一下代码: pwm波模式的相关配置(利用的是定时器TI ...

  10. android 通过wifi 热点实现手机摄像头数据共享(转)

    原文地址:http://blog.csdn.net/sinat_35845281/article/details/52674946 最近想搞一个新奇的玩意儿~~~ 最近一直在在学习通过两个Androi ...