位图和布隆过滤器

位图

位图的概念

位图,就是用每一位来存储某种状态,适用于海量数据,数据无重复的场景,通常用来判断某个数据存不存在。
比如,看这个例题:
给40亿个不重复的无符号整形,没排过序,再给一个无符号整形,判断这个无符号整形在不在这40亿个数据里面?
首先,我们先算一下40亿个整形占多大空间?
1GB = 1024MB = 1024 × 1024KB = 1024 × 1024 × 1024byte。
估算的话,1GB约等于10亿字节,那么40亿个无符号整形就占了16个GB,在内存中根本存不下,那怎么比较呢?
我们这个时候就可以用位图,用一个比特位来表示一个无符号整形是否存在,存在即为1,不存在即为0,这样算的话,一个整形32bit,也就是说一个整形就能表示32个数据是否存在,那么16GB / 32 = 512MB,也就是说40亿个不重复的无符号整形只需要512MB就可以表示状态信息。
思路是这么个思路,那怎么把这些数据存进去呢?
按照上面的思路,用一个bit位表示一个数据是否存在,一个char类型就可以表示8个数据是否存在,我们把512MB分为多个char数组,一个数组表示8个数据,当往里面插入数据时,先用这个数据除以数组个数,得到这个数据应该存在哪个数组里,再用这个数据模8(因为一个数组存8个数据),得到这个数据应该在这个数组中的哪个位置,最后把这个位置变成1(表示存在)。

位图的举例应用

在这里插入图片描述
位图的应用:

快速查找某个数据是否在一个集合中
排序+去重
求两个集合的交集、并集等
操作系统中磁盘块标记

布隆过滤器

布隆过滤器的概念

它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。
在这里插入图片描述
插入的数据通过多个哈希函数得到不同的哈希地址,并占用这些不同的哈希地址,这样,可以一定程度上缓解哈希冲突。
在查找过程中,以上图为例,如果一个数据通过不同的哈希函数得到多个不同的哈希地址,再通过地址找到里面的数据,只要有一个地址里面的数据是0,就表示这个数据在表中不存在,但是每个地址里的数据都为1也不能肯定这个数据存在,也可能是其他数据通过哈希函数所映射的位置恰好也在这。
所以,布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可能存在,因为有些哈希函数存在一定的误判。

布隆过滤器的应用场景

布隆过滤器的特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,也就是说它的应用场景容许一定程度的误判,这个误判指的是已经存在的数据可能会误判为不存在,但是不存在的数据是能确定的。
比如说注册新用户时,填写账户昵称,如果这个昵称没有被使用,那么它就一定能注册成功,但是如果显示存在,那么可能这个昵称真的已经被使用了,也可能是误判,那么就可以通过其他方式进行精确查找,虽然还是会进行精确查找,但是布隆过滤器会帮助过滤掉很多没必要进行精确查找的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值