算法学习-------------布隆过滤器

布隆过滤器是用来判断一个元素是否在某个集合中,他有点类似于HashSet  

       但是HashSet是需要存储key值的,他通过存储Key值,查看是否存在时候只需要查看HashSet是否存了就可以,数据量较小的时候是可以使用的。但是数据量很大的时候,比如存储几十亿条垃圾网站数据的时候就显得太不够用了。

       布隆过滤器不同,他是使用了BIT作为标志位进行判断。

 

原理

       布隆过滤器使用的bit数组  https://www.jianshu.com/p/2104d11ee0a2 原文作者写的很清楚,很好。我自己重敲一遍,加深理解。

   

     布隆过滤器创建一个BIT数组,然后传来一个网页,我们用K个哈希函数计算哈希再取余然后得到他在1-8的位置

又来一个网站,同样的道理处理。

这里看到 虽然tencent与baidu都在4做了标记,但是这是互不影响的,但是可能会引发一些的问题。

        这样操作之后,用户输入一个网页,我们使用同样的判断方法去到BIT数组中找看是否所有映射都被标记,如果都被标记了。注意是全都被标记了,那么这个就应该是之前被特殊标注了,是我们要过滤的网站,也只是应该。为什么是可能呢,就像我们刚才提到的,发生了碰撞,tecent与baidu都标记了4,那假如来了一个新网站,csdn他计算出结果为1,3,8,程序查看都被标记,直接过滤。与此同时还有一个问题就是我们可以进行网页录入,网页判断,但是我们不可以网页删除。就像4是两个的公共标记,我们删除一个,另一个也会出问题。

     所以总结下来, 布隆过滤器有两个问题

    ①判断结果可能会出错 

    ②无法删除其中数据 

    那么我们一个一个分析解决。

判断结果出错 

     这其实主要因为我们设置的区间太小,标注数据太密集。就好比买彩票,有8张彩票有奖,我们把8张有奖与2张无奖放到一起让客户抓,很容易中奖。那我们将8张彩票放到1W张没奖彩票中就不容易了,当前问题也是这道理。当然这个区间也不是越大越好,太大了内存消耗就高,这就要我们设置的相对合适了。

 

 

无法删除数据

           我们不让比特数组只是存储0与1,让他存储有几个映射在这,比如上图的两个网页,4号位存2,那么Baidu删除了,4号位变为1,1 7 变为0,不会影响tencent的操作。

 

应用场景

            ① 单纯判断是否元素是否在集合中

            ② 通过判断元素是否在集合,减少IO  网络连接等消耗,比如前端要查看数据,要调用后端,本来要传递很多参数,但只发一个key 后端查询没有,这样前段其他数据就不用发送。

 

 

 

 

 

 

 

 

 

具体实现以及错误率计算

日后在更

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值