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

布谷鸟布隆过滤器和计数式布隆过滤器和原始布隆过滤器相比分别解决了什么问题?

布隆过滤器(Bloom Filter)是一种空间高效的概率性数据结构,用于快速判断一个元素是否属于某个集合,核心特点是存在一定的假阳性误判率(False Positive),但无假阴性(False Negative)。原始布隆过滤器存在一些局限性,而计数式布隆过滤器布谷鸟布隆过滤器分别针对这些局限性进行了优化,解决了不同的问题。

一、原始布隆过滤器的局限性

原始布隆过滤器的基本原理是:通过多个哈希函数将元素映射到一个比特数组(bit array)的多个位置,插入时将这些位置设为 1;查询时若所有映射位置均为 1,则认为元素 “可能存在”(存在假阳性),否则 “一定不存在”。

其核心局限性包括:

  1. 不支持删除操作:由于多个元素可能共享同一个比特位,删除一个元素时无法确定是否可以将对应比特位重置为 0(可能影响其他元素的判断)。
  2. 误判率随元素增多上升:当元素数量接近比特数组容量时,哈希冲突加剧,假阳性率会显著提高。
  3. 空间利用率有限:需要预留较多冗余空间以控制误判率,否则容易因哈希冲突导致性能下降。

二、计数式布隆过滤器(Counting Bloom Filter):解决 “不可删除” 问题

计数式布隆过滤器是原始版本的扩展,核心改进是将比特数组替换为计数器数组(每个位置用多个比特表示计数,如 4 位或 8 位),从而支持元素的删除操作。

解决的问题:
  1. 支持元素删除

    • 插入元素时,将多个哈希映射位置的计数器加 1
    • 删除元素时,将对应位置的计数器减 1
    • 查询时,若所有映射位置的计数器均大于 0,则认为元素 “可能存在”。

    这解决了原始布隆过滤器因比特位共享而无法删除的问题。

局限性:
  • 空间开销更大:计数器(如 4 位)比单个比特占用更多空间(是原始版本的 4~8 倍)。
  • 计数器溢出风险:若同一位置被多次插入,计数器可能超过最大值(如 4 位计数器最大为 15),导致删除时出错。

三、布谷鸟布隆过滤器(Cuckoo Bloom Filter):解决 “误判率高、空间利用率低” 问题

布谷鸟布隆过滤器借鉴了 “布谷鸟哈希” 的思想,核心改进是使用更少的哈希函数(通常 2 个)和动态置换机制,大幅提升空间利用率并降低误判率,同时支持高效的插入、查询和删除。

解决的问题:
  1. 降低假阳性率:原始布隆过滤器依赖多个哈希函数,冲突时多个元素共享比特位,导致误判率较高。布谷鸟过滤器中,每个元素通过 2 个哈希函数映射到两个候选位置,且每个位置只存储一个元素(或其指纹),冲突时通过 “置换” 机制将已有元素 “踢” 到其另一个候选位置,直到找到空位或达到最大置换次数。这种机制减少了元素间的干扰,假阳性率显著降低。

  2. 提高空间利用率:原始布隆过滤器为控制误判率,通常只能使用 50% 左右的空间;而布谷鸟过滤器的空间利用率可提升至 90% 以上(接近理论上限)。

  3. 支持高效删除:每个元素的两个候选位置是确定的,且位置中存储元素的 “指纹”(哈希值的一部分),删除时只需检查两个位置并清除对应指纹即可,无需担心影响其他元素(解决了原始版本删除难题,且比计数式更高效)。

局限性:
  • 存在插入失败风险:当两个候选位置均被占用,且置换链过长(超过最大次数)时,插入会失败(需扩容或拒绝插入)。
  • 实现更复杂:需要设计合理的哈希函数、指纹长度和置换策略,避免死循环。

总结:三种过滤器的核心差异与解决的问题

过滤器类型核心改进解决的核心问题主要局限性
原始布隆过滤器比特数组 + 多哈希函数高效判断元素是否存在(空间效率高)不支持删除、误判率随元素增多上升、空间利用率低
计数式布隆过滤器计数器数组替代比特数组支持元素删除空间开销大、计数器可能溢出
布谷鸟布隆过滤器2 个哈希函数 + 置换机制 + 指纹存储降低假阳性率、提高空间利用率、支持高效删除可能插入失败、实现复杂

扩展:

1、详解布谷鸟布隆过滤器

https://www.cnblogs.com/zhaodongge/p/15067657.html

2、详解计数式布隆过滤器

计数式布隆过滤器(counting bloom filter)Redis实现分析-CSDN博客

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

相关文章:

  • 大模型介绍
  • 基于Springboot的无人之境智能酒店服务平台
  • ICCV-2025 | 大模型驱动的认知导航框架!CogNav:面向目标导航的大型语言模型驱动的认知过程建模
  • java-异常
  • 网络编程:一个 TCP 服务器的简易实现(epoll 版本)
  • 【MySQL学习】关于MySql语句执行、查询、更新流程原理总结
  • C++语法深度剖析与面试核心详解
  • 【Tomcat】基础总结:类加载机制
  • 127、【OS】【Nuttx】【周边】效果呈现方案解析:比较浮点数(上)
  • 计网协议簇具体协议
  • 电路分析基础笔记
  • 【JVM 常用工具命令大全】
  • 从iload_1 iload_2 iadd字节码角度看jvm字节码执行
  • openssl 启用AES NI加速对AES加密性能影响的测试
  • LeetCode:32.随机链表的复制
  • 基于SpringBoot+Vue的旅游系统【协同过滤推荐算法+可视化统计】
  • 前端实现一个星空特效的效果(实战+讲解)
  • 【嵌入式】【科普】软件模块设计简介
  • 【ROS2】ROS2通讯机制Topic常用命令行
  • 欧姆龙NJ系列PLC编程标准化案例
  • 【OpenGL】LearnOpenGL学习笔记25 - 法线贴图 NormalMap
  • UE5 基础应用 —— 09 - 行为树 简单使用
  • 客户端实现信道管理
  • 异常解决记录 | Yarn NodeManager 注册异常
  • 【C#】C# 调用 Python 脚本正确姿势:解决 WaitForExit 死锁与退出检测问题
  • Java25新特性
  • 卷积神经网络CNN-part9-DenseNet
  • 深入浅出密码学第一章课后题(持续更新)
  • Mysql 入门概览
  • 大模型中权重共享的作用?