布隆過濾器

介紹

判斷一個元素是否存在一個集合中?數組

常規思路:數據結構

  • 數組
  • 鏈表
  • 樹、平衡二叉樹、Trie
  • Map(紅黑樹)
  • 哈希表

雖然上述數據結構配合常見的排序、二分搜索能夠快速的處理大部分判斷元素是否存在,可是當集合裏面的元素足夠大時,若是有500萬條甚至一億條記錄時,消耗的內存將會很高,這個時候,布隆過濾器(Bloom Filter)就應運而生。函數

原理

布隆過濾器的核心實現就是一個超大的位數組和幾個哈希函數,假設位數組的長度爲m,哈希函數的個數爲k。spa

clipboard.png

具體的操做流程:假設集合裏面有3個元素{x, y, z},哈希函數的個數爲3。首先將位數組進行初始化,將裏面每一個位都設置位0。對於集合裏面的每個元素,將元素依次經過3個哈希函數進行映射,每次映射都會產生一個哈希值,這個值對應位數組上面的一個點,而後將位數組對應的位置標記爲1。查詢W元素是否存在集合中的時候,一樣的方法將W經過哈希映射到位數組上的3個點。若是3個點的其中有一個點不爲1,則能夠判斷該元素必定不存在集合中。反之,若是3個點都爲1,則該元素可能存在集合中。注意:此處不能判斷該元素是否必定存在集合中,可能存在必定的誤判率。能夠從圖中能夠看到:假設某個元素經過映射對應下標爲4,5,6這3個點。雖然這3個點都爲1,可是很明顯這3個點是不一樣元素通過哈希獲得的位置,所以這種狀況說明元素雖然不在集合中,也可能對應的都是1,這是誤判率存在的緣由。排序

添加元素

  • 將要添加的元素給k個哈希函數
  • 獲得對應的爲數組的k個位置
  • 將這k個位置設爲1

查找元素

  • 將要查詢的元素給k個哈希函數
  • 獲得對應位數組上的k個位置
  • 若是k個位置有一個或以上爲0,則確定不在集合中
  • 若是k個位置所有爲1,則可能在集合中
相關文章
相關標籤/搜索