图解布隆过滤器(Bloom Filter)

布隆过滤器详解

在这里插入图片描述

布隆过滤器(Bloom Filter)是一种空间效率非常高的随机数据结构,由布隆(Burton Howard Bloom)在1970年提出,用于检验一个元素是否属于一个集合。

在这里插入图片描述

具体来说,它可能会错误地认为一个不存在的元素存在(假阳性),但绝不会把一个存在的元素误判为不存在(假阴性),文章后面会详细说明。

在这里插入图片描述

布隆过滤器的基本原理

在这里插入图片描述

布隆过滤器由一个位数组(bit array)和多个哈希函数组成:

  1. 位数组:一个固定长度的位数组(bit array),所有位初始化为0。

在这里插入图片描述

  1. 哈希函数:一组独立的哈希函数,每个函数将输入映射到位数组中的某个位置。

在这里插入图片描述

插入操作

当插入一个元素时,布隆过滤器将该元素通过k个哈希函数计算出k个位置,并将这些位置上的位设置为1。

在这里插入图片描述

例如,假设有三个哈希函数 ( h1, h2, h3 ),插入一个元素 ( x ) 时,将位数组的 ( h1(x), h2(x), h3(x) ) 位置设置为1。

在这里插入图片描述

查询操作

当查询一个元素是否存在时,使用同样的k个哈希函数计算出k个位置,并检查这些位置上的位是否全为1。

  • 如果其中有一个位置为0,则该元素肯定不在(Firm No)集合中。

在这里插入图片描述

  • 如果所有位置都为1,则该元素可能在(Probably Yes)集合中。

在这里插入图片描述

  • 这里博主解释一下为什么说查询的时候结果为 “可能是”(Probably Yes),也就是“假阳性”(False positives)。

在这里插入图片描述

  • 比如说位数组已存储的有ribeyepotato两个值,这时候我们想查询lemon是否存在,于是通过哈希函数组计算哪些位上会存在1。
  • 但在哈希函数组的计算下,不同的k可能会得到相同的v。计算并不存在的lemon却得到了已存在的potato的值,也就是说我们得到的判断是——不存在位数组中的元素 存在!(假阳性出现啦!)

在这里插入图片描述

  • 但是布隆过滤器肯定不会存在假阴性滴!布隆过滤器有误判率,但不会漏报。只要存在,必然会存进位数组,必然能查询到!
    在这里插入图片描述

布隆过滤器的特点总结

1. 空间效率高

  • 布隆过滤器使用一个位数组来表示集合,而不是存储实际的元素。位数组中的每一位只有两种状态:0或1。

  • 通过哈希函数将元素映射到位数组的位置,以避免存储实际的元素,从而大大减少了存储空间的需求。

在这里插入图片描述

  • 多个元素可以共享相同的位,这进一步提高了空间利用率。虽然这会带来假阳性问题,但总体上节省了大量的内存。

2. 查询速度快

  • 查询操作只需要进行几次哈希运算和位数组访问。这些操作的时间复杂度是 (O(k)),其中 (k) 是哈希函数的数量。

在这里插入图片描述

  • 在现代计算机架构中,哈希运算和数组访问都非常快速,因此查询操作可以在常数时间内完成。

3. 插入速度快

  • 插入操作与查询操作类似,也是先通过 (k) 个哈希函数计算出 (k) 个位置,然后将这些位置的位设置为1。
    在这里插入图片描述

  • 由于只涉及位数组的更新和简单的哈希计算,插入操作的时间复杂度也是 (O(k)),且非常高效。

4. 无法删除元素

  • 标准布隆过滤器无法删除元素,因为无法确定某个位是由哪个具体元素设置的。(假阳性)

在这里插入图片描述

  • 由于多个元素可能导致同一个位被设置成1,删除一个元素可能会误删除其他元素的标志位,从而破坏整个过滤器的准确性。
    在这里插入图片描述

