布隆過濾器

2021-07-24 11:13:38 字數 2088 閱讀 3239

布隆過濾器的概念

如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。

鍊錶,樹等等資料結構都是這種思路. 但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢(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...