04 位圖(Bit Map)

位圖

位圖可以節省存儲空間。

public class BitMap { // Java 中 char 類型佔 16bit,也即是 2 個字節
  private char[] bytes;
  private int nbits;
  
  public BitMap(int nbits) {
    this.nbits = nbits;
    this.bytes = new char[nbits/16+1];
  }

  public void set(int k) {
    if (k > nbits) return;
    int byteIndex = k / 16;
    int bitIndex = k % 16;
    bytes[byteIndex] |= (1 << bitIndex);
  }

  public boolean get(int k) {
    if (k > nbits) return false;
    int byteIndex = k / 16;
    int bitIndex = k % 16;
    return (bytes[byteIndex] & (1 << bitIndex)) != 0;
  }
}

將數字 A 的第 k 位設置爲1:A = A | (1 << (k - 1))
將數字 A 的第 k 位設置爲0:A = A & ~(1 << (k - 1))
檢測數字 A 的第 k 位:A & (1 << (k - 1)) != 0
用於理解bitmap中代碼

布隆過濾器

適用範圍

布隆過濾器適用於不需要100%準確的,允許存在小規模判誤的大規模判重場景。比如爬蟲網站去重,比如統計大型網站每日UV數(用戶訪問數)。

原理

利用位圖,以及多個hash函數。只能保證查找失敗的確是沒有,不能保證查找成功的是確實存在的。只會對存在的情況進行誤判。bloom filter: False is always false. True is maybe true.
作者回復: 布隆過濾器本身就是解決位圖消耗空間比較多的問題。位圖的大小是數據的範圍。而布隆過濾器的大小應該是小於位圖大小的,所以肯定就是數據的範圍了。

參照極客時間上:數據結構與算法之美課程做的筆記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章