資料結構 布隆過濾器

2021-08-19 21:01:19 字數 1889 閱讀 8264

原理

如果要判斷乙個數是不是在乙個集合裡,一半想到的是將所有的元素儲存起來,然後通過比較確定。但是隨著集合中元素的增加,需要的儲存空間越來越大,檢索速度自然會變慢。這時會有人想到使用雜湊表,將元素通過雜湊函式對映到乙個位陣列中,將相應的位元位置為1,這樣就可以判斷這個元素是不是在集合之中了。

但是雜湊有乙個很嚴重的問題,那就是雜湊衝突。針對這個問題,我們的解決方法是使用多個雜湊函式,用多個位表示乙個值,如果它們之中有乙個說元素不在集合中,那麼這個元素勢必就不在;但是反過來,它們都說在,卻是不一定在集合之中,因為有可能它們在說謊。

優缺點布隆過濾器就是用於檢索乙個元素是否字乙個集合之中,它的優點是空間效率和查詢時間都由於其他一般的演算法,缺點是有一定的機率識別錯誤,並且刪除困難。

之所以會出現刪除困難,是因為由於雜湊衝突,可能乙個位被多次置1,如果我們直接刪除,那麼就會出現錯誤。如果一定要實現刪除功能的話,可以想到將位陣列換成一般的陣列。將其初始化為0,然後每增加乙個元素,相應的位置加1,刪除的時候相應的位置減1就可以了。

演算法實現

1. 我們實現的布隆過濾器,底層搭載的是點陣圖,關於點陣圖的概念及實現,參考這裡。

2. 關於雜湊函式們可以參考這篇文章這裡介紹了很多雜湊函式。

//這裡的雜湊函式都來自上面的文章中

#pragma once

#include

using namespace std;

class keytoint1

private:

size_t bkdrhash(const

char *str)

return hash;

}};class keytoint2

private:

size_t sdbmhash(const

char *str)

return hash;

}};class keytoint3

private:

size_t rshash(const

char *str)

return hash;

}};class keytoint4

private:

size_t aphash(const

char *str)

else

}return hash;

}};class keytoint5

private:

size_t jshash(const

char *str)

return hash;}};

//具體實現

#include "comm.hpp"

#include "bitmap.hpp"

#include

template

class ktoint2 = keytoint2,

class ktoint3 = keytoint3,

class ktoint4 = keytoint4,

class ktoint5 = keytoint5>

class bloomfilter

bool insert(const k& key)//插入元素

bool isinbloomfilter(const k& key)//判斷乙個元素是否在集合中

private:

bitmap _bmp;//位圖儲存元素

size_t _size;//表示存了幾個元素

};void test()

測試結果:

資料結構 布隆過濾器

基於位圖的缺點 只能儲存整型,在現實中的應用有了很大的侷限性,所以又引出了一種新的雜湊變形,其實也算是點陣圖的變形 布隆過濾器。如圖,把字串經過布隆過濾器的處理,對映到位圖的多個位置,讓這幾個位置都置成1用來表示這個字串的存在。所以只要有乙個位置為0,那麼這個資料就不存在。1.本來不存在的資料,可能...

布隆過濾器

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

布隆過濾器

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