用 Bitmap 存储大量数据
Bitmap 的核心思想是用元素的值的本身来保存其位置,所以一般要求元素的值不能重复。与之相对应的是一般排序算法没有以上要求,并且一般排序算法使用的是 比较排序 的策略。
例如我们有 list [0, 2, 3, 4, 8, 10, 13, 14, 15, 16, 17, 19, 20, 22, 23],那么我们只需要 24 个 bit 就可以存储这些元素,策略如下:
- 构建一个长度为 24 个 bit 的数组
- 对所有数字做遍历,把 bit 1 插入到 bit 数组中下标与该数字值相等的位置;例如,数字 5 就应该向 bit 数组的第 5 个位置中插入 1,插入后结果是
100000 - 重复上面的操作,直到把所有的数字都插入到 bit 数组中,此时数字保存完毕、并且此时数组中的数字都是有序的,操作完成
下面我们有一个简单的例子
1 | import java.util.*; |
我们执行上面的例子得到以下结果
[0, 1, 3, 4, 5, 8, 12, 13, 15, 18, 19, 20, 22, 23, 24]
1101110010001101001110111
第一行是原始的值,第二行是用位图保存的值。我们发现位图的第 0 位、第 1 位、第 3 位、第 4 位 … 第 23 位、第 24 位上的值都为 1,对应了这些下标所对应的值的存在,可见我们已经成功的把数字保存到了位图之中。
通过仔细的观察我们发现,在上面的例子中我们用一个 int 类型的值就可以保存 15 位大小在 0~30 之间的数字了,事实上一个 int 类型的值最多可以保存 4 * 8 = 32 个连续而不重复的数字,按照这样来算即使是 1 亿个连续而不重复的数字也只需要
100000000 / 32 * 32 / 1024 / 1024 = 94M
即只需要不到 95M 的内存我们就可以存下这些数字。如果我们不使用位图来保存则需要
100000000 * 4 * 8 / 1024 / 1024 = 3052M
差不多是 3 个 G 左右的内存,可见 Bitmap 对内存的节省还是相当夸张的。
本文链接: https://www.nosuchfield.com/2017/10/25/Use-Bitmap-to-store-large-amounts-of-data/
版权声明: 本博客所有文章均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!