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