1. 程式人生 > >布隆過濾器 淺析 - 20181119

布隆過濾器 淺析 - 20181119

一.引言

  • BloomFilter演算法,是一種大資料排重演算法。犧牲精度,達到高效利用空間的目的。
  • 可以過濾無效請求,惡意攻擊。
  • 只記錄特徵,不記錄原始資料
  • 查詢特徵值不存在,就代表沒有資料;特徵值存在,則代表資料可能存在。

二.優缺點

  • 優點:
    1.查詢時間複雜度 O(k) 一個較小的常數
    2.極度節約空間
    3.不儲存資料本身,對源資料有一定保密性
  • 缺點:
    1.有一定誤差
    2.不能刪除

三.詳解

1.布隆過濾器
布隆過濾器,它是一種節省空間的概率資料結構(就是 點陣圖 + 雜湊)。主要功能是檢查一個元素是否在給定的集合中。說它是一種概率資料結構是因為每次對它的查詢會返回 2 種結果;一種是“可能在集合中”,也就是說它可能會誤報,這個誤報是有一定概率的,後面我們會詳細介紹這個概率。另一種結果是“一定不在集合中”,這個結果是肯定的,也就是不會漏報。

2.點陣圖(bitmap)
布隆過濾器=點陣圖+雜湊。那麼什麼是點陣圖呢?點陣圖(bitmap)我們可以理解為是一個 bit 陣列,每個元素儲存資料的狀態(由於每個元素只有 1 bit,所以只能儲存 0 或 1 這 2 種狀態)適用於資料量超大,但是資料的狀態很少的情況。比如判斷一個整數是否在給定的超大的整數集中。
3.
它先定義一個長度為 m 的點陣圖陣列,初始值都為 0 ,然後定義 k 個不同的符合隨機分佈的雜湊函式,新增一個元素的時候通過 k 個雜湊函式得到 k 個 hash 值,將它們對映到點陣圖陣列中(當然計算出來的 hash 值可能超過了 m,那麼就需要擴容,java 中 BitSet 的擴容方案是 Math.max(2 * 當前長度, 計算出來的 hash 值); )
在這裡插入圖片描述


4.
查詢的時候把這個元素作為 K 個雜湊函式的輸入,得到 K 個數組的位置。如果這些位置中有任意一個是 0,說明元素肯定不在集合中。如果這些位置全部為 1,那麼該元素很可能是在集合中,因為也有可能這些位置是被其他元素設定的。