你了解布隆過濾器的“大家族”嗎?
你好,我是看山。
布隆過濾器的基本思想
布隆過濾器(Bloom Filter)是1970年由伯頓·霍華德·布?。˙urton Howard Bloom)提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)。
布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點是空間效率和查詢時間都遠(yuǎn)遠(yuǎn)超過一般的算法,缺點是有一定的誤識別率和刪除困難。
如果想判斷一個元素是不是在一個集合里,一般想到的是將集合中所有元素保存起來,然后通過比較確定。鏈表、樹、散列表(又叫哈希表,Hash Table)等等數(shù)據(jù)結(jié)構(gòu)都是這種思路。但是隨著集合中元素的增加,我們需要的存儲空間越來越大。同時檢索速度也越來越慢,上述三種結(jié)構(gòu)的檢索時間復(fù)雜度分別為O(n)、O(logn)、O(1)。
布隆過濾器的原理是,當(dāng)一個元素被加入集合時,通過K個散列函數(shù)將這個元素映射成一個位數(shù)組中的K個點,把它們置為1。
圖片
檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。
圖片
布隆過濾器家族
基于上面的基本思想,結(jié)合布隆過濾器算法的優(yōu)缺點,又衍生出了很多有特殊能力的布隆過濾器,也就是布隆過濾器家族(Bloom Filter Family)。
布隆過濾器(Bloom Filter)
實現(xiàn)邏輯
一種空間效率很高的數(shù)據(jù)結(jié)構(gòu),用于判斷一個元素是否在一個集合中。實現(xiàn)原理如前文所述。
運行過程
- 插入元素:元素經(jīng)過多個哈希函數(shù)(這里假設(shè)為3個,即Hash1、Hash2、Hash3)映射到位數(shù)組中的不同位置。例如,元素X經(jīng)過Hash1映射到位置3,經(jīng)過Hash2映射到位置7,經(jīng)過Hash3映射到位置12,然后將這些位置的值設(shè)為1。
- 查詢元素:當(dāng)查詢元素X時,檢查位置3、7、12是否都為1。如果都為1,則認(rèn)為元素X可能在集合中(存在誤報可能);如果有任何一個位置為0,則確定元素X不在集合中。
解決的問題
高效判斷元素是否在集合中,在犧牲一定準(zhǔn)確性(存在誤報)的情況下,大大節(jié)省內(nèi)存空間,提高查詢效率,適用于對內(nèi)存要求苛刻且對少量誤報可容忍的場景。
應(yīng)用場景
在網(wǎng)絡(luò)、數(shù)據(jù)庫等領(lǐng)域有廣泛應(yīng)用,比如:
- 判斷一個數(shù)據(jù)項是否已經(jīng)在緩存中,避免不必要的數(shù)據(jù)庫查詢,提高系統(tǒng)的響應(yīng)速度。
- 作為數(shù)據(jù)庫索引的輔助結(jié)構(gòu),快速確定某個鍵值是否可能存在于數(shù)據(jù)庫中,輔助索引的精確查找過程;
- 在網(wǎng)絡(luò)路由中,判斷一個IP地址是否屬于某個特定的路由區(qū)域,快速篩選出可能匹配的路由條目,減少精確查找的范圍;
- 用于識別網(wǎng)絡(luò)流量中的某些特征模式,例如判斷一個數(shù)據(jù)包是否屬于某類特定的應(yīng)用流量(如視頻流、音頻流等),以便進行針對性的處理(如流量整形、優(yōu)先級設(shè)置等)。
在網(wǎng)絡(luò)、數(shù)據(jù)庫等領(lǐng)域有廣泛應(yīng)用,例如在緩存系統(tǒng)中判斷一個數(shù)據(jù)項是否已經(jīng)在緩存中,在網(wǎng)絡(luò)路由中判斷一個IP地址是否屬于某個特定的路由區(qū)域等。
設(shè)計權(quán)衡
涉及內(nèi)存、計算和誤報性能之間的權(quán)衡。通過調(diào)整哈希函數(shù)的數(shù)量和位數(shù)組的大小,可以在不同程度上平衡這些因素。
計數(shù)布隆過濾器(Counting Bloom Filter,CBF)
改進點
將布隆過濾器中的1位單元擴展為c位計數(shù)器。
運行過程
- 插入元素:元素經(jīng)過哈希函數(shù)映射到位數(shù)組中的位置,對應(yīng)位置的計數(shù)器增加。例如,元素X第一次插入時,對應(yīng)位置的計數(shù)器從0變?yōu)?。如果再次插入相同元素,計數(shù)器繼續(xù)增加。
- 刪除元素:當(dāng)刪除元素X時,對應(yīng)位置的計數(shù)器減1。當(dāng)計數(shù)器為0時,表示該元素已被刪除。例如,計數(shù)器為2時,刪除一次變?yōu)?,再刪除一次變?yōu)?,表示元素已從“可能存在集合中”變?yōu)椤按_定不在集合中”。
解決的問題
解決布隆過濾器無法直接支持元素刪除的問題,但引入了較高的內(nèi)存消耗問題,需要在內(nèi)存使用和刪除功能之間進行權(quán)衡。
缺點
c倍地減少了實際可用的位空間(通常為3或4位以避免計數(shù)器溢出),導(dǎo)致內(nèi)存消耗過高,例如在片上內(nèi)存等資源受限的環(huán)境中不太適用。
應(yīng)用場景
- 在數(shù)據(jù)庫事務(wù)中,用于記錄某個數(shù)據(jù)項被操作(如插入、更新、刪除)的次數(shù)。例如,在一個支持多版本并發(fā)控制(MVCC)的數(shù)據(jù)庫系統(tǒng)中,CBF可以用來跟蹤每個數(shù)據(jù)項的不同版本的使用情況,以便在事務(wù)提交或回滾時進行正確的處理。
- 用于統(tǒng)計網(wǎng)絡(luò)中某個源IP地址或某個應(yīng)用協(xié)議的流量出現(xiàn)的次數(shù),幫助網(wǎng)絡(luò)管理員了解網(wǎng)絡(luò)流量的分布和使用情況,以便進行網(wǎng)絡(luò)資源的合理配置和優(yōu)化。
d-left計數(shù)布隆過濾器(d-left CBF,dlCBF)
改進點
基于d-left哈希和元素指紋,通過特定的哈希算法將元素映射到相應(yīng)位置,利用元素指紋信息進行優(yōu)化,減少位空間需求。對于給定的目標(biāo)誤報率(fpr),它所需的位空間約為4位CBF的一半。
運行過程
- 插入元素:元素經(jīng)過d - left哈希和基于元素指紋的處理后,映射到相應(yīng)位置,計數(shù)器增加(原理同CBF,但映射方式更優(yōu)化)。
- 查詢元素:根據(jù)優(yōu)化后的映射關(guān)系查詢元素對應(yīng)的計數(shù)器值,判斷元素是否可能在集合中以及相關(guān)操作(如刪除時的計數(shù)器減1判斷)。
解決的問題
在一定程度上解決了CBF內(nèi)存消耗大的問題,提高了空間效率,同時保持對元素刪除的支持,使其更適用于對空間有一定要求的應(yīng)用場景。
局限性
當(dāng)目標(biāo)誤報率要與標(biāo)準(zhǔn)布隆過濾器(SBF)相當(dāng)時,構(gòu)造所需的空間仍然較大,可能無法滿足某些應(yīng)用的需求。
應(yīng)用場景
- 分布式系統(tǒng)中的成員資格判斷:在分布式系統(tǒng)中,如分布式文件系統(tǒng)或分布式數(shù)據(jù)庫系統(tǒng),用于判斷一個節(jié)點是否屬于某個特定的集群或組。由于其相對節(jié)省空間的特點,在大規(guī)模分布式系統(tǒng)中可以有效地減少內(nèi)存占用,同時保持一定的準(zhǔn)確性。
- 內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN):在CDN中,用于判斷一個內(nèi)容是否已經(jīng)在某個邊緣服務(wù)器上緩存。當(dāng)用戶請求一個內(nèi)容時,首先通過dlCBF快速判斷該內(nèi)容是否可能在本地邊緣服務(wù)器上,如果可能存在,則進一步精確查找,提高內(nèi)容分發(fā)的效率。
帶有變長簽名的布隆過濾器(Bloom filter with variable - length signatures,VLF)
改進點
通過只重置k位中的一部分來處理元素刪除操作,在插入和查詢操作的基礎(chǔ)上增加了對部分位重置的邏輯。
運行過程
- 插入元素:元素經(jīng)過哈希函數(shù)映射到位數(shù)組中的位置,同時記錄相關(guān)變長簽名信息(圖中未詳細(xì)體現(xiàn))。
- 刪除元素:根據(jù)變長簽名信息,只重置部分相關(guān)位(假設(shè)為k位中的一部分)。例如,對于元素X,只重置位置3和7中的部分信息(不是完全重置整個k位),然后更新相關(guān)狀態(tài)以反映元素的刪除情況。
解決的問題
嘗試解決布隆過濾器的刪除問題,但帶來了假陰性的風(fēng)險,需要在刪除功能和準(zhǔn)確性之間進行平衡。
缺點
存在假陰性問題,即可能錯誤地判斷元素不在集合中,不符合一些應(yīng)用對準(zhǔn)確性的要求。
應(yīng)用場景
- 數(shù)據(jù)挖掘中的關(guān)聯(lián)規(guī)則挖掘:在數(shù)據(jù)挖掘中,當(dāng)挖掘關(guān)聯(lián)規(guī)則時,用于快速篩選出可能存在關(guān)聯(lián)關(guān)系的數(shù)據(jù)集。由于其能夠處理部分位的重置,在一些需要動態(tài)調(diào)整關(guān)聯(lián)規(guī)則的場景中具有一定優(yōu)勢,例如在市場分析中,根據(jù)消費者行為的變化動態(tài)調(diào)整商品關(guān)聯(lián)規(guī)則。
- 文本處理中的關(guān)鍵詞過濾:在文本處理中,用于快速過濾出可能包含某些關(guān)鍵詞的文檔。例如,在搜索引擎中,對大量文檔進行預(yù)處理時,使用VLF快速篩選出可能與用戶搜索關(guān)鍵詞相關(guān)的文檔,然后再進行更精確的文本匹配和排名。
可刪除布隆過濾器(Deletable Bloom Filter,DlBF)
改進點
繼承了布隆過濾器的簡潔性,通過記錄插入元素時位碰撞的位置,對可刪除位的區(qū)域進行緊湊編碼(使用部分過濾器內(nèi)存)。只有一個元素設(shè)置的位可以安全刪除,若一個元素至少有一個位被重置,則該元素可被有效刪除。
運行過程
- 插入元素:元素經(jīng)過哈希函數(shù)映射到位數(shù)組中的位置,同時記錄位碰撞區(qū)域信息。如果發(fā)生碰撞,標(biāo)記相應(yīng)區(qū)域不可刪除。例如,元素X插入時,在位置3和7發(fā)生碰撞,標(biāo)記這兩個位置所在區(qū)域不可刪除,其他未碰撞位置所在區(qū)域可刪除。
- 查詢元素:檢查元素對應(yīng)的位置是否都為1來判斷是否可能在集合中。
- 刪除元素:只清除位于可刪除區(qū)域的位。例如,對于元素X,如果位置12未發(fā)生碰撞且在可刪除區(qū)域,刪除時只重置位置12的值,避免誤報的同時實現(xiàn)元素刪除。
解決的問題
實現(xiàn)無假陰性的元素刪除操作,同時通過合理的設(shè)計和參數(shù)調(diào)整,控制誤報率和內(nèi)存消耗,使其適用于對刪除操作有需求且對誤報率和內(nèi)存有一定要求的場景。
性能特點
元素可刪除概率與劃分的區(qū)域數(shù)量(r)和過濾器密度(m/n)等因素有關(guān)。隨著(r)增大,可刪除元素的比例增加;隨著插入元素增多,刪除能力降低。
誤報概率的增加是可控的,且與標(biāo)準(zhǔn)布隆過濾器相當(dāng)。通過實驗評估,可刪除率與理論預(yù)測相符但值相對較低,誤報率在元素刪除前有可接受的增加,刪除元素位后可能會改善。
應(yīng)用場景示例
在LIPSIN中可用于刪除已處理的單向鏈路標(biāo)識符,避免環(huán)路和刪除特殊鏈路標(biāo)識;在數(shù)據(jù)中心環(huán)境中可緊湊表示數(shù)據(jù)包需要經(jīng)過的一系列中間盒服務(wù),根據(jù)匹配情況透明轉(zhuǎn)發(fā)數(shù)據(jù)包并刪除服務(wù)標(biāo)識。
- 網(wǎng)絡(luò)路由中的鏈路狀態(tài)維護:在網(wǎng)絡(luò)路由協(xié)議中,如在LIPSIN中,用于刪除已處理的單向鏈路標(biāo)識符,避免環(huán)路的形成,同時可以刪除特殊的鏈路標(biāo)識(如多跳虛擬鏈路或控制消息),保持路由信息的準(zhǔn)確性和有效性。
- 數(shù)據(jù)中心的服務(wù)鏈處理:在數(shù)據(jù)中心環(huán)境中,用于緊湊表示數(shù)據(jù)包需要經(jīng)過的一系列中間盒服務(wù)(如防火墻、負(fù)載 balancer、DPI)。當(dāng)數(shù)據(jù)包經(jīng)過中間盒時,根據(jù)DlBF的匹配情況透明轉(zhuǎn)發(fā)數(shù)據(jù)包,并在離開中間盒時刪除服務(wù)標(biāo)識,提高數(shù)據(jù)中心網(wǎng)絡(luò)的處理效率。
壓縮布隆過濾器(Compressed Bloom Filter)
改進點
通過使用壓縮算法對布隆過濾器的位陣列進行壓縮存儲,以減少內(nèi)存占用。
在查詢時,需要先解壓縮位陣列再進行判斷操作。
運行過程
- 插入元素:元素經(jīng)過哈希函數(shù)映射到位數(shù)組中的位置,然后對整個位陣列進行壓縮存儲。
- 查詢元素:先解壓縮位陣列,再按照布隆過濾器的常規(guī)查詢方式檢查元素是否可能在集合中。
解決的問題
解決布隆過濾器在內(nèi)存受限環(huán)境下的應(yīng)用問題,通過壓縮減少內(nèi)存占用,但增加了查詢時的計算開銷,需要在內(nèi)存和計算效率之間進行權(quán)衡。
應(yīng)用場景
適用于對內(nèi)存空間要求極為苛刻的環(huán)境,例如在一些嵌入式設(shè)備或內(nèi)存受限的傳感器網(wǎng)絡(luò)中,同時對誤報率有一定容忍度的場景。
- 嵌入式設(shè)備中的數(shù)據(jù)處理:在嵌入式設(shè)備(如智能家居設(shè)備、傳感器節(jié)點等)中,由于內(nèi)存資源有限,使用壓縮布隆過濾器可以在有限的內(nèi)存空間內(nèi)實現(xiàn)對數(shù)據(jù)的快速判斷。例如,在智能家居系統(tǒng)中,判斷某個設(shè)備狀態(tài)是否已經(jīng)被記錄,以便決定是否需要進一步處理。
- 傳感器網(wǎng)絡(luò)中的事件檢測:在傳感器網(wǎng)絡(luò)中,用于快速檢測某些特定事件的發(fā)生。例如,在環(huán)境監(jiān)測傳感器網(wǎng)絡(luò)中,判斷是否出現(xiàn)了某種特定的環(huán)境變化(如溫度超過閾值、濕度異常等),通過壓縮布隆過濾器快速篩選出可能發(fā)生事件的傳感器節(jié)點,然后進行更精確的檢測。
分層布隆過濾器(Hierarchical Bloom Filter)
改進點
構(gòu)建多層的布隆過濾器結(jié)構(gòu)。
通常,上層的布隆過濾器具有較低的精度(較高的誤報率)但占用較少的內(nèi)存,用于快速篩選出可能存在于集合中的元素;下層的布隆過濾器則具有較高的精度(較低的誤報率),用于對上層篩選出的元素進行進一步的精確判斷。
運行過程
- 插入元素:元素首先進入上層布隆過濾器,上層過濾器具有較低精度(較高誤報率),快速篩選出可能存在于集合中的元素。例如,元素X在上層過濾器中被判斷為可能存在。
- 查詢元素:如果上層判斷為可能存在,元素進入下層布隆過濾器進行更精確的判斷。下層過濾器具有較高精度(較低誤報率),最終確定元素是否在集合中。
解決的問題
提高在大規(guī)模數(shù)據(jù)集上的查找效率,通過分層的方式快速排除大量不可能的元素,減少精確查找的工作量,適用于對查找速度有較高要求的大規(guī)模數(shù)據(jù)應(yīng)用場景。
應(yīng)用場景
在大規(guī)模數(shù)據(jù)集的快速查找場景中較為適用。比如:
- 大規(guī)模數(shù)據(jù)庫查詢優(yōu)化:在大型數(shù)據(jù)庫的索引結(jié)構(gòu)中,先使用上層的分層布隆過濾器快速排除大量不可能存在的數(shù)據(jù)項,然后使用下層的過濾器進行更精確的查找,從而提高整體查詢效率,減少查詢時間。
- 網(wǎng)絡(luò)搜索中的網(wǎng)頁篩選:在網(wǎng)絡(luò)搜索中,用于篩選海量網(wǎng)頁中的相關(guān)網(wǎng)頁。上層的分層布隆過濾器根據(jù)用戶搜索關(guān)鍵詞快速篩選出可能相關(guān)的網(wǎng)頁類別,下層的過濾器對這些類別中的網(wǎng)頁進行更精確的篩選和排名,提高搜索結(jié)果的質(zhì)量和相關(guān)性。
動態(tài)布隆過濾器(Dynamic Bloom Filter)
改進點
能夠根據(jù)數(shù)據(jù)集的動態(tài)變化(如元素的插入和刪除頻率)自動調(diào)整自身的參數(shù),如哈希函數(shù)的數(shù)量、位陣列的大小等。通常會設(shè)置一些閾值和自適應(yīng)算法來實現(xiàn)這種動態(tài)調(diào)整。
運行過程
- 插入元素:元素進入動態(tài)布隆過濾器,過濾器根據(jù)當(dāng)前的插入和刪除頻率等動態(tài)信息調(diào)整自身參數(shù)(如哈希函數(shù)數(shù)量、位陣列大小等),然后按照調(diào)整后的規(guī)則將元素插入(例如通過新的哈希函數(shù)映射到新的位置)。
- 查詢元素:按照調(diào)整后的參數(shù)和規(guī)則查詢元素是否可能在集合中。
解決的問題
適應(yīng)數(shù)據(jù)的動態(tài)變化,保持布隆過濾器在不同數(shù)據(jù)流量和操作頻率下的性能,解決固定參數(shù)布隆過濾器在動態(tài)環(huán)境下性能下降的問題。
應(yīng)用場景
在數(shù)據(jù)流量不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中,比如:
- 云計算環(huán)境中的資源管理:在云計算環(huán)境中,用于動態(tài)判斷資源是否已被分配(元素是否在集合中)。例如,判斷某個虛擬機是否已經(jīng)被分配了特定的存儲資源或網(wǎng)絡(luò)資源,根據(jù)數(shù)據(jù)流量和資源使用情況動態(tài)調(diào)整自身參數(shù),提高資源利用效率。
- 移動互聯(lián)網(wǎng)中的用戶行為分析:在移動互聯(lián)網(wǎng)中,用于分析用戶行為模式。根據(jù)用戶的操作行為(如打開應(yīng)用、點擊鏈接等)動態(tài)調(diào)整布隆過濾器的參數(shù),快速判斷用戶是否執(zhí)行過某些特定行為,以便為用戶提供更個性化的服務(wù)和推薦。
布谷鳥布隆過濾器(Cuckoo Bloom Filter)
原理
結(jié)合了布隆過濾器和布谷鳥哈希(Cuckoo Hashing)的思想。
它使用多個哈希函數(shù)將元素映射到多個桶中,并且在發(fā)生沖突時采用類似布谷鳥哈希的方式來處理,即嘗試將元素“踢出”已占用的桶并重新放置到其他桶中,同時通過一定的機制來記錄這些操作,以支持元素的刪除和準(zhǔn)確判斷元素是否在集合中。
運行過程
- 插入元素:元素經(jīng)過多個哈希函數(shù)映射到多個桶中(假設(shè)為兩個桶,桶1和桶2)。例如,元素X經(jīng)過Hash1映射到桶1,經(jīng)過Hash2映射到桶2。如果桶1已經(jīng)被占用,按照布谷鳥哈希的方式,將桶1中的元素“踢出”,重新放置到其他桶(可能需要多次嘗試和記錄相關(guān)操作),直到元素X成功插入。
- 查詢元素:根據(jù)元素映射到的桶以及相關(guān)記錄的操作信息判斷元素是否在集合中。
- 刪除元素:根據(jù)記錄的操作信息,準(zhǔn)確刪除元素X,例如,如果元素X是通過替換桶1中的元素Y插入的,當(dāng)刪除X時,需要將Y還原到桶1中(或者根據(jù)具體的刪除邏輯進行正確處理)。
解決的問題
高效處理沖突并支持元素刪除,在保證準(zhǔn)確性的同時提高數(shù)據(jù)插入、刪除和查詢的效率,適用于對操作效率有較高要求且需要處理沖突和支持刪除的場景。
應(yīng)用場景
在需要高效處理沖突且支持元素刪除的場景中較為適用,例如:
- 實時數(shù)據(jù)處理系統(tǒng)中的數(shù)據(jù)管理:在實時數(shù)據(jù)處理系統(tǒng)中,用于高效處理數(shù)據(jù)的插入、刪除和查詢操作。例如,在一個工業(yè)自動化控制系統(tǒng)中,對實時采集的數(shù)據(jù)進行管理,判斷某個數(shù)據(jù)值是否已經(jīng)存在于系統(tǒng)中,同時支持?jǐn)?shù)據(jù)的插入和刪除操作,保證系統(tǒng)的高效運行。
- 內(nèi)存數(shù)據(jù)庫中的數(shù)據(jù)存儲:在內(nèi)存數(shù)據(jù)庫中,用于存儲和管理數(shù)據(jù)。由于其結(jié)合了布谷鳥哈希的沖突處理機制,在內(nèi)存有限的情況下,可以高效地利用內(nèi)存空間,同時保證數(shù)據(jù)的準(zhǔn)確性和可操作性。
文末總結(jié)
布隆過濾器為什么這么重要,那是因為有下面四個特點:
- 空間效率:布隆過濾器可以使用相對較少的內(nèi)存來表示大量元素。
- 快速成員測試:布隆過濾器可以快速確定某個元素是否可能存在于集合中,而無需訪問實際的集合數(shù)據(jù)。
- 可擴展性:布隆過濾器可以處理大量元素,并且無論集合大小如何,都能為成員資格測試提供恒定時間的性能。
- 誤報率控制:Bloom Filter 的空間效率的權(quán)衡就是誤報率的控制。通過調(diào)整哈希函數(shù)的數(shù)量和位數(shù)組的大小,可以降低或增加誤報率以滿足特定要求。
所以,雖然TA有這樣那么小毛病,但是我們總有辦法適應(yīng)TA。