欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

圖文解析布隆過濾器大小的算法公式

 更新時間:2022年04月05日 10:31:54   作者:Able張  
這篇文章主要為大家介紹了布隆過濾器大小的算法公式圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪<BR>

1. 簡介

客戶端:這個key存在嗎?

服務(wù)器:不存在/不知道

本質(zhì)上,布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),是一種比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu)。它的特點是高效地插入和查詢。但我們要檢查一個key是否在某個結(jié)構(gòu)中存在時,通過使用布隆過濾器,我們可以快速了解到「這個key一定不存在或者可能存在」。相比于傳統(tǒng)的List、Set、Map這些數(shù)據(jù)結(jié)構(gòu),它更加高效、占用的空間也越少,但是它返回的結(jié)果是概率性的,是不確切的。

布隆過濾器僅用于測試集合中的成員資格。使用布隆過濾器的經(jīng)典示例是減少對不存在的密鑰的昂貴磁盤(或網(wǎng)絡(luò))查找。正如我們看到的那樣,布隆過濾器可以在O(k)恒定時間內(nèi)搜索密鑰,其中k是哈希函數(shù)的數(shù)量,測試密鑰的不存在將非常快。

2. 應(yīng)用場景

2.1 緩存穿透

為了提高訪問效率,我們會將一些數(shù)據(jù)放在Redis緩存中。當進行數(shù)據(jù)查詢時,可以先從緩存中獲取數(shù)據(jù),無需讀取數(shù)據(jù)庫。這樣可以有效地提升性能。
在數(shù)據(jù)查詢時,首先要判斷緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),就直接從緩存中獲取數(shù)據(jù)。
但如果沒有數(shù)據(jù),就需要從數(shù)據(jù)庫中獲取數(shù)據(jù),然后放入緩存。如果大量訪問都無法命中緩存,會造成數(shù)據(jù)庫要扛較大壓力,從而導(dǎo)致數(shù)據(jù)庫崩潰。而使用布隆過濾器,當訪問不存在的緩存時,可以迅速返回避免緩存或者DB crash。

2.2 判斷某個數(shù)據(jù)是否在海量數(shù)據(jù)中存在

HBase中存儲著非常海量數(shù)據(jù),要判斷某個ROWKEYS、或者某個列是否存在,使用布隆過濾器,可以快速獲取某個數(shù)據(jù)是否存在。但有一定的誤判率。但如果某個key不存在,一定是準確的。

3. HashMap的問題

要判斷某個元素是否存在其實用HashMap效率是非常高的。HashMap通過把值映射為HashMap的Key,這種方式可以實現(xiàn)O(1)常數(shù)級時間復(fù)雜度。
但是,如果存儲的數(shù)據(jù)量非常大的時候(例如:上億的數(shù)據(jù)),HashMap將會耗費非常大的內(nèi)存大小。而且也根本無法一次性將海量的數(shù)據(jù)讀進內(nèi)存。

4. 理解布隆過濾器

工作原理圖:

在這里插入圖片描述

布隆過濾器是一個bit數(shù)組或者稱為一個bit二進制向量
這個數(shù)組中的元素存的要么是0、要么是1
k個hash函數(shù)都是彼此獨立的,并將每個hash函數(shù)計算后的結(jié)果對數(shù)組的長度m取模,并將對一個的bit設(shè)置為1(藍色單元格)
我們將每個key都按照這種方式設(shè)置單元格,就是「布隆過濾器」

5. 根據(jù)布隆過濾器查詢元素

假設(shè)輸入一個key,我們使用之前的k個hash函數(shù)求哈希,得到k個值
判斷這k個值是否都為藍色,如果有一個不是藍色,那么這個key一定不存在
如果都有藍色,那么key是可能存在(布隆過濾器會存在誤判)
因為如果輸入對象很多,而集合比較小的情況,會導(dǎo)致集合中大多位置都會被描藍,那么檢查某個key時候為藍色時,剛好某個位置正好被設(shè)置為藍色了,此時,會錯誤認為該key在集合中
示例:

在這里插入圖片描述

在這里插入圖片描述

6. 可以刪除么

傳統(tǒng)的布隆過濾器并不支持刪除操作。但是名為 Counting Bloom filter 的變種可以用來測試元素計數(shù)個數(shù)是否絕對小于某個閾值,它支持元素刪除。詳細理解可以參考文章Counting Bloom Filter 的原理和實現(xiàn), 寫的很詳細。

7. 如何選擇哈希函數(shù)個數(shù)和布隆過濾器長度

很顯然,過小的布隆過濾器很快所有的 bit 位均為 1,那么查詢?nèi)魏沃刀紩祷?amp;ldquo;可能存在”,起不到過濾的目的了。布隆過濾器的長度會直接影響誤報率,布隆過濾器越長其誤報率越小。

另外,哈希函數(shù)的個數(shù)也需要權(quán)衡,個數(shù)越多則布隆過濾器 bit 位置位 1 的速度越快,且布隆過濾器的效率越低;但是如果太少的話,那我們的誤報率會變高。

在這里插入圖片描述

從上圖可以看出,增加哈希函數(shù)k的數(shù)量將大大降低錯誤率p。

在這里插入圖片描述

好像是WTF?不用擔心,實際上我們實際上需要確定我們的m和k。因此,如果我們自己設(shè)置容錯值p和元素數(shù)n,則可以使用以下公式來計算這些參數(shù):

我們可以根據(jù)過濾器的大小m,哈希函數(shù)的數(shù)量k和插入的元素的數(shù)量n來計算誤報率p,公式如下:由上面,又怎么選擇適合業(yè)務(wù)的 k 和 m 值呢?
公式:

在這里插入圖片描述

k 為哈希函數(shù)個數(shù),m 為布隆過濾器長度,n 為插入的元素個數(shù),p 為誤報率。
至于如何推導(dǎo)這個公式,我在知乎發(fā)布的文章有涉及,感興趣可以看看,不感興趣的話記住上面這個公式就行了。

我還要在這里提到另一個重要的觀點。由于使用Bloom篩選器的唯一目的是搜索速度更快,所以我們不能使用慢速哈希函數(shù),對嗎?加密散列函數(shù)(例如Sha-1,MD5)對于bloom過濾器不是一個好選擇,因為它們有點慢。因此,從更快的哈希函數(shù)實現(xiàn)中更好的選擇是murmur,fnv系列哈希,Jenkins哈希和HashMix。

更多應(yīng)用場景

在給定的示例中您已經(jīng)看到,我們可以使用它來警告用戶輸入弱密碼。
您可以使用布隆過濾器,以防止用戶從訪問惡意網(wǎng)站。
您可以先使用Bloom Bloom篩選器進行廉價的查找檢查,而不用查詢SQL數(shù)據(jù)庫來檢查是否存在具有特定電子郵件的用戶。如果電子郵件不存在,那就太好了!如果確實存在,則可能必須對數(shù)據(jù)庫進行額外的查詢。您也可以執(zhí)行同樣的操作來搜索“用戶名已被占用”。
您可以根據(jù)網(wǎng)站訪問者的IP地址保留一個Bloom過濾器,以檢查您網(wǎng)站的用戶是“回頭用戶”還是“新用戶”。“回頭用戶”的一些誤報不會傷害您,對嗎?
您也可以通過使用Bloom過濾器跟蹤詞典單詞來進行拼寫檢查。

以上就是布隆過濾器算法圖文詳解的詳細內(nèi)容,更多關(guān)于布隆過濾器算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論