算法设计与分析——布隆过滤器(Bloom Filter)
分类目录:《算法设计与分析》总目录
相关文章:
· 位图(BitMap)
· 布隆过滤器(Bloom Filter)
布隆过滤器(Bloom Filter)是1970年由布隆提出的,是非常经典的以空间换时间的算法。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
具体的操作流程:假设集合里面有 x x x个元素,且一共设置 y y y个哈希函数。
- 将位数组进行初始化,即初始化状态的数组的每个位都设置位0
- 对于集合里面的每一个元素,将元素依次通过 y y y个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。
查询某元素是否存在集合中的时,用同样的方法将待查询元素通过 y y y个哈希映射到位数组上的 y y y个点。如果 y y y个点中任意一个点不为 1,则可以判断该元素一定不存在集合中。反之,如果 y y y个点都为 1,则该元素可能存在集合中。此处不能判断该元素是否一定存在集合中,可能存在一定的误判率。
优点
相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入、查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。布隆过滤器可以表示全集,其它任何数据结构都不能。
缺点
布隆过滤器的缺点和优点一样明显。随着存入的元素数量增加,误判率随之增加。常见的补救办法是建立一个小的白名单,存储那些可能被误判的元素。但是如果元素数量太少,则使用散列表足矣。
另外,一般情况下不能从布隆过滤器中删除元素。我们很容易想到把位列阵变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全的删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。
算法设计与分析——布隆过滤器(Bloom Filter)相关推荐
- Redis缓存穿透“新杀招“:布隆过滤器Bloom Filter
场景分析 这篇文章来讲述缓存穿透的补充解决方案. 为什么要用补充来形容呢? 在之前的文章中,我们提到缓存穿透的解决方案时,我是这么说的: 关于缓存穿透,我们可以在用户访问数据库后将null值存入Red ...
- 布隆过滤器速度_布隆过滤器(Bloom Filter)详解
布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元 ...
- 布隆过滤器+布隆过滤器(Bloom Filter)详解
布隆过滤器+布隆过滤器(Bloom Filter)详解 程序 = 数据结构 + 算法 -- 图灵奖得主,计算机科学家N.Wirth(沃斯) A Bloom filter is a space effi ...
- js 数组 实现 完全树_Flink实例(六十八):布隆过滤器(Bloom Filter)的原理和实现 - 秋华...
什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...
- mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现
什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...
- 布隆过滤器(Bloom Filter)算法
布隆过滤器原理 开发一个电商项目,因为数据量一直在增加(已达亿级),所以需要重构之前开发好的秒杀功能,为了更好的支持高并发,在验证用户是否重复购买的环节,就考虑用布隆过滤器. 也顺便更加深入的去了解下 ...
- 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想
转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html 布隆过滤器[1](Bloom Filter)是由布隆(Burton ...
- 布隆过滤器(Bloom Filter)原理及优缺点剖析
直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中. 和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储 ...
- 布隆过滤器Bloom Filter简介
背景: 如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率: 采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL.红黑树)存储,查 ...
最新文章
- java future设计模式
- hdu 1853(Cyclic Tour)
- 什么技术能改变世界?
- php无限极分类设计,递归方式已经淘汰了
- 一文读懂浏览器存储与缓存机制
- php,Allowed memory size of 8388608 bytes exhausted (tried to allocate 1298358 bytes)
- python面试题之python下多线程的限制
- 评论中显示表情,苹果和安卓都一样
- Ubuntu 10.04.2上编译ecos工具
- Exchange DAG 架构 POP3验证失败处理过程
- 前后端接口文档规范模板
- powerBI发布到web,管理员权限设置
- 韩立刚老师 -- 1、Linux 入门
- java 多线程 实现死锁问题
- (java)跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
- 0-VMware Horizon 2203 虚拟桌面-目录大纲
- 清除FreeIPA SSSD缓存
- Unity 骨骼动画
- 新浪微博第三方登录,显示重定向错误问题
- Python—基于Flask框架调用百度接口实现语音识别功能