布隆过滤器及其用法

news2024/12/30 1:15:34

1 定义

  布隆过滤器(Bloom Filter, BF)是由Howrad Bloom在1970年提出的一种具有高效时间和空间效率的二进制向量数据结构,用来检测一个元素是不是属于这个集合。注意,布隆过滤器只判断是否出现在集合中,无法给出元素在集合中的具体位置。

1.1 构造布隆过滤器

  关于如何构造布隆过滤器,下面以集合 S = { S 1 , S 2 , S 3 } S=\{S_{1},S_{2},S_{3}\} S={S1,S2,S3}为例进行说明。首先要说明一点,虽然布隆过滤器也需要利用哈希查询算法,但与传统的哈希查询算法不同,布隆过滤器并不存储集合中的具体元素,而是通过多次哈希函数将集合中的元素映射到二进制位串中。一旦集合元素被映射到对应的二进制位,则将对应位置改为1。
在这里插入图片描述
  上述布隆过滤器中,每个位置占1个比特位。如果每个位置改为多个比特位,这样就能表达出的信息。比如如下图所示的计数布隆过滤器。
在这里插入图片描述
注意:一般不对布隆过滤器执行删除元素的操作。

1.2 布隆过滤器查询过程

  在查询过程中,需要计算出相关元素 S i S_{i} Si对应的多个哈希地址,然后检查布隆过滤器中对应的位置上是否全部为1,若全都为1,则 S i S_{i} Si可能在布隆过滤器上(被称为假阳性问题);若不全为1,那么元素 S i S_{i} Si一定不在布隆过滤器上。

1.3 优点

  布隆过滤器的优点主要有以下几点:

  • 时间复杂低。无论是插入还是查询操作,布隆过滤器的时间复杂度均为 O ( k ) O(k) O(k),其中, k k k为哈希函数的数量。
  • 保密性好。布隆过滤器中并不保存元素的具体数值。
  • 占用空间小。

  而布隆过滤器的缺点主要为:存在误判率。当两个不同的值却能产生相同的哈希值时,布隆过滤器无法确定查询元素是否真的存在集合中。为了尽量降低误判率,布隆过滤器中一般都设置多个哈希函数。

2 python中使用布隆过滤器

2.1 安装包

  python中实现布隆过滤器的第三方包很多,这里使用的是pybloom-live (pybloomfiltermmap等包在Windows上安装遇到报错,无法解决)。

pip install pybloom_live
2.2 简单使用案例
from pybloom_live import BloomFilter

bf=BloomFilter(capacity=100000,error_rate=0.001)
#构建布隆过滤器
for i in range(100000):
    bf.add(i)

#查询元素
for i in [1,200,345,100323,3233232,'hello']:
    print(i in bf)

其结果如下:

True
True
True
False
False
False

补充

  • 什么是缓存穿透?
    缓存穿透是指在高并发场景下,缓存中(包括本地缓存和Redis缓存)的某一个Key被高并发的访问没有命中,此时会回数据库中访问数据,导致数据库并发的执行大量查询操作,对其造成巨大的压力。
    使用布隆过滤器可以解决缓存穿透的问题。比如在redis数据库中,先将所有的key都存到布隆过滤器中,当请求进来时,先去过滤器中校验key是否存在,如果不存在直接返回null。

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

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

相关文章

C语言内存函数

目录 memcpy(Copy block of memory)使用和模拟实现memcpy的模拟实现 memmove(Move block of memory)使用和模拟实现memmove的模拟实现: memset(Fill block of memory)函数的使用扩展 memcmp(Compare two blocks of memory)函数的使用 感谢各位大佬对我的支持,如果我的文章对你有…

JavaScript小游戏实现高分榜

之前我们实现了游戏的主体功能,以及恢复之类的功能!本次我们来实现高分榜的功能 功能的需求如下: ● 这个逻辑非常的简单,就是当我们猜对了数字后,跟我们的highscore做比较,如果比highscore高的话&#x…

跨境电商系统对接-进口

一、跨境进口方式 1、一般贸易 指中国境内有进出口经营权的企业进行进出口贸易,货物到港后需要先清关(办理海关申报、查验、征税、放行等手续),然后货主才能提货,一般贸易适合大批量进口商品,公司的鲜奶、…

面试题:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!

文章目录 前言时间片超线程上下文切换切换查看线程调度引起线程上下文切换的因素总结 前言 由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销…

厌烦了iPhone默认的热点名称?如何更改iPhone上的热点名称

