位圖只能用來快速判斷乙個整數是否在一堆整數中,如果我們想要判斷乙個字串是否在一堆字串裡,那麼點陣圖就做不到了,因此布隆過濾器就出現了。
它是由乙個很長的二進位制向量和一系列隨機 對映函式組成,布隆過濾器可以用於檢索乙個元素是否在乙個集合中。那我們可以利用雜湊函式計算出它具體的存放位置。
它的優點是空間效率和查詢時間都遠遠超過一般的演算法,將這40億的資料記憶體由16gb變成500mb,可見其強大。
缺點是有一定的誤識別率、不便於刪除。布隆過濾器會出現:檢測存在,而實際中卻不存在。而不會出現:實際中不存在,而檢測存在。
布隆過濾器原理
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶、樹、雜湊表(又叫雜湊表,hash table)等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。
bloom filter 是一種空間效率很高的隨機資料結構,bloom filter 可以看做是對 bit-map 的擴充套件, 它的原理是:
當乙個元素被加入集合時,通過 k 個hash函式將這個元素對映成乙個位陣列(bit array)中的 k 個點,把它們置為1。檢索時,我們只要看看這些點是不是都是 1 就(大約)知道集合中有沒有它了:
如果這些點有任何乙個 0,則被檢索元素一定不在;
如果都是 1,則被檢索元素可能在。
如果只是空洞的說這些原理的話,肯定大家都不知道布隆過濾器有什麼用處。布隆過濾器對於單機來說可能用處不是很大,但對於分布式來說就比較有用了。
如主從分布:乙個陣列過來,我想要知道他是不是在記憶體中,我們是不是需要乙個乙個去訪問磁碟,判斷資料是否存在。但是問題來了訪問磁碟的速度是很慢的,所以效率會很低,如果使用布隆過濾器,我們就可以先去過濾器這個集合裡面找一下對應的位置的資料是否存在。雖然布隆過濾器有他的缺陷,但是我們能夠知道的是當前位置為0是肯定不存在的,如果都不存在,就不需要去訪問了。
優點:相比於其它的資料結構,布隆過濾器在空間和時間方面都有巨大的優勢。布隆過濾器儲存空間和插入/查詢時間都是常數。另外, hash函式相互之間沒有關係,方便由硬體並行實現。布隆過濾器不需要儲存元素本身,在某些對保密要求非常嚴格的場合有優勢。
布隆過濾器可以表示全集,其它任何資料結構都不能;
k和m相同,使用同一組hash函式的兩個布隆過濾器的交並差運算可以使用位操作進行。
缺點:但是布隆過濾器的缺點和優點一樣明顯。誤算率是其中之一。隨著存入的元素數量增加,誤算率隨之增加。但是如果元素數量太少,則使用雜湊表足矣。
另外,一般情況下不能從布隆過濾器中刪除元素。我們很容易想到把位列陣變成整數陣列,每插入乙個元素相應的計數器加1, 這樣刪除元素時將計數器減掉就可以了。然而要保證安全的刪除元素並非如此簡單。首先我們必須保證刪除的元素的確在布隆過濾器裡面. 這一點單憑這個過濾器是無法保證的。另外計數器迴繞也會造成問題。
在降低誤算率方面,有不少工作,使得出現了很多布隆過濾器的變種。
簡易的布隆過濾器實現**:
為了降低誤算率的演算法
struct
_hashfunc1
return num;
}};struct
_hashfunc2
return num;
}};struct
_hashfunc3
return num;
}};struct
_hashfunc4
else
}return num;
}};struct
_hashfunc5
return num;
}};
template
k = string
, class
hashfunc1 = _hashfunc1
, class
hashfunc2 = _hashfunc2
, class
hashfunc3 = _hashfunc3
, class
hashfunc4 = _hashfunc4
, class
hashfunc5 = _hashfunc5>
class
bloomfilter
void set
(const
k& key) //要設定為1,必須將5個位置都設定
bool reset
(const
k& key) //採用引用計數的方式復位
bool test
(const
k& key)
private:
vector_bitmap;
};
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...
布隆過濾器
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...