布隆过滤器与位图

布隆过滤器——一种快速检测元素是否存在的数据结构
位图(典型的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; // 位图
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值