浅谈布隆过滤器

FPGA实现AXI-Stream通信 本文介绍了在FPGA中实现AXI-Stream接口的工业级方案,重点解析了核心协议信号(TVALID/TREADY/TDATA/TLAST)与可选扩展信号,并提供了Verilog最小化实现示例。文章详细阐述了握手协议规则、时序约束方法,以及吞吐量优化技巧(如寄存器切片和双缓冲策略),同时给出了跨时钟域处理的异步FIFO解决方案。此外,还包含验证调试方法(Testbench结构和ILA触发设置)和典型应用场景(视频处理/网络传输),最后提供了资源消耗参考数据。该实现方案严格遵循Xilinx/Intel官方规范 阅读详情

如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加(比如说是20亿个url),我们需要的存储空间越来越大。同时检索速度也越来越慢,上述三种结构的检索时间复杂度分别为O(n),O(log n),O(1)。可能很多人首先想到的会是使用 HashSet,因为 HashSet基于HashMap,理论上时间复杂度为:O(1)。达到了快速的目的,但是空间复杂度呢?字符串通过Hash得到一个Integer的值,Integer占4个字节,那20亿个url字符串理论上需要:20亿*4/1024/1024/1024=7.45G的内存,造成庞大的空间开销,显然这种解决方案是不合理的。但是针对这种问题我们该如何解决那?这便引出了我们这一节的主题布隆过滤器。

何为布隆过滤器

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

布隆过滤器的原理

当然直接通过定义来理解比较抽象,对此我们直接对其原理进行描述。
布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。
当然只是干巴巴的说原理不结合例子也显得很不生动,因此我们还是结合上边的例子进行说明。
首先我们为了能将整个算法过程描述的更加通俗易懂,我们加上一个前提条件:
我们此处使用的HASH算法使用的HASH值是Integer类型的:由于Integer.MAX_VALUE=2147483647,意思也就是任何一个URL的哈希值都会在0-2147483647之间。
首先,我们可以定义2147483647长度的bit数组命名为source,用来存储hash之后产生的所有可能值。存储这个bit数组系统只需要:2147483647/8/1024/1024=256M。
接着,我们分别通过N个HASH函数对这20亿个URL字符串进行处理得到N个不同的HASH值,然后得到20亿个被N个HASH函数处理过的HASH结果对(每个结果对含义N个数字分别对应N个HASH函数的处理结果),然后针对每个结果对(value_1,value_2 ... value_n),我们分别将source的N个位置(value_1,value_2...value_n)置为1,分别对20亿个结果对做如上的处理,我们便得到的一个处理过的source数组,整个过程的处理逻辑如下图所示。
在这里插入图片描述
此时我们整个算法的预处理阶段算式完成。
最后当我们获得一个需要判断的url字符串时我们通过HASH_1、HASH_2…HASH_n等N个HASH函数进行处理得到N个整数(value_1,value_2..value_n)分别判断source[value_i]的值是否是1,如果是则判断下source[value_i+1]的值是否是1,以此类推,直到将N个HASH值判断完毕。中间任何一个位置HASH值不是1,我们便可以得出结论,待判断的url不在url集合中,如果N个HASH判断完毕,均满足条件,我们便可以认为待判断的url在URL集合中。整个过程如下图所示:
在这里插入图片描述

优点

  1. 相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数O(K)。
  2. 散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。
  3. 布隆过滤器可以表示全集,其它任何数据结构都不能

缺点

整个过程并不难理解,但值得注意的是使用该算法判断目标字符串是由一定误算率的。一方面随着存入数据元素的规模越来越越大,误算率也会随之增加。另一方面误算率还和使用的HASH的个数和种类有关,一般来说选用的HASH函数越多,误算率就会越小。

应用场景

1、黑名单 2、URL去重 3、单词拼写检查 4、Key-Value缓存系统的Key校验 5、ID校验,比如订单系统查询某个订单ID是否存在,如果不存在就直接返回。

使用方法

在实际开发中Guava框架提供了布隆过滤器的具体实现:BloomFilter,使得开发不用再自己写一套算法的实现。

  1. 创建布隆过滤器并且传入最大集合的个数,以及期望的误报率
    Funnel:起到管道的作用将各种流和数据类型处理为BoomFilter可处理的类型 expectedInsertions:要处理的数据规模 expectedInsertion:期望的误报率
BloomFilter<String> filter=BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()),100,0.01);

2.初始化urls集合(相当于得到source数组)

//插入url集合String 
urls[]={"vcjmhg.top","example.com","vcjmhg.com","vcjmhg.cn","baidu.com","google.com"};
for(int i=0;i<urls.length;i++){    filter.put(urls[i]);}

3.输入测试url进行测试

