一些优秀的布隆过滤器介绍

在这里插入图片描述

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀

🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。

💡 无论你是刚刚踏入编程世界的新人,还是希望进一步提升自己的资深开发者,在这里都能找到适合你的内容。我们共同探讨技术难题,一起进步,携手度过互联网行业的每一个挑战

📣 如果你觉得我的文章对你有帮助,请不要吝啬你的点赞👍分享💕和评论哦! 让我们一起打造一个充满正能量的技术社区吧!


目录标题

    • 1. 布谷鸟过滤器(Cuckoo Filter)
      • 1.1 起源与核心思想
      • 1.2 原理
        • 1.2.1 哈希算法
        • 1.2.2 存储结构
        • 1.2.3 插入操作
        • 1.2.4 查询操作
        • 1.2.5 删除操作
      • 1.3 优点
      • 1.4 缺点
      • 1.5 实际生产应用
    • 2. 其他优秀的布隆过滤器衍生物
      • 2.1 计数布隆过滤器(Counting Bloom Filter)
        • 2.1.1 原理
        • 2.1.2 优点
        • 2.1.3 缺点
        • 2.1.4 应用场景
      • 2.2 动态布隆过滤器(Dynamic Bloom Filter)
        • 2.2.1 原理
        • 2.2.2 优点
        • 2.2.3 缺点
      • 2.3 布谷鸟过滤器的变种
        • 2.3.1 半排序布谷鸟过滤器(Semi-Sorted Cuckoo Filter)
        • 2.3.2 带计数器的布谷鸟过滤器(Counting Cuckoo Filter)
    • 3. 总结


1. 布谷鸟过滤器(Cuckoo Filter)

1.1 起源与核心思想

布谷鸟过滤器(Cuckoo Filter)是2014年由Bender等人在论文《Cuckoo Filter: Practically Better Than Bloom》中首次提出的一种高效的空间节省型数据结构。它基于布谷鸟哈希算法,旨在解决布隆过滤器存在的误判率较高和不支持删除操作的问题。布谷鸟过滤器的核心思想是通过存储元素的“指纹”信息来代替布隆过滤器中的位数组,从而实现更高效的查询和删除操作。

1.2 原理

1.2.1 哈希算法

布谷鸟过滤器使用两个哈希函数来计算元素的两个可能存储位置。假设元素为x,则:

  • h1(x):计算元素x的第一个存储位置。
  • h2(x) = h1(x) ⊕ hash(fingerprint(x)):计算元素x的第二个存储位置,其中fingerprint(x)是元素x的指纹信息,表示异或操作。
1.2.2 存储结构

布谷鸟过滤器的存储结构是一个桶数组,每个桶可以存储多个指纹信息。每个桶的大小通常为4个指纹信息,这样可以更好地利用CPU的高速缓存。每个指纹信息通常为8位,即1字节。

1.2.3 插入操作
  1. 计算元素x的指纹信息fingerprint(x)
  2. 计算元素x的两个存储位置h1(x)h2(x)
  3. 检查这两个位置是否为空,如果为空,则将指纹信息插入其中一个位置。
  4. 如果两个位置都不为空,则随机选择一个位置,将该位置的指纹信息踢出,并将新指纹信息插入。
  5. 被踢出的指纹信息重复上述过程,直到找到空位或达到最大踢出次数,此时进行扩容操作。
1.2.4 查询操作
  1. 计算元素x的两个存储位置h1(x)h2(x)
  2. 检查这两个位置是否包含元素x的指纹信息,如果包含,则认为元素x可能存在;否则,认为元素x一定不存在。
1.2.5 删除操作
  1. 计算元素x的两个存储位置h1(x)h2(x)
  2. 检查这两个位置是否包含元素x的指纹信息,如果包含,则删除该指纹信息。
  3. 注意:删除操作可能会误删其他元素的指纹信息,导致假阳性问题。

1.3 优点

  • 支持删除操作:布谷鸟过滤器通过存储指纹信息,可以支持删除操作,而不会影响其他元素的判断。
  • 查询性能高:布谷鸟过滤器的查询性能优于布隆过滤器,即使在接近满的情况下也能保持较高的性能。
  • 空间利用率高:在相同的误判率下,布谷鸟过滤器的空间利用率通常比布隆过滤器高。