5. 假阳性存在

  • 当插入的元素数量增加时,位数组中的1的比例也会增加。这意味着不同元素通过哈希函数映射到同一位的概率增大。

  • 当查询一个不存在的元素时,如果该元素的所有哈希位置都被置为1(由于其他元素的影响),布隆过滤器将返回“可能存在”,即一个假阳性。
    在这里插入图片描述

  • 假阳性率与位数组长度 (m)、哈希函数数量 (k) 和元素数量 (n) 有关。通过选择这些参数,可以控制假阳性率,但无法完全消除。

在这里插入图片描述

  1. 位数组长度 (m):

    • 增大 (m):随着位数组长度的增加,每个哈希位置被设置为1的概率减小,从而降低假阳性率。
    • 减小 (m):如果位数组太短,则不同元素的哈希位置更容易重叠,导致更多的位被设置为1,增加假阳性率。
  2. 哈希函数数量 (k):

    • 优化 (k):假阳性率与哈希函数数量存在一个最优点。当 (k) 过小或过大时,假阳性率都会增加。
    • 过多的哈希函数:增加哈希函数数量会增加每个元素的哈希位置数目,但也会因为重复设置同一位而降效率。
    • 过少的哈希函数:减少哈希函数数量会降低每个元素的哈希位置数目,增加假阳性率。
  3. 元素数量 (n):

    • 增大 (n):随着插入元素数量的增加,位数组中更多的位会被设置为1,导致假阳性率上升。
    • 减小 (n):较少的元素数量意味着位数组中更多的位将保持为0,降低假阳性率。

在这里插入图片描述


布隆适用场景

布隆过滤器适合于那些可以容忍一定误判率的应用场景,但不适合需要百分百准确判断的场景。
在这里插入图片描述
主要用于快速判断元素是否可能存在于一个庞大的集合中,如缓存、垃圾邮件过滤、网页爬虫的URL去重等

1.减少对不存在键的磁盘读取

在这里插入图片描述

2.减少缓存工作量,提高缓存命中率。

在这里插入图片描述

3.识别恶意网址

在这里插入图片描述

4.防止用户使用弱密码

在这里插入图片描述

还有很多应用场景等待列位去体验哈~

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

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

相关文章

Jmeter插件管理器,websocket协议,Jmeter连接数据库,测试报告的查看

目录 1、Jmeter插件管理器 1、Jmeter插件管理器用处:Jmeter发展并产生大量优秀的插件,比如取样器、性能监控的插件工具等。但要安装这些优秀的插件,需要先安装插件管理器。 2、插件的下载,从Availabale Plugins中选择&#xff…

达梦(DM8)数据库表空间的备份与还原(联机备份) 四

一、表空间的备份 1、备份表空间的命令操作 backup tablespace main backupset /home/dmdba/dmdata/DAMENG/bak/full_back_01 ; 2、检查表空间的备份文件 select sf_bakset_check(disk,/home/dmdba/dmdata/DAMENG/bak/full_back_01); 二、表空间的还原 1、修改表空间位脱机…

AI播客下载:Edge of AI (AI最新应用场景和发展趋势)

Edge of AI Podcast 是一个探讨人工智能(AI)最新应用和发展的播客。该播客由Ron Levy主持,他于2023年8月9日接任新主持人。每个节目都会邀请专家分享他们在AI领域的见解和经验,探索最新的应用场景和发展趋势。例如,在第…

PointCloudLib 法线微分算法(Don)分割点云 C++版本

0.实现效果 原始点云 不同尺度上计算法向量 计算出don特征量,并以颜色显示在点云上 可以看出平面中心的点 不涉及到周围点变化的点 特征量比较低,以红色表示 边缘过渡剧烈的点,特征量比较高,以蓝色表示 以Don算法特征量来作为阈值分割点云,可以分割出剧烈变化的点云 欧…

国标GB28181视频汇聚平台EasyCVR设备展示数量和显示条数不符的原因排查与解决

国标GB28181/GA/T1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中,将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级…

Django教程(002):模板语法的使用

目录 1 字符串2 列表3 字典4 列表中是字典5 if语句6 案例:使用爬虫爬取联通新闻并在页面渲染 模板语法本质上:在HTML中写一些占位符,由数据对这些占位符进行替换和处理。模板语法主要是方便对方法返回的数据在前端进行渲染,这些数…

