[算法]布隆过滤器

news2025/1/10 8:58:22

布隆过滤器(Bloom Filter)是一种空间效率很高的概率型数据结构,它可以用来检测一个元素是否在一个集合中。它的特点是高效地插入和查询,但是有一定的误判率(False Positive)。误判率指的是错误地认为某个元素在集合中,但实际上它不在。布隆过滤器不支持删除操作。

布隆过滤器的原理

布隆过滤器由一个很长的二进制向量(数组)和一系列哈希函数组成。下面是它的工作原理:

  • 初始化:创建一个m位的二进制数组,初始值全部为0。
  • 添加元素:当向布隆过滤器添加一个元素时,使用多个不同的哈希函数基于该元素值计算多个索引位置,并将这些位置的值设为1。
  • 查询元素:要判断一个元素是否在集合中,同样使用这些哈希函数计算索引,并检查对应的位是否为1。如果这些位中有任何一位不为1,则元素肯定不在集合中。如果这些位都为1,则元素可能在集合中。
  • 误判率:由于哈希函数的碰撞,不同的元素可能会映射到相同的位置,导致误判。因此,布隆过滤器可能会错误地认为某个元素在集合中。

优缺点

优点:
  • 空间效率和查询时间都远超一般的算法。
  • 不存储元素本身,保护隐私。
缺点:
  • 有一定的误判率。
  • 不支持删除操作。

应用场景

布隆过滤器广泛应用于网络系统、分布式系统中,如:

  • 缓存穿透:防止恶意请求穿透缓存直接访问数据库。
  • 集合重复检测:例如,在大数据场景中,快速检测一个元素是否已经在集合中。
  • 网络系统中的数据包检测:如检测一个数据包是否已经发送过。

实现和配置

在实现布隆过滤器时,需要考虑几个关键参数:

  • 位数组大小(m):越大,误判率越低。
  • 哈希函数个数(k):越多,误判率越低,但性能开销越大。
  • 集合大小(n):预计要插入的元素数量。

布隆过滤器的误判率可以通过以下公式估算:
( 1 − e − k n / m ) k (1 - e^{-kn/m})^k (1ekn/m)k
在实际应用中,根据预期的元素数量和可接受的误判率来选择合适的m和k值。

代码示例

下面是一个使用Go语言实现的布隆过滤器的简单示例。这个例子使用了github.com/willf/bloom库,它是一个流行的Go语言布隆过滤器库。
首先,你需要安装这个库。可以通过以下命令安装:

go get github.com/willf/bloom

然后,你可以使用以下代码创建和操作布隆过滤器:

package main
import (
	"fmt"
	"github.com/willf/bloom"
)
func main() {
	// 创建一个布隆过滤器,预计插入1000个元素,误判率设为1%
	filter := bloom.New(1000, 5) // 这里第二个参数是哈希函数的个数
	// 添加元素
	filter.Add([]byte("hello"))
	filter.Add([]byte("world"))
	// 检查元素是否在集合中
	containsHello := filter.Test([]byte("hello"))
	containsFoo := filter.Test([]byte("foo"))
	fmt.Println("Contains 'hello'?", containsHello) // 输出:Contains 'hello'? true
	fmt.Println("Contains 'foo'?", containsFoo)     // 输出:Contains 'foo'? false
	// 注意:布隆过滤器有一定的误判率,因此containsFoo有可能错误地返回true
}

在这个示例中,我们首先创建了一个布隆过滤器,预计插入1000个元素,并设置了5个哈希函数。然后,我们添加了两个元素:“hello” 和 “world”。之后,我们检查了这两个元素是否在过滤器中,以及一个未添加的元素 “foo”。
布隆过滤器的Test方法用于检查一个元素是否可能存在于集合中。由于布隆过滤器的特性,它可能会返回误判(False Positive),即错误地认为一个元素存在于集合中。但只要返回false,就可以确定该元素不在集合中。

总结

布隆过滤器是一种高效的数据结构,它能够以极小的空间代价快速判断一个元素是否可能存在于一个集合中。在Redis中,通过Redisson这样的客户端库可以方便地使用布隆过滤器。在防止缓存穿透、提高查询效率等方面,布隆过滤器有着广泛的应用。
在使用布隆过滤器时,需要根据实际情况合理配置预期插入数量和错误比率,以达到既定的性能和准确性要求。同时,布隆过滤器的局限性在于它不支持删除操作,且存在一定的误判率。因此,在设计系统时,需要根据业务场景权衡是否使用布隆过滤器,以及如何处理可能出现的误判情况。

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

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

相关文章

STM32之一种双通路CAN总线消息备份冗余处理方法(十三)

STM32F407 系列文章 - Dual-CANBus-ProMethod(十三) 目录 前言 一、现状分析 二、解决思路 1.应用场景网络结构图 2.数据发送流程 3.数据接收流程 4.用到的模块 1.CAN网络速率及时间片分配 2.CAN网络消息ID组成 3.设备节点定义 4.数据格式说明…

内网穿透的应用-Ubuntu本地Docker部署Leantime项目管理工具随时随地在线管理项目

文章目录 前言1.关于Leantime2.本地部署Leantime3.Leantime简单实用4.安装内网穿透5.配置Leantime公网地址6. 配置固定公网地址 前言 本文主要介绍如何在本地Linux系统使用Docker部署Leantime,并结合cpolar内网穿透工具轻松实现随时随地查看浏览器页面,…

VulnHub-Acid(1/100)

