zoukankan      html  css  js  c++  java
  • Bloom filter/Bitmap

    使用范围:实现数据字典,进行数据的判重,集合求交集
    基本原理:基于bitmap,bitmap中用一个bit位来表示一个数字,而Bloom filter是用多个bit位是否同时存在来判定元素是否存在。它的实现用到了位数组和k个hash函数,存入一个元素时,用k个hash函数分别求值,并将相应的bit位置1,当查找的时候,根据k个hash值,到k个位置查找,如果k个位置都存在,表明该元素存在,如果有一个bit位不存在表明元素不存在。很明显这个过程并不保证查找结果是百分百正确。同时它也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动其它的关键字,一个简单的改进是使用counting bloom filter,用一个counter数组来替换位数组,就可以支持删除了。还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小以及 hash函数个数k. 当hash函数个数k=(ln2)*(m/n)时错误率最小,在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合,因为要保证bit数组里至少一半为0,则应该满足m>=n*lg(1/E) * lge,大概就是n*lg(1/E)的1.44倍(lg表示以2为底的对数)

    举个例子,我们假设错误率为0.01,则此时m应该大概是n的13倍,k大概是8个

    注意m是以bit为单位,而n则是以元素个数为单位,通常单个元素的长度都是有很多bit的,所以使用Bloom filter通常很节省内存

    扩展:Counting bloom filter将数组中的每一位扩展为一个counter,从而支持了元素的删除操作,而Spectral Bloom Filter将其与几何元素的出现次数惯量,
    SBF采用counter中的最小值来近似表示元素出现的频率

  • 相关阅读:
    51 Nod 1068 Bash游戏v3
    51 Nod Bash 游戏v2
    51 Nod 1073 约瑟夫环
    UVA 12063 Zeros and ones 一道需要好好体会的好题
    51 Nod 1161 Partial sums
    2018中国大学生程序设计竞赛
    UVA 11971 Polygon
    UVA 10900 So do you want to be a 2^n-aire?
    UVA 11346 Possibility
    python with as 的用法
  • 原文地址:https://www.cnblogs.com/qianye/p/3055625.html
Copyright © 2011-2022 走看看