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