《算法与数据结构之布隆过滤器》

上一节讲到了位图的原理,并陈述了公司的OA系统如何运用该原理去快速查找某位员工。但我们只考虑了员工编号为纯数字组合的情况,将纯数字映射到BitMap上当然很容易。当员工编号为字母和数字的组合时,那么此时该如何进行映射,老的方法肯定行不通;亦或员工编号的数值范围扩大了,继续使用位图会不会造成内存空间的浪费?
位图显然是不适合上述的场景,我们需要在位图上作些变更,布隆过滤器(Bloom Filter)就为了解决上述问题而出现的。对于员工编号是数字和字母组合的情况,可以使用哈希函数计算出每个员工编号的哈希值K,并将BitMap[K]的值设为1。但这样会存在哈希冲突(两个不同的编号哈希运算后的哈希值一样),因为即便是业界较为著名的MD5、SHA也会存在哈希冲突,更何况是我们自己设计的哈希算法。
既然无法实现完美无冲突的哈希函数,我们提出一种改进的思路,设计出多个哈希函数(比如:3个),用3个不同的哈希函数对同一个员工编号求哈希值(得到K1、K2、K3),并将BitMap[K1]、BitMap[K2]、BitMap[K3]都设为1,言外之意只有这三个值都为1,才表示该员工的存在。但这种解决方案又容易引起误判的出现,具体情况可见下图分析。
映射冲突

我们假设,华为有员工HuaWei123HuaWei457HuaWei654已经离职,从上图可看出HuaWei654经过Hash1、Hash2、Hash3三次运算后,得到的值其实是HuaWei123HuaWei457两个编号哈希运算结果的组合;实际上BitMap中BitMap[4]、BitMap[9]、BitMap[11]并不是公司内部真实存在的员工编号运算出来的结果,因此误判就产生了。虽然哈希函数解决了字母数字组合员工编号的映射问题,同时也带了一定的误判。也即经过布隆过滤器判断存在的元素有可能不存在,但判断不存在的元素就一定不存在。

针对误判的情况,可以使用如下的方式来降低误判率,但要做到完全避免是不可能的。

 1、增加哈希函数的个数及复杂度。
 2、增加BitMap的长度,比如只要长度为10000的BitMap就可以了,但是我们可以将其长度扩充2倍,使得经过哈希运算后的哈希值更发散地分布在BitMap上。
 3、实现BitMap动态扩容的功能,当BitMap中存储的元素增加时,也即是BitMap中置“**0**”率降低了,那么此时应该适当地对BitMap进行扩容。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值