Bloom Filter算法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Bloom Filter 数据结构广泛地应用于网络技术中,它是由 Burton Bloom 在 1970 年提出来的。
它的优点是可以有效地节省空间,缺点是不能做到精确无误,不过这个看似很郁闷的缺点却可以使用调节参数的方法有效控制,
也可以通过不同的应用手段来避免差错。Bloom Filter 数据结构有很多应用,将在下一篇文章里叙述,
而这篇文章将简要叙述这个算法的原理和分析。

问题定义:如何用简单节省的方法将一个集合中的所有元素表述出来?
原理:有一个集合 S = ( x1, x2, ... , xn), 用一个 n bit 的数组把这个集合表示出来。
使用 k 个独立的哈希函数,将 S 中的每个元素 xi 映射到这个 n bit 的数组中的某一位上,
对于 S 中的每个元素要做 k 次哈希。n bit 的数组初始化每一位为 0 。

如图所示:

0 0 0 0 0 0 0 0 0 0 0 0

    x2_______________
x1________|   |   |
|   |   |   |   |
0 1 0 1 0 1 0 1 0 0 1 0

  x2'_______________
x1'______|   |   |
    | | |   |   |
0 1 0 1 0 1 0 1 0 0 1 0

从上图可见,x1 , x2 被映射到 n-bit 中,来了两个查询,x1' 和 x2' ,
对这两个查询也分别做 k 个哈希映射,结果 x1' 对应的值不全是 1 ,
这说明在集合S中肯定不存在和 x1' 相同的元素。而 x2' 对应的 bit 都是1,这说明 x2' 有可能存在于集合中。
但是它不存在的可能性也是有的,因为不能保证不同的元素的哈希值不同。

下面是几个关于 bloom filter 的延伸分析。
1)使用 bloom filter 可以做集合的并、交运算。只需将 n-bit 数组 OR 或 AND 就可以了。
但是结果并不精确。
2)bloom filter 有时会用在描述一个变化的集合上。
添加一个新的集合元素进入 bloom filter 很容易,而删除从集合中删除一个元素,
却不是那么简单,因为会附带着把其他元素的信息也删除掉。为了解决这个问题,
使用多个 bit 位取代使用一个 bit 位。每次映射到这个位置,就加 1 。
}


Bloom Filter是可作为URL排重算法的一种算法.
它的基本思想来源于Hash表.但又不同.
Hash表的思想是通过散过函数快速定位的Hash桶位置.如果Hash冲突则开链表保存.
基本上一个合适的Hash函数,和合适的Hash桶大小,会使Hash冲突变得很小.
因而Hash表具有极快速的添加,查找,删除功能.也非常适合用于URL排重. 但是Hash表的实现空间效率不好.
而Bloom Filter是一种Hash表思想的延伸.它并不通过Hash表开链表的形式来解决冲突.
而是用多个Hash函数来计算数据,而取得多个Hash数组的下标,并标记,以多个Hash函数的计算结果来稀释冲突的机率.
例如用10个Hash函数分别计算同一个数据,而得到10个数组下标,通过判断这十个下标相对应的标记位的标记即可判断是否存在.

Python中的Bloom Filter算法详解 Bloom Filter是一种空间效率高且能够快速查询的集合数据结构,它通过多个哈希函数将元素映射到位数组中。误判(False Positive):Bloom Filter可能会错误地判断某个元素在集合中,但绝对不会漏掉一个实际存在的元素(即不会产生误报)。无删除操作:标准的Bloom Filter不能删除元素,因为删除会影响其他元素的查找。我们将创建一个类,并实现基本的插入查询功能。self.size = size # 位数组大小。 阅读详情

相关推荐

网页查重算法ShinglingSimhashbloom filter研究

