当前位置: 首页 > news >正文

布隆过滤器原理

布隆过滤器(Bloom Filter)是一种空间效率高、查询速度快概率型数据结构,主要用于判断某个元素是否在一个集合中。它的核心特点是:

  • 判断为“存在”可能是错的(有一定误判率)

  • 判断为“不存在”一定是对的


一、布隆过滤器的基本原理

布隆过滤器是一个**位数组(bit array)多个哈希函数(Hash Functions)**组成的。

1. 初始化

  • 假设有一个长度为 m 的位数组 bit[],初始每一位都是 0

  • k 个不同的哈希函数:hash1, hash2, ..., hashk


2. 添加元素 x

  • x 分别使用 k 个哈希函数,计算出 k 个下标位置:
    hash1(x) % m, hash2(x) % m, ..., hashk(x) % m

  • 将这 k 个位置上的 bit[i] 都置为 1


3. 查询元素 y 是否存在

  • y 同样使用 k 个哈希函数,得到 k 个位置

  • 检查这些位置是否都为 1

    • 如果有任何一个位置为 0:说明 y 一定不在集合中

    • 如果所有位置都是 1:可能存在,但不能百分百确认(可能是其他元素造成了这些位置为 1)


二、示意图(简化)

bit array:   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
添加 "apple" → hash1=3, hash2=7, hash3=1 → 置位:bit[3]=1, bit[7]=1, bit[1]=1bit array:   [0, 1, 0, 1, 0, 0, 0, 1, 0, 0]查询 "apple":
→ 取同样3个位置,如果全是1,返回“可能存在”查询 "banana":
→ 假如 hash 到 bit[1], bit[4], bit[6] → bit[4] 为0 → 一定不存在

三、布隆过滤器的特点

✅ 优点:

  • 空间效率高:相比于用 set/hashset 来存储大量字符串,内存节省非常多

  • 插入、查询速度快:时间复杂度为 O(k)k 是哈希函数数量

❌ 缺点:

  • 可能误判存在误判率可控制,但不能为 0

  • 不能删除元素(除非使用 Counting Bloom Filter)

  • 无法获取元素,只能判断存在性


四、布隆过滤器的使用场景

  1. 防止缓存穿透(判断 key 是否可能存在于数据库中)

  2. 黑名单系统(判断一个 IP 是否可能为恶意)

  3. 网络爬虫去重(判断 URL 是否已抓取过)

  4. 区块链、分布式系统中快速去重或状态判断


五、误判率与参数关系(高级)

布隆过滤器的误判率与以下有关:

  • n:插入的元素个数

  • m:位数组大小

  • k:哈希函数数量

误判率公式近似为:

P=(1−e−kn/m)kP = \left(1 - e^{-kn/m} \right)^k

可以通过这个公式反推设计布隆过滤器所需的 mk 来满足特定的误判率要求。

http://www.dtcms.com/a/273345.html

相关文章:

  • 我的世界模组开发——机械动力的渲染(4)
  • java-io流
  • 对象序列化与反序列化
  • 【PyTorch】PyTorch 自动微分与完整手动实现对比
  • vue3 element plus table 使用固定列,滑动滚动会错位、固定列层级异常、滑动后固定列的内容看不到了
  • Java多线程 V1
  • AIStarter 3.2.0正式上线!高速下载+离线导入+一键卸载新功能详解【附完整使用教程】✅ 帖子正文(字数:约 400 字)
  • 静态路由综合实验
  • WiFi技术深度研究报告:从基础原理到组网应用与未来演进
  • python+django/flask基于微信小程序的农产品管理与销售APP系统
  • CTFshow-PWN-栈溢出(pwn62-pwn64)
  • JAVA面试宝典 -《新潮技术:协程与响应式编程实践》
  • 【Ubuntu】编译sentencepiece库
  • next.js打包后的前端资源如何进行部署和访问,为什么没有index.html
  • Vue响应式原理六:Vue3响应式原理
  • Java 17 新特性解析:密封类与模式匹配的完美协作
  • 01背包问题总结
  • 三维旋转沿轴分解
  • AWS ECS任务角色一致性检查与自动修复工具完全指南
  • LVGL学习笔记-----进度条控件(lv_bar)
  • Java结构型模式---桥接模式
  • 什么?不知道 MyBatisPlus 多数据源(动态数据源)干什么的,怎么使用,看这篇文章就够了。
  • AI探索 | 豆包智能助手跟扣子空间(AI办公助手)有什么区别
  • Ranger框架的发展历程
  • Windows系统DLL、运行库、DirectX等DLL丢失等异常状态
  • 数组的应用示例
  • 【Python进阶篇 面向对象程序设计(7) Python操作数据库】
  • 《测试开发:从技术角度提升测试效率与质量》
  • 《Revisiting Generative Replay for Class Incremental Object Detection》阅读笔记
  • 3D lidar目标跟踪