位图&&布隆过滤器

经典题【给40亿个无符号的且无序的不重复的整数,如何判断一个数是否存在于这40亿个整数之中。】
分析:40亿整数:也就是40*4 = 160亿字节,也就是需要16G的内存才可以将这40亿的整数存储。显然当代我们的计算机并不能达到这样的要求,为了解决这样的问题,我们就要想其它的方法。我们的目的是为了判断一个数是否存在,所以,我们就可以将问题简化,只需要1位表示0和1就可以判断一个数是否真正的存在。所以,40亿的数据如果我们用40亿位来表示,那么也是可以的,那么这样就大约需要500M的内存,如此,就可以完美的解决这个问题了。
上面的解题方法,就是采用位图的方法。


位图

位图:其实是哈希的一种拓展,本质是一种数组,用每个二进制位表示一种状态。即0表示不存在,表示存在。
下面我们举个栗子:
数据:{1,3,7,4,12,16,18,22,13,6}将这个集合存于位图之中。
第一步:判断一个数字应该存储于哪个位图之中。
第二步:判断一个数字应该存储于那个位图的哪一位之中。
第三步:找到该位,将位图的该位置为1。
如下图所示:
位图表示
用途:用来判断某个数字是否存在于一个大的数据之中。
若想看具体的实现代码,请戳->位图代码实现


布隆过滤器(bloom filter)

用途:可以用来判断一个字符串是否存在于一大堆的字符串之中。
布隆过滤器其实是哈希和位图的拓展,为了减少哈希冲突,使用多次哈希函数进行计算哈希地址。
具体代码请移步->布隆过滤器(其实是在位图的基础上实现的)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值