布隆过滤器——一种快速检测元素是否存在的数据结构
位图(典型的k v模型)——用来判断一个整数是否出现在集合中,或者查找出现次数最多或最少的元素
//布隆过滤器的原理:
我们知道字符串哈希算法,就是把字符串转换为相对应的key值,然后存在于位图中,但是,这也可能存在冲突的情况(多个字符串映射到同一个位置)
布隆过滤器就是采用 同时进行多个不同哈希算法进行映射
假设我们用五个不同字符串哈希算法 , 那么我们在判断一个字符串是否存在时,只需要判断对应的五个位是否同时存在就可以了
//布隆过滤器的优点:
1、哈希算法与位图的结合 可以海量处理字符串类型
2、查找时时间复杂度为O(n) n为字符串哈希算法的个数
//缺点
因为存在哈希算法,难免会出现哈希冲突,导致一定的误判性
//误区
并不是哈希算法的个数越多越高,因为那样会特别占内存资源,同时也可能存在哈希冲突的情况
//适应场景
1、垃圾网站、邮件过滤
2、爬取网站时,判断一个网站是否被爬过
template <class T>
class BoolmFilter
{
public:
BOolmFilter(size_t num)
:_bp(num*2*5)
{}
size_t HashFun_1();
size_t HashFun_2();
size_t HashFun_3();
size_t HashFun_4();
size_t HashFun_5();
void Set()
{
h1 = HashFun_1(string& str);
h2 = HashFun_2(string& str);
h3 = HashFun_3();
h4 = HashFun_4();
h5 = HashFun_5();
_bp.set(h1);
_bp.set(h2);
_bp.set(h3);
_bp.set(h4);
_bp.set(h5);
}
bool Find()
{
if( _bp.find( HashFun_1(str) ) == false)
return false;
if( _bp.find( HashFun_2(str) ) == false)
return false;
if( _bp.find( HashFun_3(str) ) == false)
return false;
if( _bp.find( HashFun_4(str) ) == false)
return false;
if( _bp.find( HashFun_5(str) ) == false)
return false;
return true;
}
private:
BitMap _bp; // 位图
};