zoukankan      html  css  js  c++  java
  • Bloom Filter的基本原理和变种

    学习一个东西首先要知道这个东西是什么,可以做什么,接着再了解这个东西有什么好处和优势,然后再学习他的工作原理。下面我们分别从这三点简单介绍一下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函数更少
  • 相关阅读:
    requirejs 第一个实例
    ionic + cordova 环境搭建
    免安装mysql配置
    ConcurrentHashMap
    volatile和synchronized
    zookeeper集群安装
    题目
    Nginx
    CountDownLatch
    自己总结
  • 原文地址:https://www.cnblogs.com/liinux/p/6293949.html
Copyright © 2011-2022 走看看