日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]布隆过滤器详解

發布時間:2024/4/17 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]布隆过滤器详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

布隆過濾器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一種space efficient的概率型數據結構,用于判斷一個元素是否在集合中。在垃圾郵件過濾的黑白名單方法、爬蟲(Crawler)的網址判重模塊中等等經常被用到。哈希表也能用于判斷元素是否在集合中,但是布隆過濾器只需要哈希表的1/8或1/4的空間復雜度就能完成同樣的問題。布隆過濾器可以插入元素,但不可以刪除已有元素。其中的元素越多,false positive rate(誤報率)越大,但是false negative (漏報)是不可能的。

?

本文將詳解布隆過濾器的相關算法和參數設計,在此之前希望大家可以先通過谷歌黑板報的數學之美系列二十一 - 布隆過濾器(Bloom Filter)來得到些基礎知識。

?

一. 算法描述

一個empty bloom filter是一個有m bits的bit array,每一個bit位都初始化為0。并且定義有k個不同的hash function,每個都以uniform random distribution將元素hash到m個不同位置中的一個。在下面的介紹中n為元素數,m為布隆過濾器或哈希表的slot數,k為布隆過濾器重hash function數。

?

為了add一個元素,用k個hash function將它hash得到bloom filter中k個bit位,將這k個bit位置1。

?

為了query一個元素,即判斷它是否在集合中,用k個hash function將它hash得到k個bit位。若這k bits全為1,則此元素在集合中;若其中任一位不為1,則此元素比不在集合中(因為如果在,則在add時已經把對應的k個bits位置為1)。

?

不允許remove元素,因為那樣的話會把相應的k個bits位置為0,而其中很有可能有其他元素對應的位。因此remove會引入false negative,這是絕對不被允許的。

?

當k很大時,設計k個獨立的hash function是不現實并且困難的。對于一個輸出范圍很大的hash function(例如MD5產生的128 bits數),如果不同bit位的相關性很小,則可把此輸出分割為k份。或者可將k個不同的初始值(例如0,1,2, … ,k-1)結合元素,feed給一個hash function從而產生k個不同的數。

?

當add的元素過多時,即n/m過大時(n是元素數,m是bloom filter的bits數),會導致false positive過高,此時就需要重新組建filter,但這種情況相對少見。

?

二. 時間和空間上的優勢

當可以承受一些誤報時,布隆過濾器比其它表示集合的數據結構有著很大的空間優勢。例如self-balance BST, tries, hash table或者array, chain,它們中大多數至少都要存儲元素本身,對于小整數需要少量的bits,對于字符串則需要任意多的bits(tries是個例外,因為對于有相同prefixes的元素可以共享存儲空間);而chain結構還需要為存儲指針付出額外的代價。對于一個有1%誤報率和一個最優k值的布隆過濾器來說,無論元素的類型及大小,每個元素只需要9.6 bits來存儲。這個優點一部分繼承自array的緊湊性,一部分來源于它的概率性。如果你認為1%的誤報率太高,那么對每個元素每增加4.8 bits,我們就可將誤報率降低為原來的1/10。add和query的時間復雜度都為O(k),與集合中元素的多少無關,這是其他數據結構都不能完成的。

?

如果可能元素范圍不是很大,并且大多數都在集合中,則使用確定性的bit array遠遠勝過使用布隆過濾器。因為bit array對于每個可能的元素空間上只需要1 bit,add和query的時間復雜度只有O(1)。注意到這樣一個哈希表(bit array)只有在忽略collision并且只存儲元素是否在其中的二進制信息時,才會獲得空間和時間上的優勢,而在此情況下,它就有效地稱為了k=1的布隆過濾器。

?

而當考慮到collision時,對于有m個slot的bit array或者其他哈希表(即k=1的布隆過濾器),如果想要保證1%的誤判率,則這個bit array只能存儲m/100個元素,因而有大量的空間被浪費,同時也會使得空間復雜度急劇上升,這顯然不是space efficient的。解決的方法很簡單,使用k>1的布隆過濾器,即k個hash function將每個元素改為對應于k個bits,因為誤判度會降低很多,并且如果參數k和m選取得好,一半的m可被置為為1,這充分說明了布隆過濾器的space efficient性。

?

三. 舉例說明

以垃圾郵件過濾中黑白名單為例:現有1億個email的黑名單,每個都擁有8 bytes的指紋信息,則可能的元素范圍為???,對于bit array來說是根本不可能的范圍,而且元素的數量(即email列表)為??,相比于元素范圍過于稀疏,而且還沒有考慮到哈希表中的collision問題。

?

若采用哈希表,由于大多數采用open addressing來解決collision,而此時的search時間復雜度為 :

即若哈希表半滿(n/m = 1/2),則每次search需要probe 2次,因此在保證效率的情況下哈希表的存儲效率最好不超過50%。此時每個元素占8 bytes,總空間為:

若采用Perfect hashing(這里可以采用Perfect hashing是因為主要操作是search/query,而并不是add和remove),雖然保證worst-case也只有一次probe,但是空間利用率更低,一般情況下為50%,worst-case時有不到一半的概率為25%。

?

若采用布隆過濾器,取k=8。因為n為1億,所以總共需要??被置位為1,又因為在保證誤判率低且k和m選取合適時,空間利用率為50%(后面會解釋),所以總空間為:

所需空間比上述哈希結構小得多,并且誤判率在萬分之一以下。

?

四. 誤判概率的證明和計算