//我们添加了七个元素,并且定义了最大字符数量为500,因此我们过滤器会产生十分准确的结果//测试vcjmhg.top是否在urls集合中,以及其准确率
System.out.println("vcjmhg.top是否在urls集合中"+filter.mightContain("vcjmhg.top"));
System.out.println("vcjmg.top的测试准确率:"+filter.expectedFpp());
//测试bing.com是否在urls集合中
System.out.println("bing.com是否在urls集合中:"+filter.mightContain("bing.com"));
System.out.println("bing.com此次的测试准确率:"+filter.expectedFpp());

与其他技术的对比与扩展

回顾布隆过滤器的原理我们发现布隆过滤器的原理与位运算的算法和题目很相似,我们可以尝试和位运算相关的算法结合进行学习。

代码地址

博客代码地址

华为OD机试真题 Java&Go 实现【优雅子数组】【100%通过率】【2022.11 Q4 新题】 如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。 阅读详情

相关推荐

【CATIA的二次开发38】对象Selection交互选择部分方法介绍01

在CATIA V5的VBA开发中,Selection对象是用户交互的核心组件,用于管理用户在图形区域或特征树中的选择操作。Selection 对象是 CATIA VBA 中的中央交互枢纽,充当用户界面与程序逻辑之间的桥梁。它代表当前在图形区域或特征树中被选中的元素集合,是自动化操作的基础。

学习共勉:不积跬步,无以至千里; 不积小流,无以成江海。 1343

【数据结构】布隆过滤器 BoomFilter 的应用场景

对比数据结构的区别,从其空间、时间复杂度下手观察。BoomFilter 特殊的地方在于它在元素存储上做了努力。本文归纳下 BoomFilter 与 HashTable 的区别,进而引出 BoomFilter 善于支持的应用场景。

chenghan_yang的博客 940

微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库

本文介绍了微信小程序集成蓝牙打印机时中文乱码问题的解决方案。由于打印机通常仅支持GBK/GB2312编码,而小程序使用UTF-8,导致中文显示异常。通过引入轻量级iconv-lite库进行编码转换,可高效解决该问题。文章详细说明了从库安装、编码转换到蓝牙发送的实现步骤,并提供了完整代码示例。关键注意事项包括编码验证、分段发送和兼容性测试。该方法经实际验证,能有效保障中文打印的准确性,适用于零售、物流等场景。

canglingyue的专栏 1310

Guava布隆过滤器(boomfilter)使用简介

1 布隆过滤器简介 布隆过滤器是一种空间利用率较高的概率型数据结构,用来测试一个元素是否在集合中。但是存在一定可能,导致结果误判。即元素不在集合中,查询结果却返回元素在集合中。 布隆过滤器一些的性质 与哈希表不同,布隆过滤器是一个大小固定的过滤器,可以通过任意大的数字来描述集合大小 添加一个元素到集合中永远不会添加失败,但误报率会随着添加元素数量的增多逐渐上升,直到集合中所有位都设置位1 查询一...

Revivedsun的专栏 1万+

基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,通过建立PMSM非线性状态空间模型,设计IOL控制器将系统转化为线性输入-输出映射。文章包含系统原理推导、Simulink建模步骤、参数整定方法和仿真结果分析,验证了IOL在高动态、宽速域工况下的优越性能(转矩误差降低90%)。最后提出了工程实现要点和扩展应用方向,为开发高精度电机驱动系统提供了实用指导。

xiaoheshang_123的博客 304

农业无人机:无人机图像处理_(8).遥感图像处理与分析

遥感图像处理与分析在农业无人机技术中具有重要作用,通过图像预处理、特征提取、分类与分割、目标检测等技术,可以实现对农田的精细管理、作物监测、病虫害预测等应用。本节详细介绍了这些技术的基本概念、常用方法和具体实现,希望对您在农业无人机图像处理方面的学习和应用有所帮助。

zhubeibei168的博客 1336

聊聊布隆过滤器

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是高效的插入和查询,而且非常节省空间,缺点是hash 碰撞造成的误识别率和删除困难。一般使用较多的场景就是避免缓存穿透!

cj_eryue的博客 1613

嵌入式软件工程师面试题目整理(一)

文章目录嵌入式软件工程师面试题目整理(一)Arm有多少32位寄存器?Arm2440和6410有什么区别CPU,MPU,MCU,SOC,SOPC联系与差别上拉&下拉&高阻态串口协议讲一讲RS232和RS485通讯接口有什么区别IIC时序图画一下,IIC有哪些状态,给一个字节,将它发送出去。IIC有什么注意事项?有没有用I/O模拟IIC,如果有需要注意什么?为什么2440的内存起始地址是3后面7个0呢?为什么6410的内存起始地址是5后面7个0呢?内存管理有什么看法?(MMU)锁有哪些?有什么注

