布隆过滤器和布谷鸟过滤器详解
今天和大家分享下布隆过滤器和布谷鸟过滤器
一.布隆过滤器
1.简单介绍
布隆过滤器是用于检索一个元素是否在一个集合中的算法,是一种用空间换时间的查询算法。
2.实现原理
布隆过滤器的存储结构是一个bitmap结构,初始值都是0,如下图所示:
当需要存储一个数据的时候,会通过多次(这里假设为3次)hash函数运算之后,计算出3个hash值,然后将计算出的这3个hash值当做坐标,将数组对应的坐标数据由0改成1,以此来标记这个数据已经存储在数组中了。如下图所示:
等到需要查询数据是否在数组中时,就通过hash计算出对应的坐标,判断是否全都为1,如果都为1数据就可能存在,如果有一个为0,则数据一定不存在。
- 为什么这里说可能存在能,因为可能会出现hash碰撞的情况,不同的数据经过hash函数运算之后,计算出来的hash坐标却相同,导致数据本来不存在数组中,但是这里却判断存在,因此布隆过滤器会出现误判的情况,但是概率会很低,误判的概率和设置的hash运算次数是成反比的。
如下图所示:
Data和Data2的hash值一样,但是Data数据存在,Data2不存在,在判断Data2的时候,布隆过滤器就会判断Data2也存在,由此产生误判。
这里有个很有意思的网站,大家可以自己动手去看下数据存储的具体过程:https://www.jasondavies.com/bloomfilter/网站内容如下:
总的来说,布隆过滤器的判断:存在->可能存在,不存在->一定不存在。
- 根据上述特性,布隆过滤器在很多场景下,可以帮我们判断大部分的判断请求。因此较多用于高并发的场景下使用,比如处理缓存击穿、用户视频推荐等场景。
3. 布隆过滤器的缺点
- 误判:
上文已经说明一点了,就是布隆过滤器会产生误判,在此就不过多赘述了。- 当数组过大时,查询效率不高:
因为布隆过滤器的判断方式是根据多次hash值判断的,当数组过大,那么hash值的跨度可能就越大,跨度大就是不连续,那么CPU的缓存命中率就会变低,就会影响查询效率。- 布隆过滤器不能删除元素:
因为不同的数据可能会计算出相同的hash值,因此我们如果要删除某个元素,可能也会影响其他的元素的判断。在这个限制条件下,当数据量大的时候,就会导致很多的垃圾数据。并且数据量越大,误判率也就会越高。
二.布谷鸟过滤器
1.简单介绍
布谷鸟过滤器可以说是一个增强版的布隆过滤器,可以删除元素,查询效率更高,空间利用率更高。
2.实现原理
布谷鸟过滤器不同于布隆过滤器主要有两点改动:
- hash算法:
在布谷鸟过滤器中,数组中存储的是每个元素的"指纹信息",也就是hash运算之后的几个bit位。查询数据的时候,就是看看对应的位置上有没有对应的“指纹”信息,删除数据的时候,也只是抹掉该位置上的“指纹”而已。- 由于指纹是对元素进行 hash 计算得出的,那么必然会出现 hash 碰撞的问题,也就是“指纹”相同的情况,也就是会出现误判的情况,所以这点和布隆过滤器一样。
布谷鸟过滤器的hash算法是基于布谷鸟哈希算法做了改进,计算公式如下:
fp = fingerprint(x)
h1 = hash(x)
h2 = h1 ^ hash(fp) // 异或
- 在上列公式可以看出,h2的位置是根据h1的位置计算出来的,也就是说我们知道了其中一个位置,就可以直接获取到另外一个位置,不需要再做全量的hash运算。因为使用的异或运算,所以这两个位置具有对偶性。这也是提高查询效率的一个点。
只要保证 hash(fp) !=0,那么就可以确保 h2!=h1,也就可以确保不会出现自己踢自己的死循环问题了。- 这里还有个注意点:就是hash运算的时候,并没有对值进行长度取模运算,那么他是如何保证计算出来hash坐标,一定是在数组长度范围内呢?这就说到布谷鸟过滤器的一个限制条件了,那就是强制数组的长度必须是 2 的指数倍
这个限制带来的好处就是,进行异或运算时,可以保证计算出来的下标一定是落在数组中的。
布谷鸟过滤器对布隆过滤器的另一个优化点就是存储结构:
- 布谷鸟过滤器的存储结构是每个坐标下的空位是多个,不同于布隆过滤器的一个空位。如下图所示:
布谷鸟过滤器会记录每个元素的两个hash位置,每个位置下都会有多个空位,空位内存储的就是元素的“指纹信息”。- 布谷鸟过滤器添加元素的流程是这样的:
布谷鸟过滤器会先计算出元素对应的指纹信息,然后对元素进行hash运算,计算出元素的第一个存储坐标,该坐标下存在四个空位,如果四个空位中有空闲的,就将该元素的指纹信息存进去;如果没有空位,就会根据指纹和第一个hash坐标进行异或运算,计算出第二个坐标,如果第二个坐标下有空位,就将该元素的指纹信息存进去;如果还没有空位,那么该元素就会随机将一个空位中的指纹信息挤出,然后自己存进去,被挤出的指纹信息会计算出自己的第二个坐标,然后判断是否有空位,重复上述操作,直到达到一个阀值,布谷鸟过滤器返回false或进行扩容处理。
流程如下所示:
数据Data想要存储到布谷鸟过滤器中,首先会计算出h1和h2两个存储坐标,结果发现两个坐标的空位都已经“满员”了,此时会随机挤掉一个元素的指纹信息,假设挤掉了h1坐标的指纹3,然后指纹3会找自己的第二个坐标,然后判断是否有空位,有空位就存到第二个坐标下,如下图:
扩容:如果数组过小,会发生循环挤兑的情况,就可以设置最大挤兑次数,如果超过该次数,进行扩容,重新计算每个指纹的位置。
当 hash 函数固定为 2 个的时候,如果一个下标只能放一个元素,那么空间利用率是 50%。如果为 2,4,8 个元素的时候,空间利用率分别是 84%,95%,98%,可以发现空间利用率飙升。
3.布隆过滤器的缺点
- 删除不完美,存在误删的概率。删除的时候知识删除了一份指纹副本,并不能确定此指纹副本是要删除的key的指纹。同时这个问题也导致了假阳性的情况。
- 插入复杂度比较高。随着插入元素的增多,复杂度会越来越高,因为存在桶满,踢出的操作,所以需要重新计算,但综合来讲复杂度还是常数级别。
- 存储空间的大小必须为2的指数的限制让空间效率打了折扣。
- 同一个元素最多插入kb次,(k指哈希函数的个数,b指的是坐标下能装指纹的个数也可以说是坐标下桶的尺寸大小)如果布谷鸟过滤器支持删除,则必须存储同一项的多个副本。 插入同一项kb+1次将导致插入失败。 这类似于计数布隆过滤器,其中重复插入会导致计数器溢出。
相关文章:
布隆过滤器和布谷鸟过滤器详解
今天和大家分享下布隆过滤器和布谷鸟过滤器 一.布隆过滤器 1.简单介绍 布隆过滤器是用于检索一个元素是否在一个集合中的算法,是一种用空间换时间的查询算法。 2.实现原理 布隆过滤器的存储结构是一个bitmap结构,初始值都是0,如下图所示&am…...
WebGIS前端框架(openlayers,mapbox,leaflet)图形图像底层渲染原理分析
学了这么多的框架,做了这么多的项目,你是否清楚你使用的GIS框架(mapbox,open layers,cesium,leaflet)底层到底是什么原理?是否清楚哪些所谓的地图影像,矢量图形,图标,图像动画等是如何渲染到网页上的?这篇文章就大家解读一下WebGIS的底层原理。 首先说说历史,有时…...
AcWing语法基础课笔记 第五章 C++中的字符串
第五章 C中的字符串 字符串是计算机与人类沟通的重要手段。 ——闫学灿 字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的数字,二者之间可以相互转化: 常用ASCII值:’A’-‘Z’ 是65~90,’a’-‘z’…...
抓包工具Charles(一)-下载安装与设置
无论是在测试、开发工作中,抓包都是很重要、很常用的技能。Charles作为一款抓包工具,能够满足大部分的工作需求。 文章目录一、下载地址二、安装三、安装根证书(电脑)四、设置五、抓包附录:[零基础入门接口功能测试教程…...
SpringBoot09:Swagger
什么是Swagger? ①是一个API框架 ②可以在线自动生成 RestFul 风格的API文档,实现API文档和API定义同步更新 ③可以直接运行、在线测试 API 接口 ④支持多种语言(Java、PHP等) 官网:API Documentation & Desi…...
Git 常用命令
笔记-git命令1、名词2、基本操作3、分支操作1、名词 master: 默认开发分支origin: 默认远程版本库Index / Stage: 暂存区Workspace: 工作区Repository: 仓库区 (或本地仓库)Remote: 远程仓库 2、基本操作 配置级别 -local (默认,高级优先…...
查看jdk安装路径,在windows上实现多个java jdk的共存解决办法,安装java19后终端乱码的解决
查看jdk安装路径, 在windows上实现多个java jdk的共存解决办法, 安装java19后终端乱码的解决 目录 一、查看jdk(java开发工具包)安装路径的方法 二、在windows上实现多个java jdk的共存 (1)、安装好多…...
链表数据结构
用途: 链表是一种用于计算机中存储与组织数据的结构,链表将数据以节点的形式串联起来,其存储的容量大小可以动态伸缩。 结构: typedef struct {int data; /*当前节点的数据*/node *next;/*下一个节点的指针*/node *last;/*上一个…...
汽车DTC故障内码与标准故障码的解析与转换
目录 一、故障内码与标准故障码的解析 (1)故障内码的信息格式与解析 (2)故障内码中DTC状态的解析 (3)故障内码与标准故障码之间的对应关系 二、故障内码与标准故障码的转换代码 一、故障内码与标准故障…...
零基础学习测试还是开发?
软件测试作为IT行业的刚需职位,其实是非常适合0基础的小白同学加入学习的但是具体选择测试还是开发还是要看你个人的兴趣爱好以及学习能力,对哪个感兴趣,哪个能学的会就选择哪个就可以了 平时说起程序员印象中大都是做Java、做前端、做后端&…...
如何加入new bing候补名单
如何加入new bing候补名单 我们都知道现在最新版edges中已经提示我们可以加入new bing候补名单,但国内环境下无法正常加入new bing候补名单,这篇文章讲告诉你如何绕过限制加入new bing候补名单 下载配置 HeaderEditor 插件 下载地址microsoftedge.mic…...
中国天气——西风带环流和寒潮
中国天气——西风带环流和寒潮 一. 西风环流概述 1. 概念 西风带:中高纬度地区平均水平环流在对流层盛行西风,称之为西风带西风带波动:西风带围绕极涡沿纬圈运动,平均而言表现为冬季三槽三脊,夏季四槽四脊ÿ…...
2022黑马Redis跟学笔记.实战篇(四)
2022黑马Redis跟学笔记.实战篇 四4.3.秒杀优惠券功能4.3.1.秒杀优惠券的基本实现一、优惠卷秒杀1.1 全局唯一ID1.2 Redis实现全局唯一Id1.3 添加优惠卷1.4 实现秒杀下单4.3.2.超卖问题4.3.3.基于乐观锁解决超卖问题1. 悲观锁2. 乐观锁3. 乐观锁解决超卖问题4.4 秒杀的一人一单限…...
Allegro中如何删除多余D码操作指导
Allegro中如何删除多余D码操作指导 用Allegro做PCB设计的时候,在最后输出生产文件的时候,必须清除多余的D码,不让多余的D码出现在D码文件中,类似下图 如何清除多余D码,具体操作如下 点击Tools点击Padstack...
学生投票系统-课后程序(JAVA基础案例教程-黑马程序员编著-第三章-课后作业)
【案例3-4】学生投票系统 记得 关注,收藏,评论哦,作者将持续更新。。。。 【案例介绍】 案例描述 某班级投票竞选班干部,班级学生人数为100人,每个学生只能投一票。 本任务要求,编程实现一个投票程序&…...
初始化一个列表python
1.初始化递增的list: list1 list(range(10)) #print list1 #[0,1,2,...,9] 2.初始化每项为0的一维数组: list2 [0] * 5 #print list2 #[0,0,0,0,0] 3.初始化固定值的一维数组: initVal 1 listLen 5 list3 [ initVal for i in range(5)] …...
【electron】webview嵌入页面发送消息给父级页面
场景需求: 嵌入页面操作时,通知父级页面 涉及知识点: contextBridge 嵌入页面可使用暴露的对象ipc-message 监听嵌入页面发送的消息webview preload 嵌入页面运行加载的脚本 问题(两种方式) 使用监听ipc-message需…...
Whids:一款针对Windows操作系统的开源EDR
关于Whids Whids是一款针对Windows操作系统的开源EDR,该工具所实现的检测引擎基于先前的 Gene项目构建,并专门设计可以根据用户定义的规则匹配Windows事件。 功能特性 1、为社区提供一款功能强大且开源的Windows EDR; 2、支持检测规则透明化…...
初级调色转档CameraRaw
一级调色 还原-曝光-色彩-细节-质感 修图的范围 整体(掌握基本面板)——局部(曲线)——具象(混色器) 修片最开始的准备工作 看直方图:明暗跟色彩的数据表 分析图片是否存在以下问题: 1.曝光…...
Mybatis源码(3) - Executor执行过程 | 一级缓存 | 二级缓存
0. 前言:1. CachingExecutor#query:1.1. BoundSql:1.2. CacheKey:1.3. 二级缓存:1.4. 一级缓存:2. JDBC过程执行:3. 结果集处理:4. Mybatis的一级缓存、二级缓存区别:0. …...
成为 Seatunnel 源码贡献者保姆级教程
Apache SeaTunnel 是下一代高性能、分布式、海量数据集成平台,已经在 B 站、腾讯云等 100 家公司生产使用。目前处于 incubator 阶段。作为公司内部使用的 ETL 工具,Seatunnel 可以基于已有的 Spark、Flink 计算平台进行数据交换也可以运行在 k8s 平台上…...
MySQL的索引视图练习题
学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:SC (Sno, Cno, Score)…...
【C++ Primer Plus】第四章:复合类型
文章目录4.1 数组C11数组初始化的方法4.2 字符串**cin是如何确定已完成字符串输入呢?****如何每次读取一行字符串输入?****面向行的输入:getline()****面向行的输入:get( )****为什么推荐使用get( ),而不是getline( )呢…...
做外贸,你不能不懂的外贸流程知识
报关是履行海关进出境手续的必要环节之一,涉及两大类:进出境运输工具、物品和货物。由于性质不同,报关手续也有些不同。今天我就为大家详细介绍一下进出口报关的流程,包括出口货物报关的流程,随报关单提交的运费和商业单据&#x…...
日本机载激光雷达测深进展(一)日本启动测量90%沿岸水深项目
海洋地图项目利用航空测深绘制日本90%沿海20m以浅区域,是日本海道协会(JHA)和日本财团的一个联合项目。 迄今为止,只有不到2%的日本沿海水域得到了测绘,严重拖累了在海洋事故、防灾减灾、篮碳以及生物多样性保护等领域…...
MySQL数据库调优————创建索引的原则和索引失效及解决方案
创建索引的原则 建议创建索引的场景 select语句,频繁作为where条件的字段update/delete语句的where条件需要分组、排序的字段distinct所使用的字段字段的值有唯一性约束对于多表查询,联接字段应创建索引,且类型无比保持一致 避免隐式转换 …...
设计师都在看的全球设计网站,你居然还不知道!
设计师需要拥有无限的创意和熟练的技巧,并且对行业的前景和客户的心理有一定的了解。要能达到“陌生化”之前,肯定是有知识储备,专业能力的前提要求,以及创新能力。 今天为大家整理了多个优秀全球设计网站,这些博客内…...
c++:缺省参数,函数重载
今天介绍的是cpp中的缺省参数以及函数重载的知识。 首先我们先看看缺省参数: 缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。 例如&#…...
深度学习算法面试常问问题(二)
X86和ARM架构在深度学习侧的区别? X86和ARM架构分别应用于PC端和低功耗嵌入式设备,X86指令集很复杂,一条很长的指令就可以完成很多功能;而ARM指令集很精简,需要几条精简的短指令完成很多功能。 影响模型推理速度的因…...
美国CPC认证是什么?儿童玩具亚马逊CPC认证审核有哪些问题?
很多卖家都有遭遇listing下架,被要求提供CPC认证报告。这是因为亚马逊有时会加强对儿童产品的审查。本文带大家对CPC认证进行一个全面了解。什么是CPC认证?CPC认证,全称ChildrensProductCertification.是认可实验室,根据产品不同适…...
东莞做网站/seo网上培训课程
Qunit是一个用于JavaScript单元测试的框架。如果你想使用Qunit启动测试,你需要在HTML文件中包含Qunit的脚本文件和样式文件,然后在JavaScript代码中使用Qunit的API来编写测试用例和测试函数。下面是一个简单的HTML文件,使用Qunit测试一个简单的JavaScript函数: <!DOCTYP…...
四川网站建设和优化/巨量引擎app
需求描述: 在工作中,有的时候需要在cmd中进行盘符的切换,以前总有些时候 通过cd来切,就是切换不过去,每次都要进行百度查询,所以,这次就记录下, 留着以后再用。 操作过程:…...
金泉网做网站多少钱/制作网站的步骤是什么
一、xml布局,定义一个按钮(点击获取)和一个ImageView用来装图片xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"android:paddingBottom"dimen/activity_…...
文化传媒公司广告宣传/长春网络推广优化
Linux是支持SSH协议的,如果我们在Windows主机上运行的Xshell无法正常连接Linux主机,则首先要考虑的是不是网络不通,如果网络不通就看一下是不是虚拟机设置的模式不对。 其次,如果网络通着却无法连接,则考虑是不是网卡e…...
wordpress分类排序号/全自动推广软件
被调合约(通过call回调)支持接收以太币的案例: 被调合约(通过call回调)支持接收以太币的案例:pragma solidity >0.4.0 <0.6.0;contract Test001 {// 这个合约会保留所有发送给它的以太币,没有办法返还。// 必须实现Fallback回退函数,才能支持cal…...
淄博营销网站建设公司/做网络推广的公司
/************关于本文档******************************************** *filename: Linux下各类TCP网络服务器的实现源代码 *purpose: 记录Linux下各类tcp服务程序源代码 *wrote by: zhoulifa(zhoulifa163.com) 周立发(http://zhoulifa.bokee.com) Linux爱好者 Linux知识传…...