布隆过滤器

目录

    • 初识布隆过滤器
    • 使用布隆过滤器
    • 布隆过滤器如何实现
    • 布隆过滤器使用场景
    • 布隆过滤器存在问题
    • 解决策略

初识布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

使用布隆过滤器

在Java中可以使用第三方库如Guava来实现布隆过滤器。

在guava包中的BloomFilter源码中,构造一个BloomFilter对象有四个参数:

  • Funnel funnel:数据类型,由Funnels类指定即可
  • long expectedInsertions:预期插入的值的数量
  • fpp:错误率
  • BloomFilter.Strategy:hash算法

使用Guava库实现布隆过滤器的示例代码如下:

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;public class BloomFilterExample {public static void main(String[] args) {// 创建布隆过滤器,设置预计插入的元素数量和误判率BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.unencodedCharsFunnel(), 1000, 0.01);// 添加元素到布隆过滤器bloomFilter.put("element1");bloomFilter.put("element2");// 判断元素是否存在于布隆过滤器中boolean exists = bloomFilter.mightContain("element1");System.out.println("Element exists: " + exists);}
}

布隆过滤器的预期误判率fpp是根据实际需求来设置的,一般情况下是根据对误判率的容忍度来确定的。误判率越低,布隆过滤器的空间和资源消耗也会增加。


布隆过滤器如何实现

BloomFilter 是由一个固定大小的二进制向量或者位图(bitmap)和一系列映射函数组成的,在初始状态时,相当于一个大型位数组,它的所有位都被置为0,

  • 插入元素,经过n个hash函数散列映射到位图中的n个点,并置为1
  • 查询元素,元素根据函数映射的n个点,检测n个点是否为1,有一个为0则证明元素不存在

所以可以判断元素一定不存在
判断某样东西一定不存在或者可能存在

原因在于,它通过多个hash函数进行散列,渐渐的数组上的1位越来越多,后续查询的元素映射的bit位也是1,一个bit位被多次映射为1,所以就不能判断这个元素是否存在

布隆过滤器的优点:

  • 时间复杂度低,增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)
  • 保密性强,布隆过滤器不存储元素本身
  • 存储空间小,如果允许存在一定的误判,布隆过滤器是非常节省空间的(相比其他数据结构如Set集合)

布隆过滤器的缺点:

  • 有一定的误判率,但是可以通过调整参数来降低
  • 无法获取元素本身
  • 很难删除元素

布隆过滤器使用场景

缓存穿透

应对缓存穿透问题,我们可以使用布隆过滤器。
一个常见的缓存使用方式:读请求来了,先查下缓存,缓存有值命中,就直接返回;缓存没命中,就去查数据库,然后把数据库的值更新到缓存,再返回。
在这里插入图片描述


大量数据判断是否存在

这个中间层,是不是用HashMap就好了呢?HashMap时间复杂度可以达到O(1),但是因为HashMap数据是在内存里面的,如果大量的数据远超出了服务器的内存就无法使用HashMap,可以使用布隆过滤器来做这个缓冲,因为它只存储映射的位点
在这里插入图片描述


布隆过滤器存在问题

随着插入到位图的key越来越来,哈希碰撞频率也会越来越高,导致它有一定的误判率,可以用来判断元素一定不存在,但是不能保证元素一定存在

解决策略

  1. 调整布隆过滤器的参数:布隆过滤器的参数包括哈希函数的个数和位数组的大小。增加哈希函数的个数和位数组的大小可以降低误判率,但会增加存储空间和查询时间。根据应用场景的需求,可以根据误判率的可接受程度进行调整。
  2. 结合其他数据结构:可以将布隆过滤器与其他数据结构结合使用,以进一步降低误判率。例如,可以使用一个较小的布隆过滤器进行快速的初始过滤,然后对可能存在的元素进行进一步验证,例如使用一个哈希表或数据库进行准确的查询。
  3. 使用多个独立的布隆过滤器:使用多个独立的布隆过滤器,每个布隆过滤器使用不同的参数和哈希函数。当需要判断元素是否存在时,需要通过多个布隆过滤器的判断结果进行综合。这样可以降低误判率,但也会增加存储空间和查询时间。
  4. 添加计数器:在布隆过滤器的基础上,可以为每个哈希函数维护一个计数器,记录元素的出现次数。当判断元素存在时,可以检查所有哈希函数的计数器值,如果存在任一计数器值为0,则判断为误判。
  5. 定期重建布隆过滤器:定期重建布隆过滤器可以清除已经过时的元素,并减少误判率。定期重建的频率可以根据应用场景的需要进行调整。

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

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