1.4 缺点

  • 删除不完美:删除操作可能会误删其他元素的指纹信息,导致假阳性问题。
  • 插入复杂度高:随着插入元素的增多,插入操作的复杂度会逐渐增加,因为存在桶满和踢出操作。
  • 存储空间限制:布谷鸟过滤器的存储空间大小必须是2的指数倍,这可能会导致空间利用率的降低。

1.5 实际生产应用

布谷鸟过滤器在实际生产中广泛应用于缓存穿透的防御大数据去重、日志分析等领域。例如,在电商平台中,可以使用布谷鸟过滤器来快速判断用户请求的商品ID是否存在,从而有效减少对数据库的无效访问。

2. 其他优秀的布隆过滤器衍生物

2.1 计数布隆过滤器(Counting Bloom Filter)

2.1.1 原理

计数布隆过滤器通过引入计数器来解决传统布隆过滤器的删除问题。每个位置不再只存储0或1,而是存储一个计数器来记录该位置被多少个元素哈希到过。当插入一个元素时,相应位置的计数器加1;当删除一个元素时,相应位置的计数器减1。

2.1.2 优点
  • 支持删除操作:通过计数器可以支持删除操作,而不会影响其他元素的判断。
  • 误判率低:在相同的位数组长度和哈希函数数量下,计数布隆过滤器的误判率通常比传统布隆过滤器低。
2.1.3 缺点
  • 空间占用大:每个位置需要存储一个计数器,因此占用的内存空间更大。
  • 性能开销大:计数器的维护会带来额外的计算开销,可能会影响性能。
2.1.4 应用场景
  • 流量统计:在流量统计中,计数布隆过滤器可以用来统计某个IP地址或用户ID的访问次数,从而实现流量监控和分析。例如,网络安全系统可以使用计数布隆过滤器来统计每个IP地址的访问次数,及时发现异常访问行为。
  • 推荐系统:在推荐系统中,计数布隆过滤器可以用来记录用户对某个商品或内容的点击次数,从而实现个性化推荐。例如,视频网站可以使用计数布隆过滤器来记录用户对每个视频的观看次数,推荐用户可能感兴趣的视频。

2.2 动态布隆过滤器(Dynamic Bloom Filter)

2.2.1 原理

动态布隆过滤器通过动态调整位数组的大小和哈希函数的数量来适应集合中元素数量的变化。当集合中元素数量增加时,动态布隆过滤器会自动扩容;当集合中元素数量减少时,动态布隆过滤器会自动缩容。

2.2.2 优点
  • 灵活性高:可以根据集合中元素数量的变化动态调整位数组的大小和哈希函数的数量,从而保持较高的性能和较低的误判率。
  • 空间利用率高:通过动态调整位数组的大小,可以更好地利用内存空间。
2.2.3 缺点
  • 实现复杂:动态调整位数组的大小和哈希函数的数量需要复杂的逻辑,实现难度较大。
  • 性能开销大:动态调整位数组的大小和哈希函数的数量会带来额外的计算开销,可能会影响性能。

2.3 布谷鸟过滤器的变种

2.3.1 半排序布谷鸟过滤器(Semi-Sorted Cuckoo Filter)

半排序布谷鸟过滤器通过引入半排序机制来进一步提高空间利用率。每个桶中的指纹信息按照某种规则排序,从而减少指纹信息的碰撞概率。

2.3.2 带计数器的布谷鸟过滤器(Counting Cuckoo Filter)

带计数器的布谷鸟过滤器通过引入计数器来支持删除操作。每个桶中的指纹信息可以存储一个计数器,当插入一个元素时,相应位置的计数器加1;当删除一个元素时,相应位置的计数器减1。

3. 总结

