重溫算法Day24:位圖與布隆過濾器

位圖(BitMap)
位圖,就是用每一位來存放某種狀態,適用於大規模數據,但數據狀態又不是很多的情況。通常是用來判斷某個數據存不存在的。

位圖其實是用數組實現的,數組的每一個元素的每一個二進制位都可以表示一個數據在或者不在,0表示數據存在,1表示數據不存在。因爲比特位只有兩種狀態,要不是0,要不就是1,所以位圖其實就是一種直接定址法的哈希,只不過位圖只能表示這個值在或者不在。

當我們探測到25比特位的值爲1時,我們就可以判斷出136這個數據存在。 

布隆過濾器(Bloom Filter)
使用 K 個哈希函數,對同一個數字進行求哈希值,那會得到 K 個不同的哈希值,我們分別記作 X1​,X2​,X3​,…,XK​。
我們把這 K 個數字作爲位圖中的下標,將對應的 BitMap[X1​],BitMap[X2​],BitMap[X3​],…,BitMap[XK​]都設置成 true,也就是說,我們用 K 個二進制位,來表示一個數字的存在
當我們要查詢某個數字是否存在的時候,我們用同樣的 K 個哈希函數,對這個數字求哈希值,分別得到 Y1​,Y2​,Y3​,…,YK​。我們看這 K 個哈希值,對應位圖中的數值是否都爲 true,如果都是 true,則說明,這個數字存在,如果有其中任意一個不爲 true,那就說明這個數字不存在。

如果某個數字經過布隆過濾器判斷不存在,那說明這個數字真的不存在,不會發生誤判;
如果某個數字經過布隆過濾器判斷存在,這個時候纔會有可能誤判,有可能並不存在。
不過,只要我們調整哈希函數的個數、位圖大小跟要存儲數字的個數之間的比例,那就可以將這種誤判的概率降到非常低。


布隆過濾器用多個哈希函數對同一個網頁鏈接進行處理,CPU 只需要將網頁鏈接從內存中讀取一次,進行多次哈希計算,理論上講這組操作是 CPU 密集型的。
而在散列表的處理方式中,需要讀取散列值相同(散列衝突)的多個網頁鏈接,分別跟待判重的網頁鏈接,進行字符串匹配。這個操作涉及很多內存數據的讀取,所以是內存密集型的。


布隆過濾器非常適合這種不需要 100% 準確的、允許存在小概率誤判的大規模判重場景。
1.爬蟲網頁去重;
2統計一個大型網站的每天的 UV 數,也就是每天有多少用戶訪問了網站,對重複訪問的用戶進行去重。

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