现在有这么一个问题:现存在 20 亿个数字,需要知道哪些数字没有出现在里面.这个问题你可能觉得一个 for 循环就能解决。但是有两个问题,第一个就是for循环效率的问题,第二个问题就是 20 亿个数字需要占据的内存空间,例如要存下 20 亿个数字需要多大空间呢?假设使用 int 存储,在 Java 中,int 占 4 字节,1 字节 = 8 位(1 byte = 8 bit,存放 20 亿个数字则需要:(2000000000*4/1024/1024/1024) ≈ 7.45G左右。
面对上面的问题我们肯定不能使用这种方式存储,而使用我们的 Bit-map 就能很好的解决上面的问题。
Bit-map(位图)
简介
Bit-map 的基本思想就是用一个 bit 位来标记某个元素对应的 Value,而 Key 即是该元素。由于采用了 bit 为单位来存储数据,因此在存储空间方面,可以大大节省。(重点:节省存储空间)
Bit-map 是一种数据结构,可用于记录大量的 0-1 状态,在很多地方都会用到,比如 Linux 内核(如 inode,磁盘块)、Bloom Filter 算法等,其优势是可以在一个非常高的空间利用率下保存大量 0-1 状态。
我们在上面也说过了,假如要对于 20 亿个 int 数据进行处理呢?
- 如果每个数字用 int 存储,那就是 20 亿个 int,占用的空间约为 (2000000000*4/1024/1024/1024)≈7.45G
- 如果能够采用 bit 储,20 亿个数就是 20 亿位,占用的空间约为 (2000000000/8/1024/1024/1024)≈0.233G,那么在存储空间方面可以大大节省。
那么,问题来了,如何表示一个数呢?
上面也说了,Bit-map 用于记录大量的 0-1 状态,每一位表示一个数,0 表示不存在,1 表示存在,这正符合二进制。
下面我们来看看具体存储:

本文介绍位图(Bit-map)算法的基本原理及应用场景,包括排序、查询和去重等操作,展示如何通过位操作极大节省存储空间。
最低0.47元/天 解锁文章
3440

被折叠的 条评论
为什么被折叠?



