布隆過濾器瞭解

本篇純屬興趣愛好,只是自己簡單看了一下了解了一下這是個啥。因爲之前看過位圖,所以理解起來比較簡單。看這個之前可以先看一下位圖:位圖
好,正式開始,其實布隆過濾器這個東西也是因爲內存限制而出現的。這是一個數據結構吧可以說是。但不同的是它是概率型的。用來告訴你,這個東西可能存在或一定不存在。有着高效的插入和查詢,所以對於查詢類效果很好,但是缺點就是概率型,不確切。我來慢慢道來。
首先我們假設一個場景,我要查詢我的數據庫裏有沒有「CSDN」,有的話就放入緩存區。
好,我們先像位圖一樣,以一個8比特爲一個單元來進行位圖計算吧。
在這裏插入圖片描述
我們在存取CSDN時,利用哈希函數生成哈希值,比如我們0、4、7這三個位,然後置1。
在這裏插入圖片描述
在進行查詢時,我們檢查這三個位置,如果都爲1,說明可能存在「CSDN」。爲什麼是可能,這要從哈希說起,哈希函數在計算不同數的哈希值是可能會計算到同一地址。也就是說某個位不一定對應某個字符。
在這裏插入圖片描述
嘿嘿,布隆嘛,我們存一下LOL,可能這個布隆真是遊戲裏那個。在存取的時候,將3、7兩位置1。問題就來了,第七位的1被覆蓋了。也就是7位現在對應着兩個字符,我們假設是S和L。那麼我們如果查找SOS。就會出現這種情況。
在這裏插入圖片描述
恩,看了看,都是1,所以我們斷定……等等,是不是有什麼誤會。
是的,因爲7處對應了不同的字符,所以在檢測時,如果我們SOS裏面的S不存在,但是由於L將這個位置置了1,但哈希值S還是會找到此位,然後看到爲1,判斷S存在。
所以,我們叫它概率型。當數據越來越多的時候,可能會有其他字符也將7處置1。這時候誤判率就會變高。這個跟哈希函數和過濾器長度有關。具體的計算和分析沒有細細研究。
這個東西很明顯我們用在允許有一定誤判的情況下。就比如面試的時候,經常會有面試郵件不小心進入了垃圾郵件。這其實就是誤判了。如果我們只是想確認這個東西在不在裏面,如果全部位都是0,那麼肯定不存在。

越來越多的數據結構接觸下來,發現編程本身就是一個選擇的過程。在不同場景下,每個數據結構的威力是不一樣的。我們要做的是分析我們的需求,然後選擇合適的數據結構和算法,而不是死套公式,死循舊規。 沒有最好,只有更好。這句話也適合編程。 最後的一點感慨吧算是。編程路漫漫,加油。