• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
qianye0905
博客园    首页    新随笔    联系   管理    订阅  订阅
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中的最小值来近似表示元素出现的频率

posted on 2013-05-02 22:55  qianye0905  阅读(798)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3