如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶、樹、雜湊表(又叫雜湊表,hash table)等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。
bloom filter 是一種空間效率很高的隨機資料結構,bloom filter 可以看做是對 bit-map 的擴充套件, 它的原理是:
`>**布隆過濾器只是點陣圖的乙個擴充套件。點陣圖是乙個位表示key的存在狀態,而布隆過濾器是多個位表示表示乙個數的存在狀態**
注意:對於布隆過濾器查詢乙個資料
1.找到不一定存在。
2.找不到一定不存在。
這說明布隆過濾器是近似查詢。```
[這裡有關布隆過濾器更詳細的介紹,講的很清楚:
下面是**實現:
/* [布隆過濾器的標頭檔案:位圖] :
#pragma once
#include
#includiostream>
#include"bitmap.h"
using namespace std;
templatestruct _func1
};templatestruct _func2
};templatestruct _func3
};templatestruct _func4
};templatestruct _func5
};template<> //模板的特化:必須要先寫乙個同名的模板類或者結構體
struct _func1
return hash;
}size_t operator() (const string& str)
};template<>
struct _func2
else
}return hash;
}size_t operator() (const string& str)
};template<>
struct _func3
return hash;
}size_t operator() (const string& str)
};template<>
struct _func4
return hash;
}size_t operator() (const string& str)
};template<>
struct _func5
return hash;
}size_t operator() (const string& str)
};template < class k = string,
class func1 = _func1,
class func2 = _func2,
class func4 = _func4,
class func5 = _func5> /*五種計算string型別轉換為數字的結構體,內部用
的是仿函式,過載operator()()。*/
class bloomfilter
void set(const k& key) //用相同的key呼叫不同的函式得到不同的位,設定為1
bool test(const k& key)
protected:
bitmap _bm;
size_t _range;
};void testbloomfilter()
cout << bf.test(75) << endl;
cout << bf.test(71) << endl;
cout << bf.test(5) << endl;
cout << bf.test(555) << endl;
ut << bm.test(71) << endl;
cout << bm.test(5) << endl;
}
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...
布隆過濾器
布隆過濾器 的乙個好處就是可以乙個bit表示乙個資料,下面有乙個python的開源庫 建構函式 class pybloomfilter.bloomfilter capacity int,error rate float,filename string 這個filename是生成的bloomfilte...