你对你默认的热点名称感到厌倦了吗?这篇文章是为你准备的。在这里,你可以了解如何轻松更改iPhone上的热点名称。 个人热点会将你的手机数据转换为Wi-Fi信号。手机上的个人热点使用户能够与其他用户共享其蜂窝数据连接。当你在WIFI网络之外时&#xff0c…

更轻便使用Siri!iOS 17让你用Siri的效率倍增

安装iOS 17后,你可以学习如何连续发出一个接一个的Siri请求。只要你有iPhone 11或iPhone SE第二代或更高版本,你就不需要不断重新激活Siri来提出后续请求。你只需要继续说下去。 Siri聪明的是,它可以了解你所问的要点。例如,你可…

根据中序与后序遍历结果构造二叉树

文章前言:对于中序与后序遍历不是太清楚的小白同学,作者推荐: 二叉树的初步认识_加瓦不加班的博客-CSDN博客 解题思路: 先通过后序遍历结果定位根节点 再结合中序遍历结果切分左右子树 代码实现: //1. pre-order 前…

让照片人物开口说话,SadTalker 安装及使用(避坑指南)

AI技术突飞猛进,不断的改变着人们的工作和生活。数字人直播作为新兴形式,必将成为未来趋势,具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作,提供更具个性化和多样化的互动体验,成为未来的一种趋…

如何轻松正确的写出链表代码?

文章来源于极客时间前google工程师−王争专栏。 技巧一:理解指针或引用的含义 指针:存储所指对象的内存地址 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地…

【WIN】双机调试——Net模式

概述:windows 双机调试可以在主页搜索 bcdedit 命令。 参考: Set up KDNET network kernel debugging manually - Windows drivers | Microsoft Learn 双机调试是一个非常有用的技术,方便内核、驱动等调试场景。 本文主要记录个人尝试使用ne…

2023年中国建筑安装行业市场现状分析:占比建筑业总产值8.4%[图]

建筑业是我国经济支柱产业之一。建筑业包括房屋建筑业、土木工程建筑业、建筑安装业、建筑装修装饰和其他建筑业。建筑安装行业是建筑业的一个细分行业,其主要包括线路安装、管道安装、设备安装三个细分行业,具体是指建筑物主题工程竣工后,建…

pg_rman 的编译和使用

一、编译 下载地址: ossc-db/pg_rman: Backup and restore management tool for PostgreSQL (github.com)https://github.com/ossc-db/pg_rman代码由日本电信的运维团队维护。 针对不同的PostgreSQL版本,使用不同的分支编译,我的PG版本试1…

【 构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!】

构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!!! 错误提示信息: Cannot download ZIP distribution from https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3…

Knife4j_接口概述、常用注解详解、搭建swagger项目、功能概述

文章目录 ①. knife4j的概述②. knife4j核心功能③. 从0开始搭建knife4j项目④. 常用注解 - Api④. ApiOperation注解⑤. ApiModelProperty注解⑥. ApiImplicitParam注解⑦. ApiImplicitParams注解⑧. 限制请求方式⑨. 导出离线API文档 ①. knife4j的概述 ①. knife4j是为Java …

C#上位机——根据命令发送

C#上位机——根据命令发送 第一步:设置窗口的布局 第二步:设置各个属性 第三步:编写各个模块之间的关系

【力扣】单调栈:901. 股票价格跨度

【力扣】单调栈:901. 股票价格跨度 文章目录 【力扣】单调栈:901. 股票价格跨度1. 题目介绍2. 思路3. 解题代码参考 1. 题目介绍 设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格…

文献综述|CV领域神经网络水印发展综述

前言:最近接触了「模型水印」这一研究领域,阅读几篇综述之后,大致了解了本领域的研究现状,本文就来总结一下该领域的一些基础知识,以飨读者。 ⚠️注:本文中出现的研究工作均基于计算机视觉任务开展&#x…

Git 学习笔记 | 安装 Git 及环境配置

Git 学习笔记 | 安装 Git 及环境配置 Git 学习笔记 | 安装 Git 及环境配置安装 Git配置 Git查看配置 Git 学习笔记 | 安装 Git 及环境配置 安装 Git 官方网站:https://git-scm.com/ 官网下载太慢,我们可以使用淘宝镜像下载:https://regist…

自学接口测试系列 —— 自动化测试用例设计基础!

一、接口测试思路总结 ❓首先我们在进行接口测试设计前思考一个问题:接口测试,测试的是什么? ❗我们必须要知道,接口测试的本质:是根据接口的参数,设计输入数据,验证接口的返回值。 那么接口…

Fast DDS之Transport

目录 transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。