嵌入式与Linux那些事的博客 7883

bloom filter算法

bloom filter算法

朝着梦想 渐行前进 2848

原理之(〇)3D Gaussian Splatting 数学原理与推导

3D Gaussian Splatting源于EWA的理论基础,本文重点从EWA模型出发,详细推导3D GS中的数学原理,加深对鱼眼相机畸变场景下的理解。

scott198512的博客 4158

电子凸轮追剪算法深度解析:2500字图解+代码实战

工艺需求:在物料连续运动过程中完成精准切割核心矛盾:切割瞬间刀具与物料必须绝对同步传统方案:机械凸轮(结构复杂,调整困难)现代方案:电子凸轮(柔性可调,精度更高)

QQ_778132974的博客 1112

布隆过滤器

1、介绍 布隆过滤器(boomFilter)的出现是为了解决“如何在海量(例如10亿无序、不定长、不重复)元素中,快速判断一个元素是否存在?”。这样正好就可以解决缓存穿透问题,在缓存前面再加入布隆过滤器,key存在则访问缓存。 2、使用(guava的实现) 引入jar包 <dependency> <groupld>com.google.guava</groupId> <artifactId guava</artifactId> <ver

FanGer的博客 381

rk3399开发环境的介绍

由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统性的介绍,尽可能的涵盖所有内容。

朝气蓬勃 711

浅谈布隆过滤器和HyperLogLog

BitMap、BitSet、布隆过滤器、HyperLogLog 区分

creaylei的小花园 1117

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

浅谈一下布隆过滤器的设计之美

计数过滤器(Counting Bloom Filter)是布隆过滤器的扩展,标准 Bloom Filter 位数组的每一位扩展为一个小的计数器(Counter),在插入元素时给对应的 k (k 为哈希函数个数)个 Counter 的值分别加 1,删除元素时给对应的 k 个 Counter 的值分别减 1。元素 x 映射到位数组的第0位,第4位,第7位,元素y映射到数组的位数组的第1位,第4位,第6位。同时,哈希函数的个数也需要考量,哈希函数的个数越大,检索的速度会越慢,误判率也越小,反之,则误判率越高。

2301_76936922的博客 855

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

浅谈布隆过滤器(Bloom Filter)

布隆过滤器的介绍与项目实战

lvhao123456789的博客 1299

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

布隆过滤器速度_浅谈布隆过滤器

首先在开始之前我们先考虑一个问题,如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?如果想判断一个元素是不是在一个集合里,一般思路的是将集合中所有元素保存起来,然后进行遍历比较。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都可以用于解决该类问题。但是随着集合中元素的增加(比如说是 20 亿个 url),我们需要的存储空间越来越大。同时检索速度也越来越慢。可能很多人...

weixin_34116482的博客 320

浅谈redis的HyperLogLog与布隆过滤器

转自:https://www.cnblogs.com/chianquan/p/9505694.html 首先,HyperLogLog与布隆过滤器都是针对大数据统计存储应用场景下的知名算法。 HyperLogLog是在大数据的情况下关于数据基数的空间复杂度优化实现,布隆过滤器是在大数据情况下关于检索一个元素是否在一个集合中的空间复杂度优化后的实现。 在传统的数据量比较低的应用服务中,我们...

bushcat2015的博客 569

浅谈布隆过滤器Bloom Filter

先从一道面试题开始: 给A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。 这个问题的本质在于判断一个元素是否在一个集合中。哈希表以O(1)的时间复杂度来查询元素,但付出了空间的代价。在这个大数据问题中,就算哈希表有100%的空间利用率,也至少需要50亿*64Byte的空间,4G肯定是远远不够的。 当然我们可能想到...

weixin_30739595的博客 164

OI视角浅谈布隆过滤器

简要谈及布隆过滤器 Preface 不负责的出题人扔了一道5e5,2M卡内存的题,标算布隆过滤器,然而std自己用std::set 70M碾过去了。 没学OI时候草草看过这个,不过忘得差不多了。 今天自己考试时候写的假布隆过滤器在$10^5$时候都会有10来个误判(而且这空间怎么卡啊)。 网上的资料大抵都是工程向,这里从OI角度随意谈谈布隆过滤器吧。 所谓“布隆过滤器...

weixin_30849403的博客 128

C+学习——浅谈位图与布隆过滤器

1.位图 所谓位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。 题目: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快 速判断一个数是否在这40亿个数中。 【腾讯】 思路: 这道题首先要判断40亿个不重复的无符号整数究竟占多大的内存,因为太大的内存我们无法加载到现有的计算机中。 一个整数是4个字节,40亿个整数就...

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 673
上一篇: MYSQL之查询篇
下一篇: MYSQL之修改篇
vcjmhg
博客等级 码龄11年 27粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值