一文读懂 海量数据去重 带你认识布隆过滤器

本文介绍了在处理大量数据查询时,传统数据结构如哈希表的效率问题。针对这种情况,引入了布隆过滤器,这是一种概率型数据结构,用于快速判断元素是否存在,占用空间小但存在误判可能。布隆过滤器由位图和多个哈希函数组成,其误判率可通过数学公式计算,并提供了在线计算器工具。此外,还给出了布隆过滤器的Python实现链接,便于实际应用。
摘要由CSDN通过智能技术生成

无论任何数据结构 双链表 红黑树 b+树 b树 或者是哈希表 他们都有一个问题 就是搜索效率并不高 在面对海量数据 比如几十万用户发几十万个查询数据请求 我却要一个个去搜索数据是否存在时 非常的耗时 有些读者就要说了 哈希表搜索效率不是非常高嘛?

一个像 Yahoo,Hotmail 和 Gmai 那样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人的垃圾邮件。一个办法就是记录下那些发垃圾邮件的 email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿 个 email 地址, 就需要 1.6GB 的内存。然后将这些信息存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email 地址需要占用十六个字节。一亿个地址大约要 1.6GB, 即十六亿字节的内存。因此存贮几十亿个邮件地址可能需要上百 GB 的内存。除非是超级计算机,一般服务器是无法存储的。

哈希表某一个桶内元素过多 不可避免的就会降低整个哈希表的效率 无论你是采用拉链法还是开放寻址法或者是其他一些规避哈希冲突的算法 都会使得搜索效率下降

我们想要一种数据结构 他的功能仅仅是快速判断一个数据是否存在我的数据库中 并且占用的空间不能太多 有没有这种数据结构呢? 有的 那便是布隆过滤器

布隆过滤器的思想

如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。可以通过一(多)个Hash函数将一(多)个元素映射成一(多)个位阵列(或者是位图)中的一(多)个点。这样一来,我们计算完哈希值,只要看看对应的点是不是 1 就知道可以集合中有没有它了。这就是布隆过滤器的基本思想。

布隆过滤器的特点

布隆过滤器是一种概率型数据结构,它的特点是高效地插入和查询,能确定某个字符串一定不存在或者可能存在。(注意:能判断一定不存在,但是不能判断一定存在,也就是只能知道100%不在里面,且有一定概率在里面)

布隆过滤器不存储具体数据,所以占用空间小,查询结果存在误差,但是误差可控,同时不支持删除操作(实现删除的思路:设置两个位图,将删除后的添加到删除位图,查询的时候两个位图都查询,如果第一个位图存在,再查删除位图,当删除位图不存在的时候该元素存在,否在表示已经被删除了)

布隆过滤器由一个位图和n个哈希函数构成

 如上图 173key值我便进行多次哈希 并把位图内对应的值全部置为1

 

 那么聪明的读者又要问了 我怎么确定我应该选取多少个哈希函数和多大的位图呢 并且我的假阳率也必须很低才行 没关系 数学家帮你解决了这个问题 

 有些读者又说了 我看不懂啊 上图的公式 那么请访问如下网站 便可以快速计算 

Bloom filter calculator 

那么有没有通俗易懂的接口直接调参数就可以使用布隆过滤器呢 有的 快去白嫖吧

http://gitlab.0voice.com/0voice/bloomfilter/tree/master

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值