位圖
位圖可以節省存儲空間。
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.
作者回復: 布隆過濾器本身就是解決位圖消耗空間比較多的問題。位圖的大小是數據的範圍。而布隆過濾器的大小應該是小於位圖大小的,所以肯定就是數據的範圍了。
參照極客時間上:數據結構與算法之美課程做的筆記。