布隆過濾器

布隆過濾器

什麼是布隆過濾器?
布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用於檢索一個元素是否在一個集合中。
布隆過濾器優缺點:它的優點是空間效率和查詢時間都遠遠超過一般的算法,缺點是有一定的誤算率和刪除困難。
誤算率和刪除困難:隨着存入的元素數量增加,誤算率隨之增加。但是如果元素數量太少,則使用散列表足矣。另外,一般情況下不能從布隆過濾器中刪除元素。我們很容易想到把位列陣變成整數數組,每插入一個元素相應的計數器加1, 這樣刪除元素時將計數器減掉就可以了。然而要保證安全的刪除元素並非如此簡單。首先我們必須保證刪除的元素的確在布隆過濾器裏面. 這一點單憑這個過濾器是無法保證的。另外計數器迴繞也會造成問題。

布隆過濾器原理

存儲

利用散列思想我們可以設計以下布隆過濾器來存儲元素:
1.建立hash表

索引 0 1 2 3 4 5 6 7 8 9
初始值 0 0 1 0 0 0 0 0 0 0

2.假如我們有一個數字25
25 的二進制數字爲11001
若取其偶數位和奇數爲重新組合
奇數位:101
偶數位:10
3.將計算的奇偶數mod10存入哈希表。
5mod10=5;
2%mod10=2;
對應位初始值加1:

索引 0 1 2 3 4 5 6 7 8 9
索引值 0 0 1 0 0 1 0 0 0 0

查詢

如何查詢布隆過濾器中是否有某個元素呢?
假如我們有以下的布隆過濾器

索引 0 1 2 3 4 5 6 7 8 9
初始值 1 0 1 0 1 0 0 1 0 0

如要查詢的的數字是25
首先計算25的二進制表達式:11001
然後奇數位偶數位分別計算
得到5和2兩個元素
5mod10=5;
2mod10=2;
在對應表中2和5 中查詢發現2中不爲0,但5中爲0,則認爲此元素不在集合之中。

布隆過濾器的應用

相比於其它的數據結構,布隆過濾器在空間和時間方面都有巨大的優勢。布隆過濾器存儲空間和插入/查詢時間都是常數。另外, Hash函數相互之間沒有關係,方便由硬件並行實現。布隆過濾器不需要存儲元素本身,在某些對保密要求非常嚴格的場合有優勢。而且布隆過濾器可以表示全集,其它任何數據結構都不能。

因此廣泛應用於網頁URL的去重,垃圾郵件的判別,集合重複元素的判別,查詢加速(比如基於key-value的存儲系統)等。

布隆過濾器雖然會誤報,但是不會漏報,有點寧肯錯殺一千,不會放過一個的感覺。因此在某些對誤報率要求不是很高的地方,布隆過濾器的高效查詢能力,還是受到了極大的青睞。

關於誤報率的計算

Target:靶,也就是集合的大小
Target=Size(BitArray)
Dart:飛鏢,也就是待計算的元素,hashfunc爲輸入數據的量hash函數的個數
Dart=Size(NumOfInputElements∗NumHashfunc)
0的誤判率:F0=e^(−Dart/Target )
1的誤判率爲F1=(1−F0)^hashfunc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章