布隆算法(BloomFilter)

BloomFilter算法,是一种大数据排重算法。在一个数据量很大的集合里,能准确断定一个对象不在集合里;判断一个对象有可能在集合里,而且占用的空间不大。它不适合那种要求准确率很高的情况,零错误的场景。通过牺牲部分准确率达到高效利用空间的目的。

场景一:假如有一个很大的表,通过字段key查询数据,操作很重;业务方请求时,传过来的key有很大一部分是不存在的;这种不存在的key请求就会浪费我们的查询资源。针对这种情况,我们可以引人BloomFilter算法,在请求key查询之前,使用BloomFilter匹配。如果不存在,就不用去查询了(正确率百分之百);如果存在,走原来的查询流程(有可能不存在的key混进去了)。

场景二:假如有一个很大的表,通过字段key判断是否存在,操作很重,如果存在就做一些操作,不存在就加入表中;可容许一定的误判。对应这种情况,我们也可以引入BloomFilter算法,通过key查询表判断存在否的方式可换成BloomFilter算法。如果存在,我们执行以前的逻辑(有一定的误判,业务也允许一定的错误);如果不存在,也执行以前的逻辑。

BloomFilter是由一个长度为n的bit数组S和k个hash算法组成。先使bit数组的初始值为0.

添加值M:M经过k个hash算法计算后,得到:M1, M2 … Mk; 然后,使S[M1]=1,S[M2]=2... S[Mk]=1

判断值Y:Y经过k个hash算法计算后,得到:Y1,Y2... Yk。 然后,判断S[Y1],S[Y2] … S[Yk] 是否都为1。如果有一个不为1,那这个Y就一定是不存在的,以前没添加过;如果都为1,那这个Y可能存在,也可能其他值添加后,影响了这次判断的结果。

我们要做的是尽量降低正确判断的误判率,资料显示, 当 k = ln(2)* m/n 时(k是hash函数个数,m是bit数组的长度,n是加入值的个数),出错概率是最小的。

当然,如果我们要移除值,怎么办呢?当前的结构是没法实现的,我们可以通过在加一个等长的数据,存放每个bit位设置为1的次数,设置一次加1,取消一次减一。

时间: 2024-08-10 12:51:11

布隆算法(BloomFilter)的相关文章

【布隆算法】布隆算法最详解

布隆算法最详解 本文源地址: http://www.fullstackyang.com/...,转发请注明该地址或segmentfault地址,谢谢! 1. 背景知识 在网上已经有很多关于布隆过滤器的介绍了,这里就不再赘述,下面简单地提炼几个要点: 布隆过滤器是用来判断一个元素是否出现在给定集合中的重要工具,具有快速,比哈希表更节省空间等优点,而缺点在于有一定的误识别率(false-positive,假阳性),亦即,它可能会把不是集合内的元素判定为存在于集合内,不过这样的概率相当小,在大部分的生

网络爬虫:URL去重策略之布隆过滤器(BloomFilter)的使用

前言: 最近被网络爬虫中的去重策略所困扰.使用一些其他的"理想"的去重策略,不过在运行过程中总是会不太听话.不过当我发现了BloomFilter这个东西的时候,的确,这里是我目前找到的最靠谱的一种方法. 如果,你说URL去重嘛,有什么难的.那么你可以看完下面的一些问题再说这句话. 关于BloomFilter: Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员.如果检测

Spark布隆过滤器(bloomFilter)

数据过滤在很多场景都会应用到,特别是在大数据环境下.在数据量很大的场景实现过滤或者全局去重,需要存储的数据量和计算代价是非常庞大的.很多小伙伴第一念头肯定会想到布隆过滤器,有一定的精度损失,但是存储性能和计算性能可以达到几何级别的提升.很多第三方框架也实现了相应的功能,比如hbase框架实现的布隆过滤器性能是非常的棒,redis也可以实现相应的功能.这些需要借助于第三方框架,需要维护第三方框架.如果公司没有部署相应架构,单独为使用布隆过滤器部署一套集群,代价还是非常大的. 我们在做流式计算时需要

Hbase 布隆过滤器BloomFilter介绍

1.主要功能 提高随机读的性能 2.存储开销 bloom filter的数据存在StoreFile的meta中,一旦写入无法更新,由于StoreFile是不可变的.Bloomfilter是一个列族(cf)级别的配置属性,假设你在表中设置了Bloomfilter,那么HBase会在生成StoreFile时包括一份bloomfilter结构的数据,称其为MetaBlock:MetaBlock与DataBlock(真实的KeyValue数据)一起由LRUBlockCache维护.所以,开启bloomf

布隆算法Bitmap(位图算法)

2A酶畔B度s冉园亮9Qhttp://www.zcool.com.cn/collection/ZMTgzODMwMzY=.html BN49Y诳切5糖AQG5门http://www.zcool.com.cn/collection/ZMTgzODMxMDA=.html 9敦n傺1艺39牟17http://www.zcool.com.cn/collection/ZMTgzODMxNTY=.html gElMvot踊促炭剐5ZPhttp://www.zcool.com.cn/collection/ZM

crapy 去重与 scrapy_redis 去重与 布隆过滤器

目录 scrapy 的去重 scrapy-redis 去重 自定义过滤 布隆过滤器 在开始介绍 scrapy 的去重之前,先想想我们是怎么对 requests 对去重的. requests 只是下载器,本身并没有提供去重功能.所以我们需要自己去做. 很典型的做法是事先定义一个去重队列,判断抓取的 url 是否在其中,如 crawled_urls = set() def check_url(url): if url not in crawled_urls: return True return F

选择guava更安全,更简洁

1.为什么使用guava? 主要针对jdk1.5,jdk1.6中的接口进行封装或者优化,为常用的服务提供更丰富的结构支持,提供更安全代码操作.关键词:更优化.更安全.更丰富 2.guava主要提供哪些方面的接口支持? I/O:主要针对jdk中的I/O异常可能会导致数据写失败问题,针对输入源Sources和输出地Sinks构建了更安全的读写及数据流关闭接口,主要包括:ByteSource/CharSource/ByteSink/CharSink/Closer,该机制有效的解决的数据流关闭异常可能会

用Python实现一个大数据搜索及源代码

在日常生活中,大家了解搜索引擎如百度.360.搜狗.谷歌等,搜索是大数据领域里常见的需求.Splunk和ELK分别是该领域在非开源和开源领域里的领导者.本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理. 布隆过滤器(BloomFilter) 第一步我们先要实现一个布隆过滤器. 布隆过滤器是大数据领域的一个常见算法,它的目的是过滤掉那些不是目标的元素.也就是说如果一个要搜索的词并不存在与我的数据中,那么它可以以很快的速度返回目标不存在. 让我们看看以下

Redis缓存,持久化,高可用

一,Redis作缓存服务器 ? 本篇博客是接着上一篇博客未分享完的技术点. ? redis作为缓存服务器是众多企业中的选择之一,虽然该技术很成熟但也是存在一定的问题.就是缓存带来的缓存穿透,缓存击穿,缓存失效问题,继而引用分布式锁. 1.1,缓存穿透 ? 在如今的项目中大多采用垂直的MVC架构,由service层去调用DAO层,然后DAO层再去查询数据库.而redis作为缓存服务器就是在service层去调用DAO层去查询时先去缓存服务器查询,如果存在则直接返回该数据,否则再去查询数据库.由此可