一篇文章搞懂bitmap算法(待更新)

热点

BitMap算法,一直是面试的热点问题,当然它也是在海量数据进行快速查找,判重,删除的基本方法。

什么是BitMap算法

问题

在介绍bitmap算法之前,先来看下面几个与bitmap有关的问题
1. 给40亿个不重复的int的整数,没排过序的,然后在给一个数,如何快速判断这个数是否在哪40亿个数当中。
2. 在2.5亿个整数中找出不重复的整数(内存不足以容纳这2.5亿个整数)

解法

下面针对第一个问题分别给出不同的解法:

  1. 使用数据结构存储数据,然后进行查找
    对于在无序的数据中查找某个数这个问题,刚入门的同学最先想到的可能就是将这些数据都存入内存中,然后进行查找。查找的方法无非就是遍历或者是使用Hash映射。选用的数据结构差不多就是list、map或者set。
    当然在机器内存足够大的情况下,这些方法都是可以正确运行的。可以计算下将40亿个unsigned int装入内存中需要耗费的空间大小。假设在一个32位的平台上,一个整数也就占用4字节的空间,即40亿个int整数要耗费160亿个字节,大约需要16GB的空间。而且进行数据查找是的时间复杂度和设计合理的hash映射函数也将成为一个难点。
    当然有聪明的同学可能会说,可以使用外存查找的算法啊。完全不用将数据都存入内存中。可以当然可以,但是磁盘IO时间的消费将远高于内存计算所用的时间。所以这样产生的时间成本是无法接受的。
  2. 使用分布式的方法
    对于上面的问题,一些学过大数据或者分布式相关知识的同学可能会想到使用分布式的方法。假设每台机器的单个可用于这个计算任务的内存是2.5个G可以使用7台机器同时对不同部分的数据进行查找,然后将查找的结果进行汇总就可以啦。
    当然,这是一个不错的设计思想,可以在秒级别上处理问题,但它不是一个聪明的方法,单个机器在解决问题时,仍然很暴力。

BitMap算法

通过上面对海量整数查找问题解决方法的讨论可以看出:这些方法都想尽可能的将数据全部装入内存中,然后进行查找。当装不下时,便使用多个机器或者是多次装入。
下面介绍一种新的算法,使用这种算法可以轻松的将40亿个整数装入内存中,且不用耗费太多的内存空间。同时它可以实现快速查找。
bitmap,即用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面可以大大节省。

BitMap算法举例

简单的排序问题

假设要对0-7内的5个元素排序(4,7,2,5,3)。要表示8个数,我们只需要8个bit(1Bytes),可以表示(0-7)。可以先开辟一个8bit空间,并将所有的位置设置为0。如图1所示:
图1
然后可以遍历待排序的5个元素,首先第一个元素是4,那么

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值