哈希一刀流——布隆过滤器详解

布隆过滤器是一种概率型数据结构,用于判断一个元素可能是否存在于集合中,常用于减少数据库查询。它利用多个哈希函数将元素映射到位图,存在误判可能性但能有效节省空间。适用于判断手机号是否已注册等场景,以避免磁盘IO。
摘要由CSDN通过智能技术生成

传统艺能😎

小编是双非本科大二菜鸟不赘述,欢迎米娜桑来指点江山哦

🎉🎉非科班转码社区诚邀您入驻🎉🎉
小伙伴们,打码路上一路向北,彼岸之前皆是疾苦
一个人的单打独斗不如一群人的砥砺前行
这是和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
直达: 社区链接点我


在这里插入图片描述

背景🤔

听名字就有种洋玩意儿的高端感,但实际上用的十分广泛,在校招面经里面看到了有大厂在问布隆过滤器,这里我就说一下我的拙见:

在上手新游戏的时候,你想到一个很有逼格的昵称,但此时系统告诉你 “此昵称已被注册”,这个昵称的唯一性就是运用了哈希的布隆过滤器,他本质上是就是一个 key 的模型,他只需要判断对象是否存在过就行。

按照我之前的思路,这种问题就有两种方法:

方法一:用红黑树或哈希表将所有使用过的昵称存储起来,直接判断该昵称是否在红黑树或哈希表中即可,但红黑树和哈希表最大的问题就是浪费空间,当昵称数量非常多的时候内存当中根本无法 hold 住
方法二:虽然位图只能存储整型数据,但我们可以通过一些哈希算法将字符串转换成整型,比如BKDR哈希算法,我们只需要直接判断位图中该昵称对应的比特位是否被设置即可

虽然但是,使用位图的情况下,256 个字符串排列组合有无限种可能,而映射成 10 个数字的单元上,不论用何种哈希算法都是必定会出现大量冲突的,硬要使用的话,还会面临一个更大的问题:因为不同的字符串被映射成了相同的整型,此时就会出现 误判现象 \color{red} {误判现象} 误判现象,明明没有使用过的昵称也会被判定为已使用,于是 布隆过滤器 \color{red} {布隆过滤器} 布隆过滤器横空出世

概念🤔

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的一种紧凑的、比较巧妙的概率型数据结构,特点是高效地插入和查询

布隆过滤器其实就是位图的一个变形和延申,虽然无法避免哈希冲突,但我们可以想办法降低误判的概率;当一个数据映射到位图中时,布隆过滤器会用多个哈希函数映射到多个比特位,当判断一个数据是否在位图当中时,需要分别根据这些哈希函数计算出对应的比特位,比特位设置了代表着当前状态的默认值,设置为 1 则判定为该数据存在,这一点很类似于我们定义红黑数的节点颜色。

布隆过滤器使用多个哈希函数进行映射,目的就在于降低哈希冲突的概率,一个哈希函数产生冲突的概率可能比较大,但多个哈希函数同时产生冲突的概率可就没那么大了!

举个栗子:假设此时用三个哈希函数进行映射,那么 “张三” 这个昵称被使用后位图中会有三个地方会被置 1,当有人要使用 “李四” 这个昵称时,就算前两个哈希函数计算出来的位置都产生了冲突,但由于第三个哈希函数计算出的比特位的值为 0,此时系统就会判定“李四”这个昵称没有被使用过:
在这里插入图片描述
但是尽管如此,只要数据基数足够大,也会出现误判情况:比如此时又有人要使用 “王五” 这个昵称,虽然 “王五” 计算出来的三个位置既不和“张三”完全一样,也不和“李四”完全一样,但“王五”的三个位置都被“张三”和“李四”占用了,此时系统也会误判 “王五” 这个昵称已经被使用过了:
在这里插入图片描述
😋😋**敲黑板!**😋😋

虽然布隆过滤器判断一个数据存在可能是不准确的,因为这个数据对应的比特位可能被其他一个数据或多个数据占用了;但是布隆过滤器判断一个数据不存在却是准确的,因为如果该数据存在那么该数据对应的比特位都应该已经被设置为1了

误判控制😋

很显然,过小的布隆过滤器比特位很快就会都被设为 1,此时误判率就会飙升,因此布隆过滤器的长度会直接影响误判率,布隆过滤器的长度越长其误判率越小

此外,哈希函数的个数也需要权衡,哈希函数的个数越多布隆过滤器中比特位被设置为1的速度越快,但是布隆过滤器的效率越低,但如果哈希函数的个数太少,也会导致误判率变高

大佬在权衡过其中的关系后得出了一套比较得当的公式:
在这里插入图片描述

k 是哈希函数个数
m 为布隆过滤器长度
n为插入的元素个数
p为误判率。

我们这里可以大概估算一下,如果使用 3 个哈希函数,那么 k 的值就为 3,ln2 的值我们取 0.7,那么 m 和 n 的关系大概是 m = 4 × n ,也就是过滤器长度应该是插入元素个数的 4 倍

  • 106
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 39
    评论
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔乔家的龙龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值