判斷一個元素是否存在一個集合中?數組
常規思路:數據結構
雖然上述數據結構配合常見的排序、二分搜索能夠快速的處理大部分判斷元素是否存在,可是當集合裏面的元素足夠大時,若是有500萬條甚至一億條記錄時,消耗的內存將會很高,這個時候,布隆過濾器(Bloom Filter)就應運而生。函數
布隆過濾器的核心實現就是一個超大的位數組和幾個哈希函數,假設位數組的長度爲m,哈希函數的個數爲k。spa
具體的操做流程:假設集合裏面有3個元素{x, y, z},哈希函數的個數爲3。首先將位數組進行初始化,將裏面每一個位都設置位0。對於集合裏面的每個元素,將元素依次經過3個哈希函數進行映射,每次映射都會產生一個哈希值,這個值對應位數組上面的一個點,而後將位數組對應的位置標記爲1。查詢W元素是否存在集合中的時候,一樣的方法將W經過哈希映射到位數組上的3個點。若是3個點的其中有一個點不爲1,則能夠判斷該元素必定不存在集合中。反之,若是3個點都爲1,則該元素可能存在集合中。注意:此處不能判斷該元素是否必定存在集合中,可能存在必定的誤判率。能夠從圖中能夠看到:假設某個元素經過映射對應下標爲4,5,6這3個點。雖然這3個點都爲1,可是很明顯這3個點是不一樣元素通過哈希獲得的位置,所以這種狀況說明元素雖然不在集合中,也可能對應的都是1,這是誤判率存在的緣由。排序