假設布隆過濾器中的hash function滿足simple uniform hashing假設:每個元素都等概率地hash到m個slot中的任何一個,與其它元素被hash到哪個slot無關。若m為bit數,則對某一特定bit位在一個元素由某特定hash function插入時沒有被置位為1的概率為:

則k個hash function中沒有一個對其置位的概率為:

如果插入了n個元素,但都未將其置位的概率為:

則此位被置位的概率為:

?

現在考慮query階段,若對應某個待query元素的k bits全部置位為1,則可判定其在集合中。因此將某元素誤判的概率為:

由于?,并且?? 當m很大時趨近于0,所以

從上式中可以看出,當m增大或n減小時,都會使得誤判率減小,這也符合直覺。

?

現在計算對于給定的m和n,k為何值時可以使得誤判率最低。設誤判率為k的函數為:

設???, 則簡化為

,兩邊取對數

? , 兩邊對k求導

下面求最值

?

?

?

?

?

?

?

因此,即當?? 時誤判率最低,此時誤判率為:

可以看出若要使得誤判率≤1/2,則:

這說明了若想保持某固定誤判率不變,布隆過濾器的bit數m與被add的元素數n應該是線性同步增加的。

?

五. 設計和應用布隆過濾器的方法

應用時首先要先由用戶決定要add的元素數n和希望的誤差率P。這也是一個設計完整的布隆過濾器需要用戶輸入的僅有的兩個參數,之后的所有參數將由系統計算,并由此建立布隆過濾器。

?

系統首先要計算需要的內存大小m bits:

?

再由m,n得到hash function的個數:

?

至此系統所需的參數已經備齊,接下來add n個元素至布隆過濾器中,再進行query。

?

根據公式,當k最優時:

因此可驗證當P=1%時,存儲每個元素需要9.6 bits:

而每當想將誤判率降低為原來的1/10,則存儲每個元素需要增加4.8 bits:

?

這里需要特別注意的是,9.6 bits/element不僅包含了被置為1的k位,還把包含了沒有被置為1的一些位數。此時的

才是每個元素對應的為1的bit位數。

?

?? 從而使得P(error)最小時,我們注意到:

?中的?? ,即

此概率為某bit位在插入n個元素后未被置位的概率。因此,想保持錯誤率低,布隆過濾器的空間使用率需為50%。

?

參考:http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html

原創文章屬于Allen Sun?

轉載于:https://www.cnblogs.com/DarrenChan/p/9549475.html

總結

以上是生活随笔為你收集整理的[转]布隆过滤器详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人啪啪18免费游戏链接 | 成人免费一级视频 | 女人18毛片水真多18精品 | 久久精品国产免费看久久精品 | 特黄特色大片bbbb | 91性视频 | 黄色一级视频免费看 | 爱情岛论坛亚洲自拍 | 亚洲第一伊人 | 精品人妻一区二区三区潮喷在线 | 国产美女91| 久色免费视频 | 欧美肥老妇视频九色 | 精品国产露脸精彩对白 | 欧美一区久久 | 中文字幕在线观看网址 | 久久久久中文 | 亚洲国产高清国产精品 | 亚洲欧美另类在线 | 久久中文字幕精品 | 国产精品久久久久久久久久久久久久久久久久 | 免费在线不卡视频 | 日韩二区三区四区 | 男阳茎进女阳道视频大全 | 色姑娘久 | 成人精品福利 | 精品人妻人人做人人爽 | 91丨porny| 欧美精品成人一区二区在线观看 | 四月婷婷| 调教驯服丰满美艳麻麻在线视频 | 欧美一区二区久久久 | 精品国模一区二区三区 | 亚洲图片一区二区 | 中文字幕在线观看网站 | 日韩一区二区三区在线观看视频 | 亚洲人成影视 | 中文字幕精品无码亚 | 欧美专区在线视频 | 天天碰天天干 | 日韩插插插| 97精品人妻一区二区三区蜜桃 | 国产特级毛片aaaaaa | 夜色综合网 | 婷婷第四色| 久久久久久免费观看 | a∨鲁丝一区鲁丝二区鲁丝三区 | 国内自拍av| 艳母动漫在线播放 | 欧美激情综合五月色丁香 | 国产中文在线 | 一级黄色片在线 | 国产精品久久国产精品99 | 国产三级在线看 | 无码视频在线观看 | 伊人激情网 | 2018天天干天天操 | 青青草国产在线 | jizz日本视频| 国产丝袜自拍 | 中国毛片网 | 国产福利免费在线观看 | 国产欧美在线播放 | 牛牛影视免费观看 | 正在播放欧美 | 海角社区id:1220.7126,10. | 男女污视频| 欧美三区视频 | 97精品视频在线观看 | 中文字幕第15页 | 国产超碰人人爽人人做人人爱 | 宅男午夜影院 | 蜜桃视频欧美 | 日b在线观看| 黄色免费网页 | 国产鲁鲁视频在线观看特色 | 最新国产视频 | 在线免费观看视频你懂的 | www.av72| 日本一区二区网站 | 神马久久久久久久久久 | 91美女在线视频 | 久久综合福利 | 韩国日本在线 | 日韩经典午夜福利发布 | 午夜国产一区二区 | 国产操人 | 日韩天堂网 | 亚洲视频一区二区在线观看 | 67194国产 | 在线免费观看视频a | 久久无码视频网站 | 91精品国产91久久久久 | 在线资源站 | 都市激情综合 | 扒开jk护士狂揉免费 | 日本a在线免费观看 | 日韩少妇毛片 | 国产欧美一区二区三区在线看蜜臀 |