【Proteus仿真】【Arduino单片机】寻迹避障蓝牙遥控小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使LCD1602液晶,L298电机,直流电机,HC05/06蓝牙模块,HCSR04超声波,红外寻迹模块等。 主…

C++初学者指南-2.输入和输出---命令行参数

C初学者指南-2.输入和输出—命令行参数 文章目录 C初学者指南-2.输入和输出---命令行参数1.这是什么&为什么这样?2.如何在C中访问3.转换为std::string、int......4.字符串到数字的转换函数5.命令行参数解析库 1.这是什么&为什么这样? 程序调用后…

说说 SSL 的错误认识和不足之处

最近明月在学习折腾 LNMP 期间无意中建了一个 Typecho 的博客小站,近一周的折腾下来,收获真的不少,致使兴趣也越来越浓了,在升级 LNMP 的时候捎带手的给这个 Typecho 博客也启用了 SSL。并且开启了 memcached 和 OPcache 优化加速…

C++在VS2022开发Windows窗口程序1:第一个win窗口程序

Windows操作系统是由微软公司开发和维护的一系列图形化操作系统的统称。Windows操作系统主要用于个人计算机、笔记本电脑、平板电脑、服务器等设备上。Windows起源于Microsoft-DOS模拟环境,相比于DOS的指令化模式,Windows采用图形化的模式,因…

OkHttp框架源码深度剖析【Android热门框架分析第一弹】

OkHttp介绍 OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Google在Android4.4以后开始将源码中的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofit框架底层同样是使用OKHttp的。 源码传送门 优点: 支持Http1、Http…

[保姆级教程]uniapp设置字体引入字体格式

文章目录 在 UniApp 中设置和引入自定义字体(如 .ttf、.woff、.woff2 等格式)通常涉及几个步骤。 准备字体文件: 首先,你需要有字体文件。这些文件通常以 .ttf、.woff 或 .woff2 格式提供。确保有权使用这些字体,并遵守…

代码随想录算法训练营第二十八天

题目:134. 加油站 暴力方法 暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。 如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。 暴力的方法思路比较简单…

SCI一区TOP|电鳗觅食优化算法(EEFO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年,W Zhao受到自然界中电鳗群体觅食行为启发,提出了电鳗觅食优化算法(Electric Eel Foraging Optimization, EEFO)。 2.算法原理 2.1算…

SSRF漏洞原理与案例分析

一、什么是SSRF漏洞 SSRF (Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请…

Marin说PCB之如何在CST仿真软件中添加三端子的电容模型?--02

小编我在上期文章的结尾给大家留下一个小问题就是:在三端子电容创建模型中间的部分我有说了一句就是:(其中有一个creat reference pin 设置我们也默认不勾选),这个勾选不勾选有啥区别呢?这期文章就来给大家…

提高LabVIEW程序可靠性

​提高LabVIEW程序的可靠性是确保系统稳定运行、减少故障和维护成本的重要措施。以下从多个方面详细分析如何提高LabVIEW程序的可靠性 1. 选择合适的架构 1.1 状态机架构 适用情况: 多状态、多步骤操作。 具体例子:在一个自动测试系统中,…

[汇总] Docker容器详解 Macvlan 创建不同容器独立跑仿真(持续更新中)

一、概念介绍 1.1 什么是macvlan macvlan是一种网卡虚拟化技术,能够将一张网卡(Network Interface Card, NIC)虚拟出多张网卡,这意味着每个虚拟网卡都能拥有独立的MAC地址和IP地址,从而在系统层面表现为完全独立的网络…

mybatisplus字段注入MetaObjectHandler扫描不到我的指定填充字段

使用mybatisplus自带的字段填充策略注入值的时候,发现并没有扫描到我的指定字段。 1. 初始代码 Component Slf4j public class MyMetaObjectHandler implements MetaObjectHandler {private static final String createByFiled "createBy";private stati…

Python数据可视化---pygal模块(基础篇)

pygal模块 安装pygal模块 pygal模块的安装非常简单,只需输入一行pip命令即可 pip install pygal安装完成: pygal模块介绍 pygal官网地址 pygal是Python的第三方库,他的主要功能就是数据可视化,即将数字转化成图表的形式来呈…