在实际应用中,布谷鸟过滤器是最常用的数据结构之一,原因如下:

  • 支持删除操作:布谷鸟过滤器通过存储指纹信息,可以支持删除操作,而不会影响其他元素的判断。尽管布谷鸟过滤器在删除操作中存在误删风险,但在实际应用中,这种风险通常是可控的。许多应用场景对误删的容忍度较高,或者可以通过其他机制来减轻误删的影响。例如,在缓存系统中,即使误删了一些指纹信息,也不会对整体性能产生重大影响,因为缓存项通常有较短的生命周期。
  • 查询性能高:布谷鸟过滤器的查询性能优于布隆过滤器,即使在接近满的情况下也能保持较高的性能。
  • 空间利用率高:在相同的误判率下,布谷鸟过滤器的空间利用率通常比布隆过滤器高。

尽管布谷鸟过滤器存在误删风险,但与其他变种相比,它在大多数场景下仍然是最优选择。例如:

  • 计数布隆过滤器:虽然支持删除操作,但每个位置需要存储一个计数器,占用更多空间,并且维护计数器会带来额外的计算开销。
  • 动态布隆过滤器:虽然可以动态调整位数组的大小,但实现复杂,动态调整会带来额外的性能开销。

布谷鸟过滤器及其衍生物在实际生产中具有广泛的应用,它们通过不同的机制解决了传统布隆过滤器存在的误判率高和不支持删除操作的问题。选择合适的数据结构需要根据实际应用场景的需求来权衡各种因素,如误判率、性能、空间占用等。希望本文能为你在选择和应用这些数据结构时提供有价值的参考。🌟

乐于分享和输出干货的WXGZG:JavaPersons

在这里插入图片描述

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

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

相关文章

YOLOv8模型pytorch格式转为onnx格式

