布隆过滤器原理及优缺点详解!

news2025/1/24 14:59:23

文章目录

  • 引言
  • 工作原理
  • 示例展示
  • 优缺点
    • 优点
    • 缺点
  • 使用场景
  • 总结

引言

布隆过滤器(Bloom Filter)是一种概率型数据结构,用于判断一个元素是否属于一个集合。它特别擅长处理大规模数据的快速查找,具有高效的空间利用率和查询速度。下面是布隆过滤器的工作原理、优缺点和使用场景。

工作原理

1、初始化:布隆过滤器初始化时,创建一个长度为m的位数组(bit array),所有位初始化为0,并选择k个独立的哈希函数。

2、添加元素:将一个元素添加到布隆过滤器时,使用k个哈希函数对该元素进行哈希运算,得到k个哈希值(位置)。然后,将位数组中这k个位置的值设为1。

3、检查元素:要检查一个元素是否在布隆过滤器中,同样使用k个哈希函数对该元素进行哈希运算,得到k个哈希值(位置)。检查位数组中这k个位置的值:

如果所有位置的值都是1,则判断该元素可能在集合中。

如果有一个位置的值是0,则判断该元素肯定不在集合中。

示例展示

首先,一个空的布隆过滤器是一个 m 位的位数组,所有位都设置为零,如下所示:

在这里插入图片描述

我们需要使用 k个哈希函数来计算给定输入的哈希值。当我们想要将一个项目添加到过滤器中时,会设置索引h1(x)、h2(x)、… hk(x)处的位,其中索引是使用哈希函数计算的。例如,假设我们想要将“java”输入过滤器,我们使用3个哈希函数和一个长度为10的位数组,初始时所有位都设置为0。首先我们将计算哈希值如下:

h1(“java”) % 10 = 1
h2(“java”) % 10 = 4
h3(“java”) % 10 = 7

注意:这些输出仅用于解释。然后我们会将索引1、4和7处的位设置为1:

在这里插入图片描述

再次,我们想要输入“python”,同样地,我们将计算哈希值:

h1(“python”) % 10 = 3
h2(“python”) % 10 = 5
h3(“python”) % 10 = 4

将索引3、5和4处的位设置为1,如下图:

在这里插入图片描述

现在,如果我们想要检查“java”是否存在于过滤器中。我们将执行相同的过程,但这次是反向的。我们使用h1、h2和h3计算相应的哈希值并检查这些索引处的所有位是否都设置为1。如果所有位都设置为1,我们可以说“java”可能存在。如果这些索引处的任一位为0,则“java”肯定不存在。

为什么说:如果所有位都设置为1,我们可以说“java”可能存在?为什么有这种不确定性。让我们通过一个例子来理解这一点。假设我们想要检查“rust”是否存在,将使用h1、h2和h3计算哈希值:

h1(“rust”) % 10 = 1
h2(“rust”) % 10 = 3
h3(“rust”) % 10 = 7

如果我们检查位数组,这些索引处的位都设置为1,但我们知道“rust”从未被添加到过滤器中。索引1和7处的位是在我们添加“java”时设置的,索引3处的位是在我们添加“rust”时设置的。

在这里插入图片描述

因此,由于计算出的索引处的位已经被其他项目设置,布隆过滤器错误地声称“rust”存在,并生成了一个假阳性结果。根据应用程序的不同,这可能是一个巨大的缺点或者是相对可以接受的。

优缺点

优点

1、空间效率高:相比其他数据结构如哈希表,布隆过滤器的空间利用率非常高。
2、查询速度快:查询操作只需要进行k次哈希运算和k次数组访问,速度非常快。
3、插入操作高效:插入操作同样只需要进行k次哈希运算和k次数组访问,效率高。

缺点

1、误判率:布隆过滤器可能会误判,即可能会错误地认为某个元素在集合中(假阳性),但不会出现假阴性(即不存在的元素被误判为存在)。
2、无法删除元素:标准的布隆过滤器不支持删除操作,因为删除操作可能会影响其他元素的查询结果。不过,可以使用计数布隆过滤器(Counting Bloom Filter)来支持删除操作。
3、哈希函数选择:需要选择合适的哈希函数,以保证哈希值均匀分布,避免过多的冲突。

使用场景

1、网页去重:在搜索引擎中,布隆过滤器可以用于判断网页是否已经被抓取过,从而避免重复抓取。
2、缓存系统:在分布式缓存系统中,布隆过滤器可以用于快速判断某个数据是否在缓存中,从而减少对后端数据库的查询压力。
3、垃圾邮件过滤:在邮件系统中,布隆过滤器可以用于快速判断邮件是否为垃圾邮件,提高过滤效率。
4、数据库查询优化:在数据库系统中,布隆过滤器可以用于快速判断某个记录是否存在,从而减少磁盘I/O操作,提高查询效率。

总结

布隆过滤器是一种简单但非常有效的数据结构,特别适用于大规模数据的快速查找和去重等场景。尽管它有一定的误判率,但在很多应用中,这一点点误判是可以接受的。

编辑:三两肉
来源:猿Java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter应用解析(一)

