1. 程式人生 > >布隆算法

布隆算法

針對 高效 back round 那種 添加 hash算法 可能 filter

BloomFilter算法,是一種大數據排重算法。在一個數據量很大的集合裏,能準確斷定一個對象不在集合裏;判斷一個對象有可能在集合裏,而且占用的空間不大。它不適合那種要求準確率很高的情況,零錯誤的場景。通過犧牲部分準確率達到高效利用空間的目的。

場景一:假如有一個很大的表,通過字段key查詢數據,操作很重;業務方請求時,傳過來的key有很大一部分是不存在的;這種不存在的key請求就會浪費我們的查詢資源。針對這種情況,我們可以引人BloomFilter算法,在請求key查詢之前,使用BloomFilter匹配。如果不存在,就不用去查詢了(正確率百分之百);如果存在,走原來的查詢流程(有可能不存在的key混進去了)。

場景二:假如有一個很大的表,通過字段key判斷是否存在,操作很重,如果存在就做一些操作,不存在就加入表中;可容許一定的誤判。對應這種情況,我們也可以引入BloomFilter算法,通過key查詢表判斷存在否的方式可換成BloomFilter算法。如果存在,我們執行以前的邏輯(有一定的誤判,業務也允許一定的錯誤);如果不存在,也執行以前的邏輯。

BloomFilter是由一個長度為n的bit數組S(Bitmap)和k個hash算法組成。 如果單獨用Bitmap和一個hash則其碰撞太厲害,多次hash降低碰撞概率。

第一步:先使bit數組的初始值為0

第二步:添加值M,M經過k個hash算法計算後,得到:M1, M2 … Mk; 然後,使S[M1]=1,S[M2]=1... S[Mk]=1

第三步:判斷值Y,Y經過k個hash算法計算後,得到:Y1,Y2... Yk。 然後,判斷S[Y1],S[Y2] … S[Yk] 是否都為1。如果有一個不為1,那這個Y就一定是不存在的,以前沒添加過;如果都為1,那這個Y可能存在,也可能其他值添加後,影響了這次判斷的結果。

如果我們要移除值,怎麽辦呢?當前的結構是沒法實現的,我們可以通過在加一個等長的數據,存放每個bit位設置為1的次數,設置一次加1,取消一次減一。

布隆算法