布隆過濾算法

前言

在大一剛學(xué)習(xí)編程的時(shí)候吸占,課后習(xí)題有這么一道題:現(xiàn)有一個(gè)數(shù)量為n的有序整數(shù)集合,需要判斷一個(gè)數(shù)是否在這個(gè)集合中涂召。那時(shí)剛學(xué)習(xí)for循環(huán),所以理所當(dāng)然的敏沉,當(dāng)時(shí)的做法為:
遍歷整個(gè)集合果正,判斷數(shù)字是否存在于集合中

過了一段時(shí)間,學(xué)習(xí)了一些查找算法盟迟,了解了時(shí)間復(fù)雜度的概念秋泳;再次看到了這道題目;此時(shí)的做法則為:
使用二分查找法攒菠,判斷數(shù)字是否存在于集合中

再后來迫皱,學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)相關(guān)的知識(shí),再次碰到了這道題目要尔;不同的是這次的集合是無序的舍杜。這個(gè)時(shí)候想到了兩種做法;

  • 第一種:
    先使用快速排序?qū)⒓吓判蛘栽缓笤偈褂枚植檎疫M(jìn)行判斷
    但快排本身的時(shí)間復(fù)雜度也有O(nlogn)既绩,只為了查找一條數(shù)據(jù)的話還是有點(diǎn)慢的;于是有了第二種做法还惠。
  • 第二種:
    使用HashMap來存放數(shù)據(jù)饲握,然后進(jìn)行判斷
    使用此方法,時(shí)間復(fù)雜度只需O(1)

曾經(jīng)我以為HashMap算是這類問題的萬能適用解了蚕键;但后來我又遇到了這么一個(gè)問題救欧,依舊是數(shù)量為n的無序集合,判斷一個(gè)整數(shù)是否存在其中锣光,不過不同的是n的值為一億笆怠。

一開始我自然是直接用HashMap處理了,但是在將數(shù)據(jù)存儲(chǔ)至HashMap的時(shí)候內(nèi)存溢出了誊爹,此時(shí)才明白除了時(shí)間復(fù)雜度以外蹬刷,我們還需要考慮到空間問題。這時(shí)候布隆過濾就應(yīng)運(yùn)而生了频丘。

原理

布隆過濾器使用二進(jìn)制向量結(jié)合hash函數(shù)來記錄任意一條數(shù)據(jù)是否已經(jīng)存在于集合中办成。
布隆過濾器的執(zhí)行流程為:

  • 首先申請(qǐng)包含SIZE個(gè)bit位的Bit集合,并將所有Bit置0搂漠。
  • 然后使用數(shù)種(k)不同的哈希函數(shù)對(duì)目標(biāo)數(shù)據(jù)進(jìn)行哈希計(jì)算并得到k個(gè)哈希值(確保哈希值不超過SIZE大杏芈),然后將Bit集合中以哈希值為下標(biāo)所處的bit值置為1,由于使用了k個(gè)哈希函數(shù)而克,因此記錄一條數(shù)據(jù)的信息將在Bit集合中把k個(gè)bit值置為1靶壮。
  • 由于哈希函數(shù)的穩(wěn)定性,任意兩條相同的數(shù)據(jù)在Bit集合中所對(duì)應(yīng)的k個(gè)bit位置是完全相同的员萍。那么在檢測某一條數(shù)據(jù)是否已經(jīng)在Bit集合中有記錄時(shí)亮钦,只需檢測該條數(shù)據(jù)的k個(gè)哈希值在Bit集合中對(duì)應(yīng)的位置的bit是否均已被標(biāo)記為1,相反的只要其存在一個(gè)哈希值對(duì)應(yīng)的bit位置未被標(biāo)記為1充活,則證明該值未被記錄過蜂莉。

使用示例

布隆過濾器的示例如下:


image.png

