布隆过滤器

转自:谈谈布隆过滤器,保存在此以学习。

之前就阅读过数学之美,知道有这么个基础的算法,可是因为不常用到也就没当回事,最近重新看到它觉得很高大上,就想来mark下

设计初衷: 
(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的,不知道当时布隆为啥想到设计时究竟是碰到了啥问题,但这确实很有效 
**来看下面的问题: 
1.检查一个单词是否拼写正确->看它是否在已经字典中 
2.网络爬虫->一个网址是否访问过 
3.邮件过滤,建立那些发垃圾邮件的地址的黑名单**

你可能会说哈希表不就行了吗,但在2,3的问题中,网页和垃圾邮件地址全球动不动便是几十亿那,哈希的存储效率也就50%左右 
一亿Email(一个占16字节)约为1.6GB内存,要是几十亿个地址就几百GB,谁家这么有钱,都去建天河二号 
所以啊,能不能少花点内存来干这事:于是布隆过滤器来了,只要12.5%到25%的哈希表空间就能干这事,但是有点小错误,这个小错误概率太小就基本不担心了

工作原理: 
一亿Email => 16亿二进制(bit)==2亿字节(哈希就是16亿字节了)

1.先全部位清0,对每一个电子邮件地址X,用8个不同的随机数产生器(F1,F2,..F8)产生8个信息指纹(比如md5),

2.然后用一个统一的随机数产生器G把这8个信息指纹=>8个自然数g1,g2,g3..,g8,这些位置上的位置为1

1亿个地址放入建好这个布隆过滤器

然后新来一个,同样处理,对应8个二进制位 t1,t2,…,t8 
如果全为1,好的=>判定位垃圾邮件

你会想了,这样靠谱不,万一把非垃圾邮件误判了咋办

我们来看看误判的概率: 
先来算任何一个位被置为1的概率p,这样你可以简单的就知道 
新来一个,有8个位,如果被误判了,此时这8个位全为1,其概率为

p8

我们来推到下一般的情况,假设有m个位,n个元素,有k个哈希函数, 
针对单个元素插入来说: 
11/m

K111/m)k

111/m)kn

1111/m)kn

同样的新来一个,要命中其概率为: 
1[11/m]kn)k1ekn/m)k  
上次k=8,n/m=1/16,计算值大约在万分之五,误判率非常低,基本可容忍。*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值