原理
BitMap算法的核心思想是用bit数组来记录0-1两种状态,然后再将具体数据映射到这个比特数组的具体位置,这个比特位设置成0表示数据不存在,设置成1表示数据存在。适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存在或不存在的。
原理解析
给定长度是10的bitmap,每一个bit位分别对应着从0到9的10个整型数。此时bitmap的所有位都是0。
把整型数4存入bitmap,对应存储的位置就是下标为4的位置,将此bit置为1。
把整型数2存入bitmap,对应存储的位置就是下标为2的位置,将此bit置为1。
应用
BitMap算在在大量数据查询、去重等应用场景中使用的比较多,这个算法具有比较高的空间利用率。例如垃圾邮件过滤、爬虫url过滤、缓存key、判断某个大集合数组是否存在指定数字等
BitMap 的优缺点
优点:
适合大数据量下的快速去重、快速查询,占用内存空间少。
缺点:
-
数据碰撞。比如将字符串映射到 BitMap 的时候会有碰撞的问题,那就可以考虑用 Bloom Filter 来解决,Bloom Filter 使用多个 Hash 函数来减少冲突的概率。(下一篇介绍)
-
数据稀疏。又比如要存入(10,8887983,93452134)这三个数据,我们需要建立一个 99999999 长度的 BitMap ,但是实际上只存了3个数据,这时候就有很大的空间浪费,碰到这种问题的话,可以通过引入 Roaring BitMap 来解决。