分享好友 最新动态首页 最新动态分类 切换频道
布隆过滤器
2024-12-26 11:11

      看见了海量数据去重,找到停留时间最长的IP等问题,有博友提到了Bloom Filter,我就查了查,不过首先想到的是大叔,下面就先看看大叔的风采。

布隆过滤器

一、布隆过滤器概念引入

      (Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中)和删除困难,但是没有识别错误的情形(即假反例False negatives,如果某个元素确实在该集合中,那么Bloom Filter 是不会报告该元素不存在于集合中的,所以不会漏报)。

      下面从简单的排序谈到BitMap算法,再谈到数据去重问题,谈到大数据量处理利器:布隆过滤器。

  • 对无重复的数据进行排序

      给定数据(2,4,1,12,9,7,6)如何对它排序

     方法1:基本的排序方法包括冒泡,快排等。

     方法2:使用BitMap算法

     方法1就不介绍了,方法2中所谓的BitMap是一个位数组,跟平时使用的数组的唯一差别在于操作的是位。首先是开辟2个字节大小的位数组,长度为12(该长度由上述数据中最大的数字12决定的),然后,读取数据,2存放在位数组中下标为1的地方,值从0改为1,4存放在下标为3的地方,值从0改为1....最后,读取该位数组,得到排好序的数据是(1,2,4,6,7,9,12)。

      比较方法1和方法2的差别:方法2中,排序需要的时间复杂度和空间复杂度很依赖与数据中最大的数字比如12,因此空间上讲需要开2个字节大小的内存,时间上需要遍历完整个数组。当数据类似(1,1000,10万)只有3个数据的时候,显然用方法2,时间复杂度和空间复杂度相当大,但是当数据比较密集时该方法就会显示出来优势。

  • 对有重复的数据进行判重

   数据(2,4,1,12,2,9,7,6,1,4)如何找出重复出现的数字

   首先是开辟2个字节大小的位数组,长度为12(该长度由上述数据中最大的数字12决定的,当读取完12后当读取2的时候,发现数组中的值是1,则判断出2是重复出现的。

二、布隆过滤器原理

      布隆过滤器需要的是一个位数组(这个和位图有点类似)和k个映射函数(和Hash表类似,在初始状态时,对于长度为m的位数组array,它的所有位都被置为0。对于有n个元素的集合S={s1,s2......sn},通过k个映射函数{f1,f2,......fk},将集合S中的每个元素sj(1&lt;=j<=n)映射为k个值{g1,g2......gk},然后再将位数组array中相对应的array[g1],array[g2]......array[gk]置为1如果要查找某个元素item是否在S中,则通过映射函数{f1,f2.....fk}得到k个值{g1,g2.....gk},然后再判断array[g1],array[g2]......array[gk]是否都为1,若全为1,则item在S中,否则item不在S中。这个就是布隆过滤器的实现原理。

      当然有读者可能会问:即使array[g1],array[g2]......array[gk]都为1,能代表item一定在集合S中吗?不一定,因为有这个可能:就是集合中的若干个元素通过映射之后得到的数值恰巧包括g1,g2,.....gk,那么这种情况下可能会造成误判,但是这个概率很小,一般在万分之一以下。

      很显然,布隆过滤器的误判率和这k个映射函数的设计有关,到目前为止,有很多人设计出了很多高效实用的hash函数。尤其要注意的是,布隆过滤器是不允许删除元素的(实际就是因为多个str可能都应设在同一点,而判断str存在的话是所有映射点都存在,所以不能删除),因为若删除一个元素,可能会发生漏判的情况。不过有一种布隆过滤器的变体Counter Bloom Filter,可以支持删除元素,感兴趣的读者可以查阅相关文献资料。

三、布隆过滤器False positives 概率推导

四、布隆过滤器应用

      布隆过滤器在很多场合能发挥很好的效果,比如:网页URL的去重,垃圾邮件的判别,集合重复元素的判别,查询加速(比如基于key-value的存储系统)等,下面举几个例子

  • 有两个URL集合A,B,每个集合中大约有1亿个URL,每个URL占64字节,有1G的内存,如何找出两个集合中重复的URL。

很显然,直接利用Hash表会超出内存限制的范围。这里给出两种思路

      第一种:如果不允许一定的错误率的话,只有用分治的思想去解决,将A,B两个集合中的URL分别存到若干个文件中{f1,f2...fk}和{g1,g2....gk}中,然后取f1和g1的内容读入内存,将f1的内容存储到hash_map当中,然后再取g1中的url,若有相同的url,则写入到文件中,然后直到g1的内容读取完毕,再取g2...gk。然后再取f2的内容读入内存。。。依次类推,知道找出所有的重复url。

      第二种:如果允许一定错误率的话,则可以用布隆过滤器的思想。

  • 在进行网页爬虫时,其中有一个很重要的过程是重复URL的判别,如果将所有的url存入到数据库中,当数据库中URL的数

量很多时,在判重时会造成效率低下,此时常见的一种做法就是利用布隆过滤器,还有一种方法是利用berkeley db来存储url,Berkeley db是一种基于key-value存储的非关系数据库引擎,能够大大提高url判重的效率。

      布隆过滤器主要运用在过滤恶意网址用的,将所有的恶意网址建立在一个布隆过滤器上,然后对用户的访问的网址进行检测,如果在恶意网址中那么就通知用户。这样的话,我们还可以对一些常出现判断错误的网址设定一个白名单,然后对出现判断存在的网址再和白名单中的网址进行匹配,如果在白名单中,那么就放行。当然这个白名单不能太大,也不会太大,布隆过滤器错误的概率是很小的。

五、布隆过滤器简单Java实现

 


最新文章
2017年中国汽车数字营销案例研究报告.pptx
中国汽车数字营销案例研究报告——艾瑞与新意互动联合发布2021年2?2021.12iResearchInc摘要汽车数字营销开展环境:汽车销量大,但千人汽车保有量低,是中国汽车市场最为明显的两大特征,而这意味着,汽车销量仍将处于增长空间,从而为汽车
AI绘画神器:教你轻松生成超逼真美女写真!
这款工具主要用于风格转换,用户只需上传一张照片,选择喜欢的艺术风格,便可生成一幅充满艺术感的作品。虽说生成结果通常令人满意,但处理时间相对较长,且对计算机性能要求较高,适合在家用高配置设备的用户使用。DALL-E 2OpenAI推出的DA
333期[100%纯真]3d定位精准
333期[九尺钉耙]预测一注今晚3D回顾上期开奖号码:765回顾上期形态:组六形态, 大小形态为大大大,大小比为3:0,奇偶形态为奇偶奇,质合形态为质合质,质合比为:2:1,和值为18点,和尾为8点,跨度为2。独胆推荐:6双胆推荐:56三胆推荐:456杀一
9ht日历生成器
  1、点击“文件”-“新建”(不能点击常用工具栏的“新建”按钮)。  2、右侧的导航栏中找到“本机上的模板”。  3、点击打开本机模板,出现模板对话框。  4、找到“其它文档”选项卡,从中选择“日历向导”。  5、系统自动进入日
870游戏盒最新版本2024下载安装
870游戏盒最新版2024是一款专为广大游戏爱好者打造的云游戏盒子软件。它不仅拥有广泛的游戏选择和出色的云游戏技术,还以其用户友好的设计和卓越的性能而备受好评。软件提供了丰富多样的游戏资源,包括热门的PC和主机游戏大作,以及独立开
30套《2025年日历》电子版 Word Excel 模板年历月历工作学习计划 (可编辑,可打印)附:下载方法
(网盘下载链接)30套《2025年日历》电子版Word Excel 模板(可编辑)日历/月历/年历/工作学习计划全套网盘打包下载▼资源展示▼更多内容请自行下载观看1.点击下方关注“基层医药卫生家园”公众号2.公众号内回复“宣传栏” 三字领取
2024年网安最全宝塔面板安装WordPress网站教程(手动部署)(1)
一、前期准备 如果你还没有安装宝塔面板请参考下面的博客: 宝塔面板安装教程(更新安装视频教程) – 奶爸建站笔记 (naibabiji.com)") 怎么在宝塔面板里面添加网站_绑定更多网站 – 奶爸建站笔记 (naibabiji.com)&#
335期[彩神无需粉丝]P5万位独胆报号
335期彩神无需粉丝体彩排列五万位五码:23678 双胆:23 独胆:2 开:334期彩神无需粉丝体彩排列五万位五码:23589 双胆:23 独胆:2 开:74681[万位:7]333期彩神无需粉丝体彩排列五万位五码:13569 双胆:13 独胆:1 开:84859[万位:8]332期彩神无需粉
LzCMS博客系统 php版 v1.1.5
LzCMS是用ThinkPHP+layui做的,简单方便,没有复杂的功能,就是一个简单博客系统。LzCMS(老张内容管理系统),也就是老张博客的源码。LzCMS和老张博客用的同一个LOGO。功能:1、内容模型有:单页模型、文章模型、链接模型、图集模型、下载模型
相关文章
推荐文章
发表评论
0评