简单介绍布隆过滤器
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一句話介紹
布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實(shí)際上是一個很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都遠(yuǎn)遠(yuǎn)超過一般的算法,缺點(diǎn)是有一定的誤識別率和刪除困難。
From 百度百科?
輸入與輸出
S:目標(biāo)查找元素
Z: 被查找元素集(set)
Input: S,Z
Output:
True, S存在于Z
False, S不存在于Z
?
實(shí)際例子
但從文字上是很難理解的,下面舉個實(shí)際的例子:
| 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? 19
1. 首先初始化一個size為20、初始值全為0的數(shù)組,和兩個hash函數(shù)(hash函數(shù)的個數(shù)由自己定,為講解方便這里使用兩個):
hashA(x) 和 hashB(x)
函數(shù)自己定義就好,只要output能對應(yīng)到數(shù)組的key就行。
另外還有一個被查找元素集:
{'wo','shi','sevens','chan'}
2. 把被查找元素集的每個元素都經(jīng)過所有的hash函數(shù):
'wo' -> hashA('wo') -> 3
'wo' -> hashB('wo') -> 8
把得到的hash值找到數(shù)組的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
同理把所有元素都處理一遍最后得到數(shù)組:
| 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. 然后就開始查找我們的目標(biāo)元素(假設(shè)我們要查找'sevens')是否在集合中,同理,先把目標(biāo)元素進(jìn)行一遍hash取值:
'sevens' -> hashA('sevens') -> 6
'sevens' -> hashB('sevens') -> 15
根據(jù)兩個hash值可以看到,數(shù)組中6和15的位置都為1,所以元素可能存在集合中。反之如果有一個為0,都肯定不存在集合中。
可能存在
是的,布隆過濾器是存在一定的誤差率的,特別是數(shù)據(jù)量大的時(shí)候,所以我們只能說元素可能存在集合中。在允許誤差的場景下還是可以使用的。
轉(zhuǎn)載于:https://my.oschina.net/u/203607/blog/1649101
總結(jié)
- 上一篇: android图片缩小和放大Matrix
- 下一篇: P1099 树网的核