相关文章

【排序】快排的优化(三数取中)

三数取中 就是将整个数组分为两半&#xff0c;三个数&#xff08;头、尾、中间&#xff09;的第二大的数字和 left 位置的数字相交换&#xff0c;可以避免排一个有序的数组从而出现单分支树的情况。 如果每次都找了一个最小的值作为基准值&#xff0c;那就会导致这个结点没有左…

具有优异导电性能且抑制了准饱和效应的1200V 4H-SiC沟槽MOSFET

标题&#xff1a;1200V 4H-SiC trench MOSFET with superior figure of merit and suppressed quasi-saturation effect 摘要 本文提出一种具有部分被埋层n区包围的p屏蔽区的优异性能(FoM)1200V 4H-SiC沟槽MOSFET。在准饱和(QS)状态下&#xff0c;埋层n区抑制由p屏蔽区形成的耗…

IPD流程中,TR2评审的内容、评审标准和评审要素

在IPD&#xff08;Integrated Product Development&#xff09;流程中&#xff0c;TR2&#xff08;Technical Review 2&#xff09;评审是项目开发过程中的一个重要里程碑评审&#xff0c;通常在项目的中期进行。TR2评审的目的是对项目的技术进展和实施情况进行评估和审查&…

异地访问Oracle数据库的解决方案:利用内网穿透实现PL/SQL远程连接的建议与步骤

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle ​ 小月糖糖主页 在强者的眼中&#xff0c;没有最…

【C++】特殊类的设计

特殊类的设计 前言正式开始设计一个类&#xff0c;不能被拷贝设计一个类&#xff0c;只能在堆上创建对象设计一个类&#xff0c;只能在栈上创建对象设计一个类&#xff0c;不能被继承设计一个类&#xff0c;只能创建一个对象(单例模式)饿汉模式懒汉模式总结 前言 点进来的同学…

c++ 学习之函数的默认参数

当在C中使用默认参数时&#xff0c;你可以在函数声明中为一个或多个参数指定默认值。这允许你在调用函数时&#xff0c;如果没有为这些参数提供实际值&#xff0c;编译器会使用你提供的默认值。这样可以在不同的情况下使用同一个函数&#xff0c;避免编写多个函数重载。 以下是…

