布隆過濾器 bloom

    布隆過濾器的應用:https://blog.csdn.net/kzadmxz/article/details/100640815

 

    布隆過濾器是Burton Howard  Bloom在1970年提出來的,一種空間效率極高的概率型算法和數據結構,主要用來判斷一個元素是否在集合中存在。因爲他是一個概率型的算法,所以會存在一定的誤差,如果傳入一個值去布隆過濾器中檢索,可能會出現檢測存在的結果但是實際上可能是不存在的,但是肯定不會出現實際上不存在然後反饋存在的結果。因此,Bloom Filter不適合那些“零錯誤”的應用場合。而在能容忍低錯誤率的應用場合下,Bloom  Filter 通過極少的錯誤換取了存儲空間的極大節省。

 

bitmap

      所謂的Bit-map就是用一個bit位來標記某個元素對應的Value,通過Bit爲單位來存儲數據,可以大大節省存儲空間.   所以我們可以通過一個int型的整數的32比特位來存儲32個10進制的數字,那麼這樣所帶來的好處是內存佔用少、   效率很高(不需要比較和位移)比如我們要存儲5(101)、3(11)四個數字,那麼我們申請int型的內存空間,會有32   個比特位。這四個數字的二進制分別對應

    從右往左開始數,比如第一個數字是5,對應的二進制數據是101,  那麼從右往左數到第5位,把對應的二進制數據存儲到32個比特位上。

    第一個5就是 00000000000000000000000000101000

    輸入3時候 00000000000000000000000000001100

 

 

布隆過濾器原理

    有了對位圖的理解以後,我們對布隆過濾器的原理理解就會更容易了,仍然以前面提到的40億數據爲案例,假設這40億數據爲某郵件服務器的黑名單數據,郵件服務需要根據郵箱地址來判斷當前郵箱是否屬於垃圾郵件。

原理如下

    假設集合裏面有3個元素{x,  y,  z},哈希函數的個數爲3。首先將位數組進行初始化,將裏面每個位都設置位0。對於集合裏面的每一個元素,將元素依次通過3個哈希函數進行映射,每次映射都會產生一個哈希值,這個值對應位數   組上面的一個點,然後將位數組對應的位置標記爲1。查詢W元素是否存在集合中的時候,同樣的方法將W通過哈   希映射到位數組上的3個點。如果3個點的其中有一個點不爲1,則可以判斷該元素一定不存在集合中。反之,如果    3個點都爲1,則該元素可能存在集合中

    接下來按照該方法處理所有的輸入對象,每個對象都可能把bitMap中一些白位置塗黑,也可能會遇到已經塗黑的   位置,遇到已經爲黑的讓他繼續爲黑即可。處理完所有的輸入對象之後,在bitMap中可能已經有相當多的位置已  經被塗黑。至此,一個布隆過濾器生成完成,這個布隆過濾器代表之前所有輸入對象組成的集合。

    如何去判斷一個元素是否存在bit array中呢? 原理是一樣,根據k個哈希函數去得到的結果,如果所有的結果都是1,表示這個元素可能(假設某個元素通過映射對應下標爲4,5,6這3個點。雖然這3個點都爲1,但是很明顯這3   個點是不同元素經過哈希得到的位置,因此這種情況說明元素雖然不在集合中,也可能對應的都是1)存在。   如果一旦發現其中一個比特位的元素是0,表示這個元素一定不存在

    至於k個哈希函數的取值爲多少,能夠最大化的降低錯誤率(因爲哈希函數越多,映射衝突會越少),這個地方就   會涉及到最優的哈希函數個數的一個算法邏輯

 

 

 

 

 

 

 

 

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