1、创建项目 1.1 新建 1.2 选择Flutter SDK的位置 1.3 项目名称 英文单词加下划线起名规范,其他默认即可。 1.4 点击运行 发生报错显示我们的JAVA版本不符合 1.5 更改版本设置 1.6 再次启动项目 2、分析页面代码 以下是lib/main.dart的源代码(为了阅…

论文中如何引用羲和的气象数据呢?

最近许多小伙伴在问“论文中使用了羲和能源气象大数据平台的数据,该怎么引用?”今天来给大家解答一下羲和的数据是否可靠以及在论文中的引用格式该如何表示。 羲和数源: 由南京图德科技有限公司自主研发,与美国国家航天局(NASA)、欧洲中期天…

Kubernetes最全详解,这真得收藏

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 上午好,我的网工朋友 随着云计算的快速发展,容器技术成为了现代软件开发不可或缺的一部分。容器化技术,尤其是…

基于Asp.Net的校园报修信息系统的设计与实现---附源码54880

内容摘要 在当今数字化校园的背景下,为了提高校园报修管理的效率和便捷性,设计并实现了一个基于 Asp.Net 的校园报修信息系统。该系统旨在解决传统报修方式中存在的繁琐、低效和不及时等问题,为师生提供一个快速、准确、可靠的报修平台。 本系…

three.js 实现一个心形的着色器

three.js 实现一个心形的着色器 源链接:https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyshader&idheartShader 国内站点预览:http://threehub.cn github地址: https://github.com/z258630027…

天若OCR识别软件 使用教程 软件下载

F4(FnF4)快捷键打开软件,找到要识别的图片,直接选中要识别的区域,可直接识别出来。 如果识别失败,就在右键菜单里,重新识别

数据管理,数据治理,数据中心,数据中台,数据湖都是什么意思,有什么关系?

这些术语都与数据管理和处理相关,但它们各自关注的方面不同。下面我将逐一解释这些概念,并简要说明它们之间的关系。 数据管理 (Data Management) 数据管理是指规划、控制和提供数据及信息资产的过程。它包括了数据的获取、验证、存储、保护以及加工等一…

论文翻译 | LARGE LANGUAGE MODELS ARE HUMAN-LEVELPROMPT ENGINEERS

摘要 通过在自然语言指令上进行调节,大型语言模型(LLMs)已经展现出了作为通用计算机的惊人能力。然而,任务表现很大程度上取决于用于引导模型提示的质量,而最有效的提示通常是由人工精心设计的。受到经典程序合成和人类…

ppt在线生成工具有哪些?6个好用的做ppt软件盘点!

现代PPT作为工作和学习中的信息传递与展示工具,已被广泛使用。在商业或学术场景中,一个具备出色设计和内容的PPT幻灯片,能够最大限度吸引观众目光,同时提升信息传达效果。 然而同样不容忽视的是,传统的制作过程耗费时…

(接口测试)day01接口测试理论 http理论 接口测试流程 接口文档解析

一.接口测试理论 1.接口和接口测试 服务器为客户端开了一个验证接口(接口本质:函数方法)客户端向服务器传送的消息可以相当于函数的参数,接口是用来让客户端传递数据的 接口:相当于开了一个通道 当服务器要给客户端响…

什么!FPGA可以自行二次开发了?

问:什么~FPGA可以自行二次开发了? 答:目前市场上的标准采集卡通常不支持用户自行开发FPGA。但因为应用环境的需要,不仅仅只需要单一的数据采集流程,往往还需要在其中嵌入更复杂的运行和分析逻辑。为了解决这类问题,我…

【原创】java+springboot+mysql疫苗追踪管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

【STM32单片机_(HAL库)】6-6-1【串口通信UART、USART】【蓝牙遥控插座项目】HC-08蓝牙模块实验

通信示意图 1.硬件 STM32单片机最小系统HC-08蓝牙模块 2.软件 bluetooth驱动文件添加main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h" #include "bluetooth.h"int main(void) {…

日本IT|事务与IT营业岗位分别是什么?

在日本IT行业中,“事务”与“IT营业”是两个不同的岗位,它们各自承担着不同的职责。以下是对这两个岗位的详细解释: 一、事务岗位 定义与工作内容: 事务岗位通常指的是处理公司日常事务的职位,这些事务可能涉及IT派遣…

零基础搭建QQ机器人(Ⅱ)

基于 PythonSDK 和 三方协议 开发搭建QQ机器人 [交流QQ群]:QQ官方机器人交流群csdn 文章目录 基于 PythonSDK 和 三方协议 开发搭建QQ机器人接受消息并发送内容接受消息hello后发送语音接受消息hello后发送文件接受消息hello后发送视频接受消息hello后发送骰子/猜拳…

操作系统——位示图

这里写目录标题 前言基础说明相关计算题目一题目二题目三 前言 基础说明 位示图是一种用来表示文件和目录在磁盘上存储位置的图形化表示方法。它通过使用一系列的位来表示文件或目录所占用的磁盘块,从而显示出磁盘上的存储情况。 位示图通常是一个位向量&#xf…

FileInputStream类

目录 1.案例代码: 2.注意细节 3.FileInputStream循环读取 1.案例代码: 准备的txt文件 结果: 如果需要输出原本的字母,强制转换为char即可: 结果: 2.注意细节 (1)如果文件不存在…

RandLA-Net 基于 Tensorflow , 训练自定义数据集

搭建 RandLA-Net 训练环境, 生成自定义训练数据集, 训练自定义数据集. Code: https://github.com/QingyongHu/RandLA-Net 搭建训练环境 Clone the repositorygit clone --depth=1 https://github.com/QingyongHu

Transformer学会有手就行?这本 Transformer自然语言处理实战 书无敌了

在人工智能领域,Transformer架构、大模型是当下最激动人心的话题之一。它们不仅推动了技术的极限,还重新定义了我们与机器交互的方式。Transformer模型最初由Google的研究人员在2017年提出,它是一种基于自注意力机制的深度学习模型&#xff0…

4K变倍镜头特点

1、高分辨率成像: ① 能够呈现清晰、细腻的图像,可清晰快速地识别出被测物体的微小细节、特征以及潜在的缺陷等。例如在芯片外观瑕疵检测中,能清晰地分辨出芯片上的刮痕、污渍、破损、引脚缺失等问题。 ② 相比传统的变倍镜头,在…