布隆過濾器,英文叫bloomfilter,可以說是乙個二進位制向量和一系列隨機對映函式實現。 可以用於檢索乙個元素是否在乙個集合中。
下面來看看布隆過濾器是如何判斷元素在乙個集合中,如下圖:
有三個hash函式和乙個位陣列,oracle經過三個hash函式,得到第1、4、5位為1,database同理得到2、5、10位1,這樣如果我們需要判斷oracle是否在此位陣列中,則通過hash函式判斷位陣列的1、4、5位是否均為1,如果均為1,則判斷oracle在此位陣列中,database同理。這就是布隆過濾器判斷元素是否在集合中的原理。
想必聰明的讀者已經發現,如果bloom經過三個hash演算法,需要判斷 1、5、10位是否為1,恰好因為位陣列中新增oracle和database導致1、5、10為1,則布隆過濾器會判斷bloom會判斷在集合中,這不是bug嗎,導致誤判。但是可以保證的是,如果布隆過濾器判斷乙個元素不在乙個集合中,那這個元素一定不會再集合中。
是的,這個是布隆過濾器的缺點,有一點的誤識別率,但是布隆過濾器有2大優點,使得這個缺點在某些應用場景中是可以接受的,2大優點是空間效率和查詢時間都遠遠高於一般的演算法。常規的資料結構set,也是經過被用於判斷乙個元素是否在集合中,但如果有上百萬甚至更高的資料,set結構所佔的空間將是巨大的,布隆過濾器只需要上百萬個位即可,10多kb即可。
總結,敲黑板:
布隆過濾器是用於判斷乙個元素是否在集合中。通過乙個位陣列和n個hash函式實現。
缺點:
bloom filter會有幾比較關鍵的值,根據這個值你是大致可以算出放多少條資料然後它的誤傷率在多少時會占用多少系統資源的。這個演算法有乙個**:
布穀鳥過濾器源於布穀鳥hash演算法,布穀鳥hash表有兩張,分別兩個hash函式,當有新的資料插入的時候,它會計算出這個資料在兩張表中對應的兩個位置,這個資料一定會被存在這兩個位置之一(表1或表2)。一旦發現其中一張表的位置被佔,就將改位置原來的資料踢出,被踢出的資料就去另一張表找對應的位置。通過不斷的踢出資料,最終所有資料都找到了自己的歸宿。但仍會有資料不斷的踢出,最終形成迴圈,總有乙個資料一直沒辦法找到落腳的位置,這代表布穀hash錶走到了極限,需要將hash演算法優化或hash表擴容。
布穀鳥過濾器只會儲存元素的指紋資訊(幾個bit,類似於布隆過濾器),由於不是儲存了資料的全部資訊,會有誤判的可能。
由於布穀鳥過濾器在踢出資料時,需要再次計算原資料在另一種表的hash值,因此作者設計hash演算法時將兩個hash函式變成了乙個hash函式,第一張表的備選位置是hash(x),第二張表的備選位置是hash(x)⊕hash(fingerprint(x)),即第一張表的位置與儲存的指紋的hash值做異或運算。這樣可以直接用指紋的值 異或 原來位置的hash值來計算出其另一張表的位置。
綜上,布穀鳥過濾器
缺點:
布隆過濾器了解
直觀的說,bloom演算法類似乙個hash set,用來判斷某個元素 key 是否在某個集合中。和一般的hash set不同的是,這個演算法無需儲存key的值,對於每個key,只需要k個位元位,每個儲存乙個標誌,用來判斷key是否在集合中。演算法 1.首先需要k個hash函式,每個函式可以把key雜...
布隆過濾器的原理和快取穿透
布隆過濾器原理 布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想判斷乙個元素是不是在乙個集...
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...