概述:
布隆过滤器是一种空间效率很高的随机数据结构,是用位数组表示的一个集合
他能判断一个元素是否在这个集合内(概率),就是说如果通过布隆判断不在,那么一定不在,
但是会存在漏判的情况:如果判断元素存在集合中,有一定的概率判断错误
适用场景:
在能容忍底错误率的应用场景下,它极大的节省了空间
基本原理:
- m位的位数组,初始状态都为0
- k个独立的hash函数,通过把元素计算hash函数后(比如hashmap的hashcode计算的是一个int值,把它转换为二进制),然后在对应的位数组位置上把值置1,其中:一个位置可能被多次置1,这种情况下只第一次起作用。正是这种设计会导致布隆过滤器无法删除元素,改进的做法是count bf,给每一位上加一个计数器,当对应位的计数器都为0时可以删除元素。
- 判断元素是否存在集合,通过把元素x计算k个hash函数,如果m位数组对应位上都是1,则存在。
这个过程存在两个问题:
- 上面提到的无法删除元素情况
- 输入元素个数n,位数组大小m,hash函数个数k之间的关系:有个结论k=(ln2)*(m/n)时错误率最小。
有空可以翻翻论文看看推导过程
实际应用中布隆过滤器可以跟key-value数据库一起使用,加快查询,bf占很小的空间,所以可以常驻内存,对用大部分不存在的元素,访问bf就能判断出来,省下一小部分需要访问在硬盘的key-value数据库,就可以大大提高效率。
实际的问题:
给A、B两个文件,个存放50亿个url,每个url占用64字节,内存限制4G,让你找出A、B文件共同的URL?