布隆过滤器和hashmap

本文介绍了布隆过滤器的基本原理及其应用场景。布隆过滤器是一种基于哈希的数据结构,用于快速判断一个元素是否可能在一个集合中。文章还解释了HashMap的工作原理,包括容量与负载因子的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在这里只是为了怕遗忘做一些简单的记录

布隆表,又被称为布隆过滤器。

应用场景,当数据量过于大时,如果要去判断一条数据在那些数据中是否存在时,是很慢的。这时候,如果要使用最常见的equal方法。相率是很低下的。
这时候才会用上布隆表

布隆表是基于hash的。因为其基于hash,所以就一定不是完全准确的。
布隆表是这么进行运作的,先申请内存,然后将记录的数组中的值都归0。将数据的一个key值(可以是字段,id等等)经过hash计算,放在该数组的某个位置,就讲该位置的数值改为1。

当一个布隆表建立之后,就可以判断该值是否存在,再去服务器中去取数据。
如果在布隆表中不存在,那么一定不存在。如果在布隆表中存在, 也不一定就存在。但是这个几率很低。

布隆表的主要应用有:黑白名单,以及一些判断是否存在的应用中

顺便提一下hashMap中的两个值,因为在计算hash的时候,经常会用到这两个鬼东西。

容量(Capacity)和负载因子Load factor
capactiy就是一个hashMap的大小了。而load factor是其承担负载的比例。
如果map中的元素比例超过load factor,那么capacity自动扩张为原来容量的2倍

hashmap工作原理
- hashmap其实是一个由链表构成的数组,每存入一个值,在计算其hashcode后存入这个数组。
- 因为不同key的hash值是有很小的概率会相同的,这叫做冲突。这时候,就会在该位置向下链下去。
- 如果key的hash相同,并且在equal后发现也相同,那么就直接覆盖
- hashMap在取值的时候,会先根据hash值查找,存在的话,再通过equal方法比较其key值

<think>好的,用户想了解布隆过滤器的原始应用场景。我需要先回顾一下布隆过滤器的基本原理,这样才能更好地解释它的应用场景。 首先,布隆过滤器是一种空间效率很高的概率型数据结构,用来判断一个元素是否在一个集合中。它的特点是有一定的误判率,但不会漏判。也就是说,如果布隆过滤器说某个元素不在集合中,那肯定不在;但如果它说存在,有可能实际上不存在。这种特性适合那些可以容忍一定误判的场景。 接下来,原始应用场景方面,最早的用途可能是在网络数据库领域。比如,拼写检查。早期的文字处理软件需要检查单词是否在字典中,使用布隆过滤器可以快速判断,减少内存占用。但这里要注意,可能需要确认具体的历史应用,比如是否真的是最初的场景之一。 然后是网络爬虫。爬虫需要记录已访问的URL,避免重复抓取。使用布隆过滤器可以高效存储这些URL,节省空间。但有可能误判,导致少数URL被跳过,不过对于爬虫来说,偶尔漏抓可能可以接受,尤其是早期互联网规模还不大时。 还有分布式系统中的应用,比如缓存穿透问题。比如,查询一个不存在的数据,如果每次都直接打到数据库,会造成压力。使用布隆过滤器可以先过滤掉不存在的查询,保护后端存储。不过这个可能是后来的应用,但用户问的是原始场景,可能需要确认。 另外,邮件服务器的垃圾邮件过滤。早期可能需要快速判断发件地址是否在黑名单中,布隆过滤器可以高效处理大量数据。不过同样需要确认是否是原始应用之一。 根据引用内容,用户提供的参考资料里提到布隆过滤器的存储机制、与HashMap的比较,以及定时异步重构的应用。比如引用[1]提到布隆过滤器省空间,引用[3]提到定时重构来更新过滤器。这可能说明在需要频繁更新且对实时性要求不高的场景下使用,比如缓存系统。 所以综合来看,原始应用场景可能包括拼写检查、网络爬虫去重、垃圾邮件过滤等。这些场景共同点是对空间效率要求高,允许一定的误判,且需要快速查询。需要确保这些确实是布隆过滤器最初设计的应用,可能需要参考更早期的资料,但根据提供的引用一般知识,这些应该是正确的。 在回答时,要分点说明每个应用场景,结合布隆过滤器的原理,比如使用位数组哈希函数,节省空间,解释为什么适合这些场景。同时要提到误判率的存在,以及可能的解决方案,如引用[3]提到的定时重构来减少误判的影响。 另外,用户可能还想知道这些场景的具体例子,比如在数据库查询优化中的使用,或者分布式系统中的应用。需要确保回答结构清晰,每个场景有简要说明,并适当引用提供的资料,比如引用[1][3]提到的内容。 最后,生成的相关问题需要围绕布隆过滤器的其他方面,比如原理、优化、与其他过滤器的比较等,如引用[2]提到的布谷鸟过滤器,可以生成相关问题。</think>### 布隆过滤器的原始应用场景介绍 布隆过滤器(Bloom Filter)是一种**空间高效的概率型数据结构**,核心用途是快速判断某个元素是否属于某个集合。其设计初衷是为了解决**空间敏感且允许一定误判率**的场景问题。以下是其原始应用场景的详细说明: --- #### 1. **拼写检查与字典查询** - **背景**:早期计算机内存有限,存储完整词典成本高昂。 - **应用**:用布隆过滤器存储所有正确单词的哈希值,用户输入单词时,通过过滤器快速判断是否拼写错误。 - **原理**:若过滤器返回“不存在”,则单词一定错误;若返回“存在”,可能存在(需二次校验)[^1]。 - **优势**:相比哈希表,节省约90%空间。 --- #### 2. **网络爬虫去重** - **背景**:爬虫需记录已访问的URL,避免重复抓取。 - **应用**:将已抓取URL存入布隆过滤器,新URL通过过滤器判断是否已访问。 - **原理**:过滤器以极低的内存占用(例如1亿URL仅需约100MB)实现高效查询,但可能误判少量新URL为“已访问”(需权衡漏抓率)[^3]。 --- #### 3. **垃圾邮件过滤** - **背景**:邮件服务器需快速拦截黑名单中的发件地址。 - **应用**:将已知垃圾邮件地址存入布隆过滤器,新邮件到达时立即过滤。 - **原理**:通过多哈希函数降低误判率,少量合法邮件可能被误标为垃圾(需结合其他策略)[^2]。 --- #### 4. **数据库查询优化** - **背景**:频繁查询数据库中不存在的键(缓存穿透问题)。 - **应用**:将数据库有效键存入布隆过滤器,查询前先检查过滤器。 - **原理**:若过滤器返回“不存在”,直接拒绝查询,避免无效磁盘访问[^3]。 --- ### 布隆过滤器的核心特性 - **空间效率**:仅需位数组多个哈希函数,存储成本极低。 - **误判率可控**:通过调整数组大小哈希函数数量平衡误判率与空间占用。 - **不可删除元素**:传统布隆过滤器不支持删除,但可通过变体(如计数布隆过滤器)解决。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值