大體過程為:

  • 首先初始化一個(gè)二進(jìn)制的數(shù)組,長度設(shè)為 L(圖中為 8)混卵,同時(shí)初始值全為 0 映穗。
  • 當(dāng)寫入一個(gè) A1=1000 的數(shù)據(jù)時(shí),需要進(jìn)行 H 次 hash 函數(shù)的運(yùn)算(這里為 2 次)幕随;與 HashMap 有點(diǎn)類似蚁滋,通過算出的 HashCode 與 L 取模后定位到 0、2 處赘淮,將該處的值設(shè)為 1辕录。
  • A2=2000 也是同理計(jì)算后將 4、7 位置設(shè)為 1梢卸。
  • 當(dāng)有一個(gè) B1=1000 需要判斷是否存在時(shí)走诞,也是做兩次 Hash 運(yùn)算,定位到 0蛤高、2 處蚣旱,此時(shí)他們的值都為 1 ,所以認(rèn)為 B1=1000 存在于集合中戴陡。
  • 當(dāng)有一個(gè) B2=3000 時(shí)塞绿,也是同理。第一次 Hash 定位到 index=4 時(shí)恤批,數(shù)組中的值為 1异吻,所以再進(jìn)行第二次 Hash 運(yùn)算,結(jié)果定位到 index=5 的值為 0喜庞,所以認(rèn)為 B2=3000 不存在于集合中诀浪。

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)
    時(shí)間復(fù)雜度為O(n),且布隆過濾器不需要存儲(chǔ)元素本身赋荆,使用位陣列笋妥,占用空間也很小懊昨。
  • 缺點(diǎn)
    通過布隆過濾窄潭,我們能夠準(zhǔn)確判斷一個(gè)數(shù)不存在于某個(gè)集合中,但對(duì)于存在于集合中這個(gè)結(jié)論,布隆過濾會(huì)有誤報(bào)(可能存在兩組不同數(shù)據(jù)但其多個(gè)哈希值完全一樣的情況)嫉你。但是通過控制Bit集合的大性碌邸(即SIZE)以及哈希函數(shù)的個(gè)數(shù),可以將出現(xiàn)沖突的概率控制在極小的范圍內(nèi)幽污,或者通過額外建立白名單的方式徹底解決哈希沖突問題嚷辅。

誤判率計(jì)算公式為(1 – e(-nk/SIZE))k,其中n為目標(biāo)數(shù)據(jù)的數(shù)量距误,SIZE為Bit集合大小簸搞,k為使用的哈希函數(shù)個(gè)數(shù);假設(shè)現(xiàn)有一千萬條待處理數(shù)據(jù)准潭,Bit集合大小為2^30(約10億趁俊,即占用內(nèi)存128MB),使用9個(gè)不同的哈希函數(shù)刑然,計(jì)算可得任意兩條數(shù)據(jù)其9次哈希得到的哈希值均相同(不考慮順序)的概率為2.6e-10寺擂,約為38億分之一。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泼掠,一起剝皮案震驚了整個(gè)濱河市怔软,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌择镇,老刑警劉巖挡逼,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腻豌,居然都是意外死亡挚瘟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門饲梭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乘盖,“玉大人,你說我怎么就攤上這事憔涉《┛颍” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵兜叨,是天一觀的道長穿扳。 經(jīng)常有香客問我,道長国旷,這世上最難降的妖魔是什么矛物? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮跪但,結(jié)果婚禮上履羞,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好忆首,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布爱榔。 她就那樣靜靜地躺著,像睡著了一般糙及。 火紅的嫁衣襯著肌膚如雪详幽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天浸锨,我揣著相機(jī)與錄音唇聘,去河邊找鬼。 笑死柱搜,一個(gè)胖子當(dāng)著我的面吹牛雳灾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冯凹,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谎亩,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了宇姚?” 一聲冷哼從身側(cè)響起匈庭,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浑劳,沒想到半個(gè)月后阱持,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魔熏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年衷咽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒜绽。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镶骗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躲雅,到底是詐尸還是另有隱情鼎姊,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布相赁,位于F島的核電站相寇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钮科。R本人自食惡果不足惜唤衫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绵脯。 院中可真熱鬧佳励,春花似錦休里、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽璃吧。三九已至楣导,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畜挨,已是汗流浹背筒繁。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巴元,地道東北人毡咏。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像逮刨,于是被迫代替她去往敵國和親呕缭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 寫在前面 在大數(shù)據(jù)與云計(jì)算發(fā)展的時(shí)代修己,我們經(jīng)常會(huì)碰到這樣的問題恢总。我們是否能高效的判斷一個(gè)用戶是否訪問過某網(wǎng)站的主頁...
    Audience0閱讀 1,755評(píng)論 0 0
  • 布隆過濾器 (Bloom Filter) 詳解 原文鏈接:http://www.cnblogs.com/allen...
    JackChen1024閱讀 11,853評(píng)論 0 3
  • 打開圖片 引入第三方庫XLPhotoBrowser 打開文件
    Smallwolf_JS閱讀 2,175評(píng)論 0 2
  • 巴巴地活著,每天打水睬愤,煮飯片仿,按時(shí)吃藥 陽光好的時(shí)候就把自己放進(jìn)去,像放一塊陳皮 茶葉輪換著喝:菊花尤辱,茉莉砂豌,玫瑰,檸...
    貝殼0703閱讀 376評(píng)論 0 6