布隆算法(BloomFilter)


 
    BloomFilter算法,是一種大數據排重算法。在一個數據量很大的集合里,能准確斷定一個對象不在集合里;判斷一個對象有可能在集合里,而且占用的空間不大。它不適合那種要求准確率很高的情況,零錯誤的場景。通過犧牲部分准確率達到高效利用空間的目的。
 
    場景一:假如有一個很大的表,通過字段key查詢數據,操作很重;業務方請求時,傳過來的key有很大一部分是不存在的;這種不存在的key請求就會浪費我們的查詢資源。針對這種情況,我們可以引人BloomFilter算法,在請求key查詢之前,使用BloomFilter匹配。如果不存在,就不用去查詢了(正確率百分之百);如果存在,走原來的查詢流程(有可能不存在的key混進去了)。
 
    場景二:假如有一個很大的表,通過字段key判斷是否存在,操作很重,如果存在就做一些操作,不存在就加入表中;可容許一定的誤判。對應這種情況,我們也可以引入BloomFilter算法,通過key查詢表判斷存在否的方式可換成BloomFilter算法。如果存在,我們執行以前的邏輯(有一定的誤判,業務也允許一定的錯誤);如果不存在,也執行以前的邏輯。
 
     BloomFilter是由一個長度為n的bit數組S和k個hash算法組成。先使bit數組的初始值為0.
     添加值M:M經過k個hash算法計算后,得到:M1, M2 … Mk; 然后,使S[M1]=1,S[M2]=2... S[Mk]=1
     判斷值Y:Y經過k個hash算法計算后,得到:Y1,Y2... Yk。 然后,判斷S[Y1],S[Y2] … S[Yk] 是否都為1。如果有一個不為1,那這個Y就一定是不存在的,以前沒添加過;如果都為1,那這個Y可能存在,也可能其他值添加后,影響了這次判斷的結果。
 
     我們要做的是盡量降低正確判斷的誤判率,資料顯示, 當 k = ln(2)* m/n 時(k是hash函數個數,m是bit數組的長度,n是加入值的個數),出錯概率是最小的。 
 
   當然,如果我們要移除值,怎么辦呢?當前的結構是沒法實現的,我們可以通過在加一個等長的數據,存放每個bit位設置為1的次數,設置一次加1,取消一次減一。
         
   
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM