技术标签: java实现bloom filter
1、 引言
问题:有1000瓶药,但是其中有一瓶是有毒的,小白鼠吃了24小时后就会死掉,请问,在24小时找出有毒的药物,最少需要多少只小白鼠?
答案是:10只,一只小白鼠可以表示2种状态,2^10可以表示1024种状态
分析可参考:http://lzj0470.iteye.com/blog/657579
通过二进制向量组来扩展描述的状态,Bloom Filter(BF)算法也是利用这个思想,其本质是上是一个很长的二进制向量和一系列随机映射函数
2、 概述
问题:快速判断一个元素是否在一个集合中
解决方法:一般来说,我们会用HASH表来存储集合中的数据,好处是快速准确,缺点是存储效率低,在海量数据时一般服务器无法存储。
BF是针对哈希表存储效率低的问题,而衍生出来的一种算法。
其通过利用二进制数组来描述一个集合,来判断一个元素是否属于这个集合
优点是:快速查找,并具有非常高的存储效率
缺点是:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合
3、 算法描述
BF包含:
1)一个m位的二进位数组,每一位初始化时置为0
2)k个相互独立的hash函数
算法:
针对一个n个元素的集合,通过k个hash函数,将集合中的每个元素都映射到二进位数组中,映射到的位置置为1
例如:对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1
在判断某个元素P是否在这个集合时,通过对P应用k次hash函数,判断其对应所有的位置都是1,如果是则认为P是集合中的元素,否则不是。
4、 最优位数组m大小及hash函数个数
在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合。因此,如何根据输入元素个数n,确定位数组m的大小及hash函数个数是一个非常重要的问题。
经过一些复杂的证明(可参考相关文档),可以得到:
1)当hash函数个数k=(ln2)*(m/n)时错误率最小
2)在错误率不大于E的情况 下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合,但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)的1.44倍
5、 应用
有10亿个url,如何判断一个新的url是否在这个url的集合中?
一个url平均长度为52,如果用Hash表解决的话,由于Hash表的存储效率一般只有50%,因此10个url大概需要100G内存,一般服务器无法存储。
使用BF,要求错误率小于万分之一。
此时,输入元素n=10亿,最大错误率E=0.0001
可计算出:m=nlg(1/E)*1.44=57.6亿,大概需要7.2亿(57.6亿/8)个字节,即720M内存。
Hash函数个数:k=(ln2)*(m/n) 大概4个Hash函数
6、总结
BF通过牺牲一定的错误率来保证时间和空间(鱼与熊掌,不可兼得),目前被广泛应用于海量数据处理及数据库系统中。
例如,在Big table和Cassandra中,都使用BF作为索引结构。
P.S 针对BF的错误识别问题,可以通过建立白名单的方式解决。
参考文献:
paper:Network Applications of Bloom Filters: A Survey
http://blog.csdn.net/jiaomeng/article/details/1495500
https://www.cnblogs.com/end/category/284624.html
朗姆酒在以前只有两种:纯的白色朗姆酒,和纯的加香朗姆酒。然而近些年有一些有名的调酒师用其作为原料调制Tiki特饮(一种夏威夷的饮料),你还可以用很便宜的价格选择如同苏格兰单一麦芽威士忌一样复杂而美味的朗姆酒。你怎么能不了解朗姆酒呢?具体来讲,什么是朗姆酒呢?简单的来说,朗姆酒就是:任何由甘蔗或甘蔗副产品经蒸馏而成的酒。朗姆酒不像由原产地和制造方法所定义的苏格兰威士忌和波本威士忌,它的分类界限比较宽
windows端口映射
学习参考资料:http://www.yiibai.com/selenium/selenium_download_ide.html Selenium的IDE(集成开发环境)是一个易于使用的Firefox插件,用于开发Selenium测试案例。它提供了一个图形用户界面,用于记录使用Firefox浏览器,用来学习和使用Selenium用户操作,但它只能用于只用Firefox浏览器不支持其...
linux内核调试环境搭建步骤linux 2.6.26 与其后的版本,其内置已经支持kgdb了。下面的内容描述了怎样在Linux环境下,搭建虚拟机调试linux内核的主要步骤:我的环境是Ubuntu10.4+VirtualBox(linux2.6.32.16内核源码)。一、安装VirtualBox以及目标机Linux这里目标机用来做测试环境,根据具体开发需要,可
S7-1200 PLC循环移位指令做流水灯控制
实例:1、现有一个A类地址10.0.0.0/8 ,要在其中划分32个子网,分配给国内32个省份使用。1)子网netmask 8+5=13 #划分32个子网,则2^N>=32,可以得到N>=5,所以需要占用主机ID位5位 255.11111000....
最近在参加华为推出的于是想自己动手部署K8S的环境来学习,去年自己也采用二进制的方式部署过,时隔一年K8S的版本已经更新到了v1.24.3啦。在v1.24版本之后,k8s都已经抛弃了docker。抱着学习的心态尝试了k8s的v1.24.3版本的安装,这次采用kubeadm的部署方式,过程非常坎坷,但是还是顺利的部署成功。...
【德云社一个演员也来众筹,照这么下去还有谁相信众筹网站?】最近,德云社一个演员众筹百万的事儿火了,据说这个演员家庭条件相当不错。实际上,类似的事件已经有不少了,所以我也完全不相信众筹网站了。不过,人家众筹网站说了,有房有车也可以发起筹款,勾选“贫困户”只是发起人误操作而已。当然,这种解释可能很难服众,而这种消费大众爱心的行为,也必然对众筹网站自身带来巨大危害。【在线教育白热化,家长们准备...
SPI接口通信一、基础概念SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由主设备控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。总线结构如下图所示。二、接口定义 SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输...
什么是vml? VML相当于IE里面的画笔,能实现你所想要的图形,而且结合脚本,可以让图形产生动态的效果。VML是微软1999年9月附带IE5.0发布的,在我认为, VML其实是Word和HTML结合的产物。可以将Word文档另存为HTML,其中的文本和图片可以很容易的转换,但如果是手绘制的图形在以往的IE里面就无法解释了,如果都转换成图形文件又不太现实。于是微软把Word里面的图形控件结合到IE...
基于OpenCV的绿幕抠像与图像融合,对4种传统的抠图方法进行了实现