布隆過濾器的作用就是判斷元素,在某個元素集中是否存在。
hashmap的問題
實際上hashmap也能達到同樣的效果,但與布隆過濾器的區別如下:
hashmap的大致原理就是,把所有裝入的鍵值對都存到乙個entry物件裡,然後根據key值hash出乙個常數,作為該鍵值對的索引值,並把鍵值對存入與索引值相同下標的陣列,下次尋找該鍵值對時,直接hash傳入key值,然後查詢陣列下標與hash結果相同的項,裡面就是要找的鍵值對。
如果兩個鍵值對被hash到了同乙個陣列下標,則查詢到該下標時進行遍歷key值比較。
優點:查詢快,且能夠儲存完整的鍵值對。
缺點:如果只是想單純判斷數值是否存在,這種判斷代價有點太昂貴了,因為畢竟hashmap裡儲存了所有鍵值對的本體。
布隆過濾器
使用場景:
當資料集過大,且僅僅只是需要判斷指定資料是否存在於資料集中時(布隆過濾器不具備任何儲存功能,僅僅如其名稱一樣,只具備過濾判斷元素是否存在的功能)。
演算法步驟:
1、準備多個hash演算法,每個hash演算法都能將元素hash成乙個常數(常數2、準備乙個長度為n的陣列,且初始裡面各項都為0
3、每「裝進來」乙個元素,就用準備好的多個hash演算法,把元素hash成多個常數,並把陣列中下標為這些常數的項設為0.
4、如果要判斷乙個元素「是否被裝進來」過,就用準備好的hash演算法對其進行hash為多個常數,並判斷陣列裡這些常數下標中的項是否為1.
如果都為1,則表示該元素「可能」被裝進來過。
如果哪怕有一項為0,則該元素一定沒有被裝進來過。
問題:1、只能做到高概率保證元素存在。
由演算法流程可見,即使元素hash後所有常數,在陣列的對應下標裡值都為1,也只是有概率該元素裝載過,因為可能元素hash後的所有常數下標,剛好和其他元素的hash值相同。
2、無法從**載元素中剔除元素。
如果我們想從已經裝過的元素集中「刪掉乙個」,實際上也是不可能的,因為元素都被hash成多個陣列下標了,你根本不能確定你刪的那個陣列下標只是被刪元素的hash值,還是別的元素的hash值。
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...
布隆過濾器
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...