最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年04月05日 10:31:54   作者:Able張  
這篇文章主要為大家介紹了布隆過濾器大小的算法公式圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪<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緩存中。當(dāng)進(jìn)行數(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ù)庫崩潰。而使用布隆過濾器,當(dāng)訪問不存在的緩存時,可以迅速返回避免緩存或者DB crash。

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

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

3. HashMap的問題

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

4. 理解布隆過濾器

工作原理圖:

在這里插入圖片描述

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

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

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

在這里插入圖片描述

在這里插入圖片描述

6. 可以刪除么

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

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

好像是WTF?不用擔(dān)心,實際上我們實際上需要確定我們的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篩選器進(jìn)行廉價的查找檢查,而不用查詢SQL數(shù)據(jù)庫來檢查是否存在具有特定電子郵件的用戶。如果電子郵件不存在,那就太好了!如果確實存在,則可能必須對數(shù)據(jù)庫進(jìn)行額外的查詢。您也可以執(zhí)行同樣的操作來搜索“用戶名已被占用”。
您可以根據(jù)網(wǎng)站訪問者的IP地址保留一個Bloom過濾器,以檢查您網(wǎng)站的用戶是“回頭用戶”還是“新用戶”。“回頭用戶”的一些誤報不會傷害您,對嗎?
您也可以通過使用Bloom過濾器跟蹤詞典單詞來進(jìn)行拼寫檢查。

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

相關(guān)文章

  • Windows下使用Gogs搭建Git服務(wù)器

    Windows下使用Gogs搭建Git服務(wù)器

    這篇文章介紹了使用Gogs搭建Git服務(wù)器的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Base64 編碼介紹、Base64編碼轉(zhuǎn)換原理與算法

    Base64 編碼介紹、Base64編碼轉(zhuǎn)換原理與算法

    Base64編碼,是我們程序開發(fā)中經(jīng)常使用到的編碼方法。它是一種基于用64個可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法,需要的朋友可以參考下
    2016-06-06
  • Gateway網(wǎng)關(guān)工作原理及使用方法

    Gateway網(wǎng)關(guān)工作原理及使用方法

    本文詳細(xì)講解了Gateway網(wǎng)關(guān)工作原理及使用方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • XXencode 編碼,XX編碼介紹、XXencode編碼轉(zhuǎn)換原理與算法

    XXencode 編碼,XX編碼介紹、XXencode編碼轉(zhuǎn)換原理與算法

    這篇文章主要介紹了XXencode 編碼,XX編碼介紹、XXencode編碼轉(zhuǎn)換原理、算法,需要的朋友可以參考下
    2016-06-06
  • 最新WebStorm2020.2注冊碼永久激活(激活到2089年)

    最新WebStorm2020.2注冊碼永久激活(激活到2089年)

    JetBrains旗下有多款編譯器工具(如:IntelliJ、WebStorm、PyCharm等)在各編程領(lǐng)域幾乎都占據(jù)了壟斷地位。今天給大家?guī)淼氖菍ebStorm最新版激活至2089年
    2020-09-09
  • 通過Cursor使用chatgpt-4的ai輔助編程工具的方法

    通過Cursor使用chatgpt-4的ai輔助編程工具的方法

    cursor是一款與openai合作的,使用gpt-4的一款編程工具,它可以讓你通過gpt-4進(jìn)行輔助編程,以此提高效率,這篇文章主要介紹了Cursor一個使用chatgpt-4的ai輔助編程工具,需要的朋友可以參考下
    2023-05-05
  • 死鎖問題詳解

    死鎖問題詳解

    本文詳細(xì)介紹了死鎖,例如死鎖的概念、產(chǎn)生死鎖的條件、如何預(yù)防死鎖等等,有需要的朋友可以自行參考本篇文章,希望對你有所幫助
    2021-08-08
  • 最新IntelliJ IDEA 2020.2永久激活碼(親測有效)

    最新IntelliJ IDEA 2020.2永久激活碼(親測有效)

    今天一大波朋友反饋idea2020激活碼失效的問題,小編快馬加鞭給大家找到解決方案,本文以IDEA 2020.2.4激活碼破解教程為例給大家詳細(xì)介紹,需要idea2020激活碼的朋友快來參考下本文吧
    2020-11-11
  • git push & git pull 推送/拉取分支的具體使用

    git push & git pull 推送/拉取分支的具體使用

    這篇文章主要介紹了git push & git pull 推送/拉取分支的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • ChatGPT幫我看下這段代碼有什么問題

    ChatGPT幫我看下這段代碼有什么問題

    今天一個很簡單的功能,觸發(fā)了一個 BUG,處理后我想起了最近爆火的 ChatGPT,于是我嘗試測試 ChatGPT 能否發(fā)現(xiàn)這個 BUG,這篇文章會先介紹功能代碼,然后手動分析 BUG 原因,需要的朋友可以參考下
    2023-02-02

最新評論

阿合奇县| 嘉定区| 西乌珠穆沁旗| 凤山市| 武功县| 阿拉尔市| 札达县| 凉城县| 舟曲县| 县级市| 信丰县| 克拉玛依市| 越西县| 同仁县| 呼玛县| 龙川县| 津南区| 老河口市| 新民市| 阿拉善盟| 北票市| 平泉县| 盐山县| 平罗县| 乌拉特后旗| 彭阳县| 马龙县| 宜都市| 金沙县| 平远县| 潜江市| 武义县| 小金县| 五原县| 昌黎县| 突泉县| 冷水江市| 抚远县| 农安县| 永春县| 城口县|