网页查重算法ShinglingSimhashbloom filter研究 在网页查重算法中 shingling simhash 被认为是当前最好的两个算法。 shingling算法 shingling算法用于计算两个文档的相似度,例如,用于网页去重。 "a rose is a rose is a rose" 分词后的词汇(token,语汇单元)集合是 (a,rose,is,a,rose,is, a, rose) 那么w=4的4-shingling就是集合: { (a,rose,is,a), (r

Raina_qing的博客 1436

【编程实践】用 go 语言实现Bloom filter算法

定义 Bloom filter数据结构,包括一个 bit array,用来存放元素的 hash 值,以及一系列 hash 函数,用来计算元素的 hash 值。本文介绍了如何使用 go 语言实现 Bloom filter 算法,实现的过程主要包括定义 Bloom filter数据结构,实现插入、查询删除元素的函数,以及测试算法的准确率性能。最后,通过测试函数验证了算法的准确率,表明实现的算法可以正确运行。

AI天才研究院 2万+

海量数据处理算法Bloom Filter

算法介绍 Bloom Filter的中文名称叫做布隆过滤器,因为他最早的提出者叫做布隆(Bloom),因而而得此名。布隆过滤器简单的说就是为了检索一个元素是否存在于某个集合当中,以此实现数据的过滤。也许你会想,这还不简单,判断元素是否存在某集合中,遍历集合,一个个去比较不就能得出结果,当然这没有任何的问题,但是当你面对的是海量数据的时候,在空间时间上的代价是非常恐怖的,显然需要更好的办法来

走在前往架构师的路上 3760

布隆过滤器(Bloom Filter)

布隆过滤器简介布隆过滤器(BloomFilter)是1970年由布隆提出的一种空间空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并判断一个元素是否属于这个集合。使用布隆过滤器,存在第一类出错(Falsepositive),但是不会存在第二类错误(Falsenegative),因此,布隆过滤器拥有100%的召回率。也就是说,布隆过滤器能够准确判断一个元素不在集合内,但只能判断一个元素...

qiuyumin430的博客 653

数据结构算法Bloom Filter(布隆过滤器)解决大数据查重问题

在内存有所限制的情况下(如上面的面试问题),快速判断一个元素是否在一个集合(容器)当中,还可以使用。布隆过滤器到底是个什么东西呢?

Sauron7i的博客 1496

Bloom Filter算法及应用

1. 引言 问题:有1000瓶药,但是其中有一瓶是有毒的,小白鼠吃了24小时后就会死掉,请问,在24小时找出有毒的药物,最少需要多少只小白鼠? 答案是:10只,一只小白鼠可以表示2种状态,2^10可以表示1024种状态 分析可参考:http://lzj0470.iteye.com/blog/657579 通过二进制向量组来扩展描述的状态,Bloom Filter(BF)算法也是利用这个思想

yfk的专栏 3151

海量数据处理算法Bloom Filter

1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法Bloom Filter有可能会出...

dxx707099957的博客 208

Scrapy爬虫去重效率优化之Bloom Filter算法的对接

首先回顾一下Scrapy-Redis的去重机制。Scrapy-Redis将Request的指纹存储到了Redis集合中,每个指纹的长度为40,例如27adcc2e8979cdee0c9cecbbe8bf8ff51edefb61就是一个指纹,它的每一位都是16进制数。我们计算一下用这种方式耗费的存储空间。每个十六进制数占用4 b,1个指纹用40个十六进制数表示,占用空间为20 B,1万个指纹即占用空...

学海无涯 4459

Scrapy 爬虫去重效率优化之 Bloom Filter算法的对接

From:https://cloud.tencent.com/developer/article/1084962 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中https://www.cnblogs.com/adc8868/p/7442306.html scrapy redi...

墨鱼菜鸡 664

Bloom-Filter算法 简介

Bloom-Filter算法 其实可以看作 bit-map 的一种扩展。 它把已存在的元素通过多个hash 函数映射到一个 bit 序列,对于每一个元素根据hash函数的结果把相应的 位置置一(这个bit序列通常很长,但是比起记住所有元素它占用的空间是小的)。 在判断一个元素时候已存在的时候,它会把这个元素的多个hash结果对应到bit序列中查看,如果已经全部置为一,那么说明该元素已经存在。

rav009的专栏 1016

bloom_filter算法的C++实现

C++语言: bloom_filter算法的C++实现#include #include #include unsigned int jshash(const char *s, unsigned size);unsigned int sdbmhash(const char *s, unsigned size);/* ------------- bloom types and funcs -

344

bloom filter算法

bloom filter算法

朝着梦想 渐行前进 2845

php bloomfiter,PHP中实现Bloom Filter算法_PHP

one_num = 8;//默认32m*1$this->space_group_num = $space_group_num;$this->hash_space_assoc = array();//分配空间for($i=0; $ispace_group_num; $i++){$this->hash_space_assoc[$i] = str_repeat($binary, $ma...

weixin_39876856的博客 177
上一篇: 面试两个人应届生的经验 -------转自《学生大本营》的杨中科老师的笔记
下一篇: 传感器网络与无线自组网的区别
candyice
博客等级 码龄20年 32粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值