布隆過濾器(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,都確定不存在集合中。
是的,布隆過濾器是存在必定的偏差率的,特別是數據量大的時候,因此咱們只能說元素可能存在集合中。在容許偏差的場景下仍是可使用的。