布隆过滤器(Bloom Filter)是1970年由布隆提出的。它其实是一个很长的二进制向量和一系列随机映射函数。布隆过滤器能够用于检索一个元素是否在一个集合中。它的优势是空间效率和查询时间都远远超过通常的算法,缺点是有必定的误识别率和删除困难。
From 百度百科 算法
S:目标查找元素
Z: 被查找元素集(set)
Input: S,Z
Output:
True, S存在于Z
False, S不存在于Z数组
但从文字上是很难理解的,下面举个实际的例子:函数
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19spa
1. 首先初始化一个size为20、初始值全为0的数组,和两个hash函数(hash函数的个数由本身定,为讲解方便这里使用两个):ci
hashA(x) 和 hashB(x)
函数本身定义就好,只要output能对应到数组的key就行。hash
另外还有一个被查找元素集:table
{'wo','shi','sevens','chan'}效率
2. 把被查找元素集的每一个元素都通过全部的hash函数:百度
'wo' -> hashA('wo') -> 3
'wo' -> hashB('wo') -> 8二进制
把获得的hash值找到数组的key,而后将值改成1:
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
同理把全部元素都处理一遍最后获得数组:
0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
3. 而后就开始查找咱们的目标元素(假设咱们要查找'sevens')是否在集合中,同理,先把目标元素进行一遍hash取值:
'sevens' -> hashA('sevens') -> 6
'sevens' -> hashB('sevens') -> 15
根据两个hash值能够看到,数组中6和15的位置都为1,因此元素可能存在集合中。反之若是有一个为0,都确定不存在集合中。
是的,布隆过滤器是存在必定的偏差率的,特别是数据量大的时候,因此咱们只能说元素可能存在集合中。在容许偏差的场景下仍是可使用的。