你可以完全相信布隆-布隆过滤器

##布隆过滤器
什么是布隆过滤器?
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。
布隆过滤器优缺点:它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误算率和删除困难。
误算率和删除困难:随着存入的元素数量增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣。另外,一般情况下不能从布隆过滤器中删除元素。我们很容易想到把位列阵变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全的删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。

布隆过滤器原理

存储

利用散列思想我们可以设计以下布隆过滤器来存储元素:
1.建立hash表
索引|0|1|2|3|4|5|6|7|8|9
—| —|---|—|---|
初始值| 0|0|1|0|0|0|0|0|0|0|0|0
2.假如我们有一个数字25
25 的二进制数字为11001
若取其偶数位和奇数为重新组合
奇数位:101
偶数位:10
3.将计算的奇偶数mod10存入哈希表。
5mod10=5;
2%mod10=2;
对应位初始值加1:
索引 |0|1|2|3|4|5|6|7|8|9
—|---|–
索引值|0|0|1|0|0|1|0|0|0|0

查询

如何查询布隆过滤器中是否有某个元素呢?
假如我们有以下的布隆过滤器
索引|0|1|2|3|4|5|6|7|8|9
—| —|---|—|---|
初始值| 1|0|1|0|1|0|0|1|0|0|1|0
如要查询的的数字是25
首先计算25的二进制表达式:11001
然后奇数位偶数位分别计算
得到5和2两个元素
5mod10=5;
2mod10=2;
在对应表中2和5 中查询发现2中不为0,但5中为0,则认为此元素不在集合之中。

布隆过滤器的应用

相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。而且布隆过滤器可以表示全集,其它任何数据结构都不能。

因此广泛应用于网页URL的去重,垃圾邮件的判别,集合重复元素的判别,查询加速(比如基于key-value的存储系统)等。

布隆过滤器虽然会误报,但是不会漏报,有点宁肯错杀一千,不会放过一个的感觉。因此在某些对误报率要求不是很高的地方,布隆过滤器的高效查询能力,还是受到了极大的青睐。

关于误报率的计算

Target:靶,也就是集合的大小
Target=Size(BitArray)
Dart:飞镖,也就是待计算的元素,hashfunc为输入数据的量hash函数的个数
Dart=Size(NumOfInputElements∗NumHashfunc)
0的误判率:F0=e^(−Dart/Target )
1的误判率为F1=(1−F0)^hashfunc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值