您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

BloomFilter算法知识点

时间:2019-08-27 10:03:33  来源:  作者:

1.介绍

BloomFilter(布隆过滤器)是一种可以高效地判断元素是否在某个集合中的算法。

在很多日常场景中,都大量存在着布隆过滤器的应用。例如:检查单词是否拼写正确、网络爬虫的URL去重、黑名单检验,微博中昵称不能重复的检测。在工业界中,google著名的分布式数据库BigTable也用

了布隆过滤器来查找不存在的行或列,以减少磁盘查找的IO次数;Google Chrome浏览器使用BloomFilter来判断一个网站是否为恶意网站。

对于以上场景,可能很多人会说,用HashSet甚至简单的链表、数组做存储,然后判断是否存在不就可以了吗?

当然,对于少量数据来说,HashSet是很好的选择。但是对于海量数据来说,BloomFilter相比于其他数据结构在空间效率和时间效率方面都有着明显的优势。

但是,布隆过滤器具有一定的误判率,有可能会将本不存在的元素判定为存在。因此,对于那些需要“零错误”的应用场景,布隆过滤器将不太适用。具体的原因将会在第二部分中介绍。

在本文的第二部分,本文将会介绍BloomFilter的基本算法思想;第三部分将会基于Google开源库Guava来讲解BloomFilter的具体实现;在第四部分中,将会介绍一些开源的BloomFilter的扩展,以解决目前BloomFilter的不足。

2.算法讲述

布隆过滤器是基于Hash来实现的,在学习BloomFilter之前,也需要对Hash的原理有基本的了解。个人认为,BloomFilter的总体思想实际上和bitmap很像,但是比bitmap更节省空间,误判率也更低。

BloomFilter的整体思想并不复杂,主要是使用k个Hash函数将元素映射到位向量的k个位置上面,并将这k个位置全部置为1。当查找某元素是否存在时,查找该元素所对应的k位是否全部为1即可说明该元素是否存在。

2.1算法流程

BloomFilter的整体算法流程可总结为如下步骤:

  1. BloomFilter初始化为m位长度的位向量,每一位均初始化为0
BloomFilter算法知识点

 

  1.  
  2. 使用k个相互独立的Hash函数,每个Hash函数将元素映射到{1..m}的范围内,并将对应的位置为1。
BloomFilter算法知识点

 

  1.  
  2. 如上图所示,元素x分别被三个Hash函数映射到了三个位置8、1、14,并将这三个位置从0变为1。
  3. 若检查一个元素y是否存在,首先第一步使用k个Hash函数将元素y映射到k位。分别检测每一位是否为0。若某一位为0,则元素y一定不存在,若全部为1,则有可能存在。

 

2.2空间复杂度

BloomFilter 使用位向量来表示元素,而不存储本身,这样极大压缩了元素的存储空间。其空间复杂度为O(m),m是位向量的长度。而m与插入总数量n的关系如公式

BloomFilter算法知识点

 

我们可以利用这个公式来算一下需要抓取100万个URL时BloomFilter所占据的空间。

假设要求误判率为1%,因此该公式可转化为m=9.6∗n

。故此时BloomFilter位向量的大小为100w∗9.6=960wbit

,约1.1M内存空间。

只需要1.1M的内存空间,就可满足100万个url的去重需求,这个空间复杂度之低不可谓不惊人。

实际上,哪怕是1亿个URL,也仅需100M左右的内存空间即可满足BloomFilter的空间需求,这对于绝大部分爬虫的体量来说,是完全可行的。

1MB ≈ 10^3KB ≈ 10^6Byte ≈ 8 * 10^6b = 800Wbit

2.3时间复杂度

时间复杂度方面 BloomFilter的时间复杂度仅与Hash函数的个数k有关,即O(k)

2.4缺点

删除元素

BloomFilter 由于并不存储元素,而是用位的01来表示元素是否存在,并且很有可能一个位时被多个元素同时使用。所以无法通过将某元素对应的位置为0来删除元素。

幸运的是,目前学术界和工业界都有很多方法扩展已解决以上问题。

强烈建议读取下面两篇文章,并且把其中的公式推导一遍:

转载大部分来自:http://cyhone.com/2017/02/07/Introduce-to-BloomFilter/

同时推荐:http://llimllib.github.io/bloomfilter-tutorial/zh_CN/

原文:https://www.cnblogs.com/wenbochang/p/11414687.html



Tags:BloomFilter算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1.介绍BloomFilter(布隆过滤器)是一种可以高效地判断元素是否在某个集合中的算法。在很多日常场景中,都大量存在着布隆过滤器的应用。例如:检查单词是否拼写正确、网络爬虫的URL...【详细内容】
2019-08-27  Tags: BloomFilter算法  点击:(288)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条