一、YOLOv8的Pytorch网络结构 model DetectionModel((model): Sequential((0): Conv((conv): Conv2d(3, 64, kernel_size(3, 3), stride(2, 2), padding(1, 1))(act): SiLU(inplaceTrue))(1): Conv((conv): Conv2d(64, 128, kernel_size(3, 3), stride(2, 2), padding(1, 1))(a…

论文解读:Reward criteria impact on the performance ofreinforcement learning...

Reward criteria impact on the performance ofreinforcement learning agent for autonomous navigation 译文: 奖励准则对自主导航强化学习agent性能的影响 摘要: 在强化学习中,主体在环境中的每个时间步采取行动(遵循策略&…

glog在vs2022 hello world中使用

准备工作 设置dns为阿里云dns 223.5.5.5,下载cmake,vs2022,git git clone https://github.com/google/glog.git cd glog mkdir build cd build cmake .. 拷贝文件 新建hello world并设置 设置预处理器增加GLOG_USE_GLOG_EXPORT;GLOG_NO_AB…

搜索二维矩阵 II(java)

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 代码思路: 用暴力算法: class Solution {public boolean searchMatrix(…

基于vite创建的react18项目的单元测试

题外话 最近一个小伙伴进了字节外包,第一个活就是让他写一个单元测试。 嗯,说实话,在今天之前我只知道一些理论,但是并没有实操过,于是我就试验了一下。 通过查询资料,大拿们基本都说基于vite的项目&…

GY302光照传感器模块详解

目录 一、引言 二、功能特点 三、工作原理 四、引脚功能 五、应用场景 六、使用方法 七、总结 一、引言 在当今科技飞速发展的时代,传感器技术在各个领域都发挥着至关重要的作用。光照传感器作为一种能够感知环境光照强度的设备,广泛应用于农业、…

pip install causal-conv1d==1.1.1报错

Building wheels for collected packages: causal-conv1d Building wheel for causal-conv1d (setup.py) ... error error: subprocess-exited-with-error python setup.py bdist_wheel did not run successfully. │ exit code: 1 ╰─> [8 lines of output]…

【WRF后处理】WRF模拟效果评价及可视化:MB、RMSE、IOA、R

【WRF后处理】模拟效果评价及可视化 准备工作模型评价指标Python实现代码Python处理代码:导入站点及WRF模拟结果可视化图形及评价指标参考在气象和环境建模中(如使用 WRF 模型进行模拟),模型性能评价指标是用于定量评估模拟值与观测值之间偏差和拟合程度的重要工具。 本博客…

facebook欧洲户开户条件有哪些又有何优势?

在当今数字营销时代,Facebook广告已成为企业推广产品和服务的重要渠道。而为了更好地利用这一平台,广告主们需要理解不同类型的Facebook广告账户。Facebook广告账户根据其属性可分为多种类型,包括个人广告账户、企业管理(BM&#…

Scala学习记录,全文单词统计

package test32 import java.io.PrintWriter import scala.io.Source //知识点 // 字符串.split("分隔符":把字符串用指定的分隔符,拆分成多个部分,保存在数组中) object test {def main(args: Array[String]): Unit {//从文件1.t…

FreeRTOS综合代码实例---多级菜单的设计

本文介绍一套基于FreeRTOS的综合代码实例,目标是通过模块化的编程方式实现对多种硬件功能的管理。该实例沿用《FreeRTOS综合代码实例-OLED版本》的框架,重点改进为TFT LCD显示,同时保留了多级菜单的实现。项目链接:FreeRTOS综合代…

OpenMP出现Stack Overflow及其疑问

今天对着《OpenMP核心技术指南》练习OpenMP&#xff0c;其中一个案例: #include <stdio.h> #include <math.h> #include <omp.h>#define ITER 100000000void main() {int i;double A[ITER];for (i 0; i < ITER; i)A[i] 2.0 * i;#pragma omp parallel{/…

PYNQ 框架 - 时钟系统 + pl_clk 时钟输出不准确问题

目录 1. 简介 2. PS 时钟计算 2.1 计算框架 2.2 KV260 的参考时钟 2.3 PL_CLK 设置 3. 测试 3.1 Block design 3.2 引脚绑定 3.3 使用 AD2 测量 3.4 调整分频 4. PYNQ 时钟驱动 4.1 源码解析 4.2 查看 PL_CLK 4.3 配置 PL_CLK 5. 总结 1. 简介 ZYNQ MPSoC 具有…

SQL进阶——C++与SQL进阶实践

在C开发中&#xff0c;SQL数据库的操作是开发者常见的任务之一。虽然前面我们已经介绍了如何在C中通过数据库连接执行基本的SQL查询&#xff0c;但在实际项目中&#xff0c;我们通常需要更加复杂和高效的数据库操作。存储过程与函数的调用、复杂SQL查询的编写、以及动态构造SQL…

【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话

文章目录 Zookeeper的架构znode的版本Zookeeper的节点类型层级树状结构znode的不同类型 Zookeeper监视与通知通知的类型 Zookeeper的仲裁Zk的会话会话的生命周期 Zookeeper的架构 Zookeeper的服务器端运行两种模式&#xff1a;独立模式&#xff08;standalone&#xff09;和仲…

Mac安装及合规无限使用Beyond Compare

文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异&#xff0c;并支持文…

[极客大挑战 2019]PHP--详细解析

信息搜集 想查看页面源代码&#xff0c;但是右键没有这个选项。 我们可以ctrlu或者在url前面加view-source:查看&#xff1a; 没什么有用信息。根据页面的hint&#xff0c;我们考虑扫一下目录看看能不能扫出一些文件. 扫到了备份文件www.zip&#xff0c;解压一下查看网站源代码…

毫米波雷达技术:(五)距离-多普勒图谱,以及 FMCW 信号帧结构的设计

(一) 距离-多普勒图谱&#xff08; R a n g e − D o p p l e r F F T Range-Doppler~FFT Range−Doppler FFT &#xff08; 2 D − F F T 2D-FFT 2D−FFT&#xff09;的结果&#xff09;: 1&#xff09;range-bins&#xff08;距离单元&#xff09;&#xff1a; 上述步骤②的…

Mybatis:CRUD数据操作之多条件查询及动态SQL

Mybatis基础环境准备请看&#xff1a;Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之多条件查询 1&#xff0c;编写接口方法 在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。在 BrandMapper 接口中定义多条件查询的方法。 而该功能有三个参数&#xff0c;…

18:(标准库)DMA二:DMA+串口收发数据

DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包4、串口空闲中断DMA接收不定长数据包DMA发送数据包 1、DMA串口发送数据 当串口的波特率大于115200时&#xff0c;可以通过DMA1进行数据搬运&#xff0c;以防止数据的丢失。如…