位图Bitmap和布隆过滤器的应用对比

Bitmap 位图映射

 简单的来说Bitmap就是将数值作为数组的下标,数组的每个值的每一位(int正常在32位机上占4个字节,也即是可以32位)非0即1.如果某个数字存在的话就置为1。Bitmap的缺点:每个元素对应一个bit,这种映射的方法比较适合数字的查找,空间复杂度随着最大元素的增大而增加;优点是处理大量数据是可以大大减少空间的消耗,空间复杂度不随着原始集合内的元素个数增加而增加。Bitmap主要是用于大规模数据的查找,并且数据的状态不多。
 具体使用场景可以参考博客:https://www.cnblogs.com/dragonsuc/archive/2019/06/09/10993938.html

布隆过滤器

布隆过滤器的数据结构就是一个bit数组,不需要key,相对于hashmap比较节省空间。布隆过滤器一旦确定之后就不能删除元素。

BF的话感觉上是Bitmap的进阶版,可以用于字符串的查找。其原理是将一个元素经过K个hash函数生成K个点,对应数组中的值置为1 。检索时如果检索到这几个位都是1的话说明这个元素很可能在这个元素中,检索时候有一位是0的话就一定存在此元素。

上面说的“很可能”表达的意思已经很清楚,实际上BF是损失了一定的准确性,来达到空间和时间上的极致优化。BF不用存储key值,能省去很大一部分的空间,并且通过hash函数可以在规定的误判率和bit数组长度内达到查重的理想效果。

布隆过滤器的向量表的大小,对于hash冲突有很大的影响,一般来说,向量表越长,说明hash冲突的概率就越小,但是内存的占用就越大。hashmap主要是占用内存,为了避免高碰撞,一般hash存到一半的数据时就会扩容,浪费空间。布隆过滤的话就是使用多个hash来解决hash冲突较高的问题。在这里插入图片描述

下面简单说一下BF怎样给定错误率的情况下,完成检索的呢?以下是公式的推导:我们假设原始的数集有n个,bit数组的长度为m,hash函数的个数为k:
(1)bit数组中某一位不被设为1的概率为:1 - 1/m
(2)k个hash过后生成k个点,此时不被设为1的概率为:(1 - 1/m)^k
(3)n个原始集合插入结束之后,此时不被设置为1的概率为: (1 - 1/m)^kn,反过来被设置为1的概率为1 - (1 - 1/m)^kn,这就是匹配到全部元素为1的误算率。
通过公式反推:我们可以简单的得出k,m,n这三者之间的关系:
k = m/n * ln2约等于0.7 * m/n

m:布隆过滤器的长度;n:n个元素;k:有k个hash函数;p:误判的概率
计算误判率的公式:p = 1 - (1 - 1/m)^kn
同时还能得出以下结论:要保持P不变的话,比特数和元素的个数需要线性增长;想要降低误判率的话,需要增大m或者减小n。

布隆过滤器的设计:

首先需要用户设定的是希望的误判率以及传入的元素个数,也就是p和n。在这里插入图片描述
利用公式计算出m和k。接下来就是把n个元素放到布隆过滤器中进行查询。
因此从上面的分析可见:BF主要是判断一个元素是否在一个集合中,例如URL查重,过滤垃圾邮件,快速筛选某个名字是否在名单上等等。
布隆过滤器的原理即介绍更具体可见:https://blog.csdn.net/tlk20071/article/details/78336407

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
位图Bitmap)和布隆过滤器(Bloom Filter)都是常用的数据结构,用于处理大规模数据集合,但它们有着不同的应用场景和用途。 位图是一种压缩数据结构,用于快速地判断某个元素是否在集合中。位图的实现方式是将每个元素映射到一个二进制位上,如果该元素存在于集合中,则将对应的二进制位标记为1,否则标记为0。这样,当需要查询某个元素是否在集合中时,只需要查找对应的二进制位即可。由于位图的实现方式非常简单,因此可以快速地进行插入和查询操作,而且占用的空间也非常小,适合处理大规模数据集合。 布隆过滤器也是一种快速判断元素是否存在于集合中的数据结构,但其实现方式与位图略有不同。布隆过滤器使用一组哈希函数将元素映射到多个二进制位上,并将对应的二进制位标记为1。当查询某个元素是否在集合中时,将该元素进行哈希映射,并查找对应的二进制位,如果所有的二进制位都被标记为1,则说明该元素可能存在于集合中,否则可以确定该元素不存在于集合中。布隆过滤器的优点是可以快速地判断一个元素不存在于集合中,而且占用的空间也比较小,但存在误判率的问题。 因此,位图布隆过滤器虽然都可以用来处理大规模数据集合,但它们的实现方式和应用场景有所不同。位图适用于需要快速地判断某个元素是否在集合中的场景,而布隆过滤器适用于需要快速地判断一个元素不存在于集合中的场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值