图解布隆过滤器(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,一经查实,立即删除!

相关文章

java读取txt,doc,docx文档格式的文本内容

读取txt,doc,docx文档格式的文本内容,通过不同格式,读取逻辑不同,避免造成文本内容乱码问题, 这里需要安装Maven: 版本最好统一 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</v…

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

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

day 65 图论part02 99.岛屿数量 深搜 99.岛屿数量 广搜 100.岛屿的最大面积

99.岛屿数量 深搜 每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 本题思路&#xff0c;是用遇到一个没有遍历过的节点陆地&#xff0c;计数器就加一&#xff0c;然后把该节点陆地所能遍历到的陆地都标记上。 在遇到标记过的陆地节点和海洋节点的时候直接跳过…

Vue3 响应式 reactive全家桶

reactive()与ref()的区别和连续 ref和reactive都是把变量变成响应式对象 reactive底层使用了泛型约束&#xff0c;只能对引用类型使用。 而ref支持所有的类型&#xff0c;ref取值和赋值都需要 .value 而reactive 不需要 对象 <template><div><form><…

【运维】在 Docker 容器中指定 UTF-8 编码:方法与技巧

在 Docker 容器中指定 UTF-8 编码&#xff1a;方法与技巧 在日常开发中&#xff0c;我们常常需要确保应用程序能正确处理各种字符编码&#xff0c;尤其是 UTF-8 编码。在 Docker 容器中运行应用程序时&#xff0c;正确设置字符编码尤为重要&#xff0c;因为容器通常是跨平台、…

达梦(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 是一个探讨人工智能&#xff08;AI&#xff09;最新应用和发展的播客。该播客由Ron Levy主持&#xff0c;他于2023年8月9日接任新主持人。每个节目都会邀请专家分享他们在AI领域的见解和经验&#xff0c;探索最新的应用场景和发展趋势。例如&#xff0c;在第…

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

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

《Linux Vim急救手册:E138错误全攻略与故障排除秘籍》

标题&#xff1a;《Linux Vim急救手册&#xff1a;E138错误全攻略与故障排除秘籍》 引言 在Linux世界中&#xff0c;Vim是编辑器的瑞士军刀&#xff0c;以其轻量级、强大和灵活著称。然而&#xff0c;即使是最熟练的Vim用户也可能遇到令人头疼的E138错误。本文将深入探讨Vim …

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

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

WDF驱动开发-特定于KMDF的技术(三)

支持特殊文件 特殊文件 包括分页文件、转储文件和休眠文件。 如果驱动程序的目标设备是系统可能用于这些文件的存储设备&#xff0c;则驱动程序必须执行以下操作&#xff1a; 调用 WdfDeviceSetSpecialFileSupport 以启用或禁用对每种类型的特殊文件的支持。 默认情况下禁用每…

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

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

什么野指针(c++)

野指针定义 野指针&#xff08;Wild Pointer&#xff09;是指向不确定位置或者非法地址的指针。当一个指针指向的内存被释放后&#xff0c;如果没有将其设置为NULL&#xff0c;那么这个指针就变成了野指针。使用野指针会导致未定义行为&#xff0c;可能引发程序崩溃或数据损坏…

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

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

grafana Not saving new dashboard due to restricted database access

报错 grafana 容器日志报错 logger=provisioning.dashboard t=2024-06-21T07:40:54.307719612Z level=warn msg="dashboards provisioning provider has no database write permissions because of duplicates" provider=default orgId=1

数据结构与算法-【算法专项】Hash算法-2(HashMap+设计Hash+Hash应用+Hashmap常用方法)

数据结构与算法-Hash算法-2 5 HashMap&#xff08;又双叒叕提到红黑树动态扩容&#xff09;6 如何设计Hash7 Hash的应用8 HashMap源码&#xff08;又双叒叕&#xff09;构造方法&#xff1a;put方法&#xff1a;get方法&#xff1a;equals方法&#xff1a;containsKey方法&…

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

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

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

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

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

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

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

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