資料存在? 布隆過濾器

2021-07-16 09:38:30 字數 2562 閱讀 4305

布隆過濾器是一種能夠在大量資料中判斷資料是否存在的演算法。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。在介紹『布隆過濾器』之前,先介紹一下『位圖』的思想:

這裡有這樣乙個問題:給40億個沒有排序、不重複的無符號整數,如何快速的判斷乙個資料是否在這40億個資料之中?

--對於40億個資料,如果我們將這40億個資料都放入記憶體中,我們需要多大的儲存空間呢?假設每個資料都是char型別的,這樣消耗多少的空間?如果是int型別呢?或者是更多的資料呢?不難知道對於大量的資料,如果採用將資料放入記憶體中,這種方式是很不理智的。這裡介紹一種方法—『位圖』。

位圖:主要演算法思想就是充分的利用bit位,假設資料都是int型別,每個int型別都佔32個bit位。將乙個int型別資料的32個bit用來表示32個資料是否存在, 0表示不存在,1表示存在(能夠極大地縮小空間)。先計算出資料在哪乙個int型別的空間中,然後計算在這個int型別的第幾個bit位上,然後將此位置更改為1,表明這個位置上存在資料。

下面是『位圖』的實現:

class bitmap

void set(size_t x)    //插入資料

bool test(size_t x)   //判斷資料是否在40億資料中

size_t size()     //求資料的有效個數

void resize(size_t size)    //開闢空間

protected:

vector_a;

size_t _size;

};

『布隆過濾器』也是利用點陣圖的思想,它有乙個m個位元個數的空間,每乙個bit位都初始化為0,通過k種不同的hash函式,每個函式都確定出元素所在的不同位置,將這k個位置的bit位置為1,則將這個元素新增到m個bit的空間中。當需要對資料進行查詢時,將k中hash函式得到的k個位置的bit位進行檢查,若k個位置都為1,則資料存在,否則資料不存在。布隆過濾器是不允許進行刪除資料的,因為那樣會將k個位置置為0,可能會影響其他資料的存在性,從而存在錯誤。

下面是『布隆過濾器』的實現:

//實現布隆過濾器

template //使用搜尋到的5種hash函式

struct _hashfunc1

return hash;

}size_t operator()(const k& str)

};template struct _hashfunc2

return hash;

}size_t operator()(const k& str)

};template struct _hashfunc3

return hash;

}size_t operator()(const k& str)

};template struct _hashfunc4

else

}return hash;

}size_t operator()(const k& str)

};template struct _hashfunc5

return hash;

}size_t operator()(const k& str)

};size_t getprimesize(size_t size) //求大於等於size的最小素數

;     

for (size_t i = 0; i < _prime; i++)

}return _primelist[_prime - 1];

}template ,

class hashfunc2 = _hashfunc2,

class hashfunc3 = _hashfunc3,

class hashfunc4 = _hashfunc4,

class hashfunc5 = _hashfunc5>

class bloomfilter

void set(const k& key)

bool test(const k& key)    //測試資料是否存在

size_t index2 = hashfunc2()(key);

if (!_bm.test((index2) % _capacity))

size_t index3 = hashfunc3()(key);

if (!_bm.test((index3) % _capacity))

size_t index4 = hashfunc4()(key);

if (!_bm.test((index4) % _capacity))

size_t index5 = hashfunc5()(key);

if (!_bm.test((index5) % _capacity))

return true;

}protected:

bitmap _bm;

size_t _capacity;

};

布隆過濾器

布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...

布隆過濾器

布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...

布隆過濾器

如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...