参考链接: ​​​​​​​【VulnHub】Acid靶场复盘-CSDN博客 靶场渗透(二)——Acid渗透_ambassador 靶场渗透-CSDN博客 网络安全从0到0.5之Acid靶机实战渗透测试 | CN-SEC 中文网 Vulnhub靶场渗透练习(四) Acid - 紅人 - 博客园 红日团队…

HTML5实现好看的端午节网页源码

HTML5实现好看的端午节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 端午节由来界面1.4 端午节习俗界面1.5 端午节文化界面1.6 端午节美食界面1.7 端午节故事界面1.8 端午节民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 H…

git merge与rebase区别以及实际应用

在 Git 中,merge 和 rebase 是两种将分支的更改合并到一起的常用方法。虽然它们都可以实现类似的目标,但它们的工作方式和效果有所不同。 1. Git Merge 定义:git merge 是将两个分支的历史合并在一起的一种操作。当你执行 git merge 时&…

Matlab APP Designer

我想给聚类的代码加一个图形化界面,需要输入一些数据和一些参数并输出聚类后的图像和一些评价指标的值。 gpt说 可以用 app designer 界面元素设计 在 设计视图 中直接拖动即可 如图1,我拖进去一个 按钮 ,图2 红色部分 出现一行 Button 图…

PyCharm 引用其他路径下的文件报错 ModuleNotFound 或报红

PyCharm 中引用其他路径下的文件提示 ModuleNotFound,将被引用目录添加到系统路径: # # 获取当前目录 dir_path os.path.dirname(os.path.realpath(__file__)) # # 获取上级目录 parent_dir_path os.path.abspath(os.path.join(dir_path, os.pardir))…

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch) 一、前言: 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案,鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置R…

SOLID原则学习,开闭原则

文章目录 1. 定义2. 开闭原则的详细解释3. 实现开闭原则的方法4. 总结 1. 定义 开闭原则(Open-Closed Principle,OCP)是面向对象设计中的五大原则(SOLID)之一,由Bertrand Meyer提出。开闭原则的核心思想是…

【Vue3中使用crypto-js】crypto-js加密解密用法

目录 1、安装crypto2、创建crypto.js文件3、在main.js主文件中进行引用4、页面中进行使用5、实现效果展示6、加密模式解析以及iv参数使用 1、安装crypto npm install crypto-js 如果是在Typescript版本需要再安装 npm install --save types/crypto-js2、创建crypto.js文件 注…

跨界融合:人工智能与区块链如何重新定义数据安全?

引言:数据安全的挑战与现状 在信息化驱动的数字化时代,数据已成为企业和个人最重要的资产之一。然而,随着网络技术的逐步优化和数据量的爆发式增长,数据安全问题也愈变突出。 数据安全现状:– 数据泄露驱动相关事件驱…

简单易用的PDF工具箱

软件介绍 PDF24 Creator是一款简单易用的PDF工具箱,而且完全免费,没有任何功能限制。既可以访问官网在线使用各种PDF工具,也可以下载软件离线使用各种PDF工具。 软件功能 1、PDF转换 支持将多种文件格式(Word、PowerPoint、Exc…

低秩信息收集_0109

系列博客目录 文章目录 系列博客目录LoRA: Low-Rank Adaptation of Large Language Models传统模型适配的局限性:尽管研究界致力于通过添加适配器层或优化输入层激活来提高模型适配效率,这些方法在大型模型和延迟敏感的环境中存在局限。适配器层尽管参数…

C语言与ASCII码应用之简单加密

加密是什么?什么是加密通话?用人话说就是一句有含义的话,经过一定的特殊规则把里面的每个字按照这个规则进行改变,但是这个规则只有你和你想让知道这条信息的人知道 今天我们来用ASCII码编写一个简单加密与解密的程序&#xff0c…

国产3D CAD将逐步取代国外软件

在工业软件的关键领域,计算机辅助设计(CAD)软件对于制造业的重要性不言而喻。近年来,国产 CAD 的发展态势迅猛,展现出巨大的潜力与机遇,正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …

【Linux网络编程】第二十二弹---深入理解 I/O 多路转接之 epoll:系统调用、工作原理、代码演示及应用场景

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、I/O 多路转接之 epoll 1.1、epoll 初识 1.2、epoll 的相关系统调用 1.2.1、epoll_create 1.2.2、epol…

品牌账号矩阵如何打造?来抄作业

在讲究全域营销的当下,目前企业都在各自搭建品牌矩阵号,以提升自己在不同渠道上的影响力。虽然不同平台之间有诸多细节值得深究,但也不妨碍我们先了解如何搭建品牌矩阵。接下来,就让我们一同来了解下该如何搭建。 一、一个主账号 …

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量(时间复杂度和空间复杂度) 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…

scala代码打包配置(maven)

目录 mavenpom.xml打包配置项&#xff08;非完整版&#xff0c;仅含打包的内容< build>&#xff09;pom.xml完整示例&#xff08;需要修改参数&#xff09;效果说明 maven 最主要的方式还是maven进行打包&#xff0c;也好进行配置项的管理 以下为pom文件&#xff08;不要…

用于 EV 牵引电机的先进冷却技术

电动汽车牵引电机的冷却挑战 热管理的重要性 有效的热管理在电动汽车 &#xff08;EV&#xff09; 设计中至关重要&#xff0c;尤其是在牵引电机方面。这些电机将电能转化为机械运动&#xff0c;对车辆的整体性能和效率至关重要。 管理它们的热量至关重要&#xff0c;不仅可以…