布隆過濾器的概念
如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。
鍊錶,樹等等資料結構都是這種思路. 但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢(o(n),o(logn))。不過世界上還有一種叫作雜湊表(又叫
雜湊表,hash table)的資料結構。它可以通過乙個
hash函式
將乙個元素對映成乙個位陣列(bit array)中的乙個點。這樣一來,我們只要看看這個點是不是1就可以知道集合中有沒有它了。這就是布隆過濾器的基本思想。
hash面臨的問題就是衝突。假設hash函式是良好的,如果我們的位陣列長度為m個點,那麼如果我們想將衝突率降低到例如 1%, 這個雜湊表就只能容納m / 100個元素。顯然這就不叫空間效率了(space-efficient)了。解決方法也簡單,就是使用多個hash,如果它們有乙個說元素不在集合中,那肯定就不在。如果它們都說在,雖然也有一定可能性它們在說謊,不過直覺上判斷這種事情的
概率是比較低的。
本文演算法思路來自
**實現
bitmap.h
#pragma once
#include#includeusing namespace std;
class bitmap
void set(size_t x)
bool test(size_t x)
~bitmap()
{}protected:
vector_bitmap;
};
bloonfilter.h
#pragma once
#include #include #include #include "bitmap.h"
using namespace std;
struct __hashfunc1
return hash;
} size_t operator()(const string& str) };
struct __hashfunc2
return hash;
} size_t operator()(const string& str) };
struct __hashfunc3
return hash;
} size_t operator()(const string& str) };
struct __hashfunc4
else
} return hash;
} size_t operator()(const string& str) };
struct __hashfunc5
return hash;
} size_t operator()(const string& str) };
templateclass refbloomfilter
void set(const k& key)
{ size_t index1=hashfunc1()(key)%_range;
size_t index2=hashfunc2()(key)%_range;
size_t index3=hashfunc3()(key)%_range;
size_t index4=hashfunc4()(key)%_range;
size_t index5=hashfunc5()(key)%_range;
_bitmap.set(index1);
_bitmap.set(index2);
_bitmap.set(index3);
_bitmap.set(index4);
_bitmap.set(index5);
coutchar* str1="";
char* str2="";
char* str3="";
char* str4="";
char* str5="";
bf.set(str1);
bf.set(str2);
bf.set(str3);
bf.set(str4);
bf.set(str5);
cout<
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...
布隆過濾器
布隆過濾器 的乙個好處就是可以乙個bit表示乙個資料,下面有乙個python的開源庫 建構函式 class pybloomfilter.bloomfilter capacity int,error rate float,filename string 這個filename是生成的bloomfilte...