布隆過濾器

布隆過濾器的做用就是判斷元素,在某個元素集中是否存在。算法

 

hashmap的問題數組

實際上hashmap也能達到一樣的效果,但與布隆過濾器的區別以下:對象

hashmap的大體原理就是,把全部裝入的鍵值對都存到一個Entry對象裏,而後根據key值hash出一個常數,做爲該鍵值對的索引值,並把鍵值對存入與索引值相同下標的數組,下次尋找該鍵值對時,直接hash傳入key值,而後查找數組下標與hash結果相同的項,裏面就是要找的鍵值對。索引

若是兩個鍵值對被hash到了同一個數組下標,則查詢到該下標時進行遍歷key值比較。hash

優勢:查詢快,且可以保存完整的鍵值對。hashmap

缺點:若是隻是想單純判斷數值是否存在,這種判斷代價有點太昂貴了,由於畢竟hashmap裏保存了全部鍵值對的本體。原理

 

布隆過濾器遍歷

使用場景:map

當數據集過大,且僅僅只是須要判斷指定數據是否存在於數據集中時(布隆過濾器不具有任何儲存功能,僅僅如其名稱同樣,只具有過濾判斷元素是否存在的功能)。數據

 

算法步驟:

一、準備多個hash算法,每一個hash算法都能將元素hash成一個常數(常數<n)。

二、準備一個長度爲n的數組,且初始裏面各項都爲0

三、每「裝進來」一個元素,就用準備好的多個hash算法,把元素hash成多個常數,並把數組中下標爲這些常數的項設爲0.

四、若是要判斷一個元素「是否被裝進來」過,就用準備好的hash算法對其進行hash爲多個常數,並判斷數組裏這些常數下標中的項是否爲1.

若是都爲1,則表示該元素「可能」被裝進來過。

若是哪怕有一項爲0,則該元素必定沒有被裝進來過。

 

問題:

一、只能作到高几率保證元素存在。

由算法流程可見,即便元素hash後全部常數,在數組的對應下標裏值都爲1,也只是有機率該元素裝載過,由於可能元素hash後的全部常數下標,恰好和其餘元素的hash值相同。

二、沒法從總裝載元素中剔除元素。

若是咱們想從已經裝過的元素集中「刪掉一個」,實際上也是不可能的,由於元素都被hash成多個數組下標了,你根本不能肯定你刪的那個數組下標只是被刪元素的hash值,仍是別的元素的hash值。

相關文章
相關標籤/搜索