BloomFilter
BloomFilter
今天看redis面试题的时候发现了一个以前没听过的东东,于是百度了一下
BloomFilter概念和原理
我这里就记录下基本概念和技术结论
概念
Bloom Filter即利用位数组简洁的表示一个集合,并能判断元素是否属于这个集合,但是他可能会吧不属于这个集合的元素误认为属于这个集合(false positive);他不会吧属于这个集合的元素误认为不属于这个集合
原理(个人理解)
Bloom Filter是一个包含m位,且每一位都置0的数组
为了表达S={x1, x2,…,xn}这样一个n个元素的集合,使用k个相互独立的哈希函数,这些hash函数分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,地i个哈希函数映射的位置就会置1(1≤i≤k)
在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。下图中y1就不是集合中的元素。y2或者属于这个集合,或者刚好是一个false positive。
最优的哈希函数个数
位数组中0和1各一半时错误率低。最好让位数组有一半还空着。
位数组的大小
m至少需要取到最小值的1.44倍。