Bitmap学习笔记

2018-03-05  本文已影响14人  专职跑龙套

关于我的 Leetcode 题目解答,代码前往 Github:https://github.com/chenxiangcyr/leetcode-answers


使用场景:快速查找,删除,判重。
基本思想:使用 bit 数组来表示某些元素是否存在。

问题1:某个文件包含一些电话号码,每个号码为8位数字,统计不同的号码的个数。
分析:
最小号码:00000000
最大号码:99999999
将每个电话号码映射到 bitmap 中不同的位置,将该位置设为1,否则为0。
总共有100,000,000(1亿)个电话号码,每个号码需要一位,即需要长度为1亿的 bitmap。
预估内存空间 100M bit ≈ 12.5M byte

如何申请12.5M的内存空间?
利用数组:int[] bitmap = new int[SIZE];
由于一个 int 占用 4 个字节,因此数组长度 SIZE = 12.5M / 4 = 3M = 3 * 1024 * 1024

如何将某一个号码 num 映射到特定的 bitmap 中特定的位:

// 一个 int 占用 4 个字节,即 32 位。num / 32 可以得到该号码在 bitmap 中的下标位置
int pos = num / 32;

// 1这个数字左移所对应的次数
int mod = num % 32;
int mark = 1<<mod;

// 标记 bitmap 中特定的位置
bitmap[pos] = bitmap[pos] | mark

可以看出:

问题2:在2.5亿个整数中找出不重复的整数的个数。假设内存不足以同时容纳2.5亿个整数。

上一篇 下一篇

猜你喜欢

热点阅读