谈谈布隆过滤器(比哈希表省很多内存,简言之更牛逼)
来源:互联网 发布:站长工具 网站数据 编辑:程序博客网 时间:2024/06/05 02:25
之前就阅读过数学之美,知道有这么个基础的算法,可是因为不常用到也就没当回事,最近重新看到它觉得很高大上,就想来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,其概率为
我们来推到下一般的情况,假设有m个位,n个元素,有k个哈希函数,
针对单个元素插入来说:
同样的新来一个,要命中其概率为:
上次k=8,n/m=1/16,计算值大约在万分之五,误判率非常低,基本可容忍。*
0 0
- 谈谈布隆过滤器(比哈希表省很多内存,简言之更牛逼)
- sscanf比fscanf慢很多
- BloomFilter(布隆过滤器)
- 布隆过滤器(BloomFilter)
- 布隆过滤器(BloomFilter)
- 传说中比冒泡排序快很多的排序方法(vb)
- Ext.js5表格—多列的表格(比fieldcontainer布局效率很多)(48)
- 归档日志的大小比在线日志的大小小很多(转)
- POJ3615 超多次输入输出数据 Scanf比cin速度快很多(最短路 Floyd)
- 对java数组进行插入和删除比链表快很多(一)
- Flex4比Flex3”肥”了很多
- 很多时候失败比成功更重要
- php fsockopen比soapclient 慢很多
- 归档日志比在线日志小很多
- Android内存优化(2)-为什么寄存器比内存快?
- 布隆过滤器(Bloom Filter)
- 布隆过滤器(Bloom Filter)
- 布隆过滤器(Bloom Filter)
- Guava类库学习--Multiset+Multimap+BiMap
- 第9周项目2592: 改错题B--数组元素交换
- Greatest Common Divisor (GCD) - Euclidean algorithm
- 希尔排序
- 翻转单词顺序VS左旋转字符串
- 谈谈布隆过滤器(比哈希表省很多内存,简言之更牛逼)
- hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
- 图片渲染的应用
- OpenCV 实现HOG行人检测
- Python, MySQLdb 编码问题 UnicodeEncodeError:'latin-1' codec can't encode character ...
- String之 split 分割字符串(分隔符如:* ^ : | , .) 及注意点
- Samza状态管理分析
- 整数划分(hdu 1028)
- 从完全不包含人体的图片中随机剪裁出64*128大小的用于人体检测的负样本