第十一章 CUDA的NMS算子实战篇(上篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

Little Kernel代码学习笔记

目录 虚拟地址转换为物理地址内核启动Multiboot头部结构启动时的寄存器状态real_start段选择子初始化BSS段 页表转换设置CR4、CR3、EFER寄存器设置页表映射 初始化IDT&#xff0c;执行lk_main 虚拟地址转换为物理地址 // start.S#define PHYS_LOAD_ADDRESS (MEMBASE KERNEL_L…

多功能租车平台微信小程序源码 汽车租赁平台源码 摩托车租车平台源码 汽车租赁小程序源码

多功能租车平台微信小程序源码是一款用于汽车租赁的平台程序源码。它提供了丰富的功能&#xff0c;可以用于租赁各种类型的车辆&#xff0c;包括汽车和摩托车。 这个小程序源码可以帮助用户方便地租赁车辆。用户可以通过小程序浏览车辆列表&#xff0c;查看车辆的详细信息&…

npm 卸载 vuecli后还是存在

运行了npm uninstall vue-cli -g&#xff0c;之后是up to date in&#xff0c;然后vue -V&#xff0c;版本号一直都在&#xff0c;说明没有卸载掉 1、执行全局卸载命令 npm uninstall vue-cli -g 2、删除vue原始文件 查看文件位置&#xff0c;找到文件删掉 where vue 3、再…

《基于 Vue 组件库 的 Webpack5 配置》6.将字体库和图片等静态资料,编译后打包至指定文件夹

参考 Rule.generator.filenamepackage.json 的配置如下 module.exports {module: {{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: asset/resource,generator: {// publicPath: assets/imgs/, // filename: imgs/[hash][ext],}},{test: /\.(woff|woff2|eot|ttf|otf)$/i,type: as…

菜鸟教程《Python 3 教程》笔记(1):基本数据类型

菜鸟教程《Python 3 教程》笔记&#xff08;1&#xff09;&#xff1a;基本数据类型 1 基本数据类型1.1 Number&#xff08;数字&#xff09;1.2 String&#xff08;字符串&#xff09;1.3 bool&#xff08;布尔类型&#xff09;1.4 List&#xff08;列表&#xff09;1.5 Tuple…

[Go版]算法通关村第十三关黄金——数字数学问题之数论问题(最大公约数、素数、埃氏筛、丑数)

目录 题目&#xff1a;辗转相除法&#xff08;求最大公约数&#xff09;思路分析&#xff1a;辗转相除法&#xff08;也叫欧几里得算法&#xff09;gcd(a,b) gcd(b,a mod b)复杂度&#xff1a;时间复杂度 O ( n l o g ( m a x ) ) O(nlog(max)) O(nlog(max))、空间复杂度 O (…

探索pytest:Python自动化测试的新境界

在当今的软件开发领域&#xff0c;测试已经不仅仅是一个简单的步骤&#xff0c;而是确保软件质量的核心环节。Python&#xff0c;作为全球最受欢迎的编程语言之一&#xff0c;拥有丰富的测试框架和工具。而在这其中&#xff0c;pytest无疑是最受欢迎和最具影响力的一个。本文将…

ICS PA1

ICS PA1 init.shmake 编译加速ISA计算机是个状态机程序是个状态机准备第一个客户程序parse_argsinit_randinit_loginit_meminit_isa load_img剩余的初始化工作运行第一个客户程序调试&#xff1a;零断点TUI 基础设施单步执行打印寄存器状态扫描内存 表达式求值词法分析递归求值…

Go的基础运行方式和打包

目录 基础运行方式导入路径 打包技巧相关知识点 基础运行方式 // 文件名可以不是main&#xff0c;但包名和入口函数比如是main // main.go package main // 导入包的时候可以直接导入&#xff0c;也可以导入后指定包名&#xff0c; import ("fmt"godemo "githu…

35岁生日一过,突然无法正常工作了

大厂裁员&#xff0c;称35岁以后体能下滑&#xff0c;无法继续高效率地完成工作&#xff1b;体重上涨&#xff0c;因为35岁以后新陈代谢开始变慢&#xff1b;甚至坐久了会腰疼、睡眠困扰开始加重&#xff0c;在众多的归因中&#xff0c;仿佛35岁的到来&#xff0c;会为一切的焦…

Android学习之路(10) setContentView详解

一、简介 setContentView我们在Activity中经常见到&#xff0c;它的作用就是把我们的布局文件放在Activity中显示&#xff0c;下面我们根据源码分析setContentView是如何做到的 二、源码分析 1.两种setContentView 注意Activity的setContentView和AppCompatActivity的setCo…

斯坦福人生设计课——简略笔记

来源&#xff1a;⽐尔博内特 戴夫伊万斯 著图书《人生设计课》 目录 一、认清当下的情况&#xff0c;从四个维度观察自己的人生 二、平衡人生&#xff0c;但不要走入误区 2.1 记录你的“美好时光日志”&#xff1a; 2.1.1 记录内容&#xff1a; 2.1.2 辅助反思的方法&…