位图(bitmap)
大数据量的处理,使的越来越多的人对bitmap这种数据结构所熟悉。本文简单复习记录一下:
基本思想及优点:
1,位图可以使得我们检索数据可以像数组,hash那么迅速;
2,位图以最少的存储空间来存储更多的数据(通常情况下是用于存储整数);
3,位图以比特bit位来存储数据,因为其最小单元是bit,因此只能存储0或者是1。也就是只能保存两种状态,这通常用于表示一个整数是否存在;
如:把上限不超过8的十进制整数存入bitmap的过程如下:
1,用声明bit数组也就是bitmap的存储空间:byte[] b = new byte[1];并将其置为0也就是将一个byte所对应的8个bit全部置为0;
2,这时候把十进制整数2和3存入bitmap,即通过位运算的算法将初始化的8个比特0 0 0 0 0 0 0 0变为 0 0 1 1 0 0 0 0。注前句提到的位运算的算法为bitmap 映射的关键所在,即该算法科可以向数组寻址那样快速定位。但是本人还是不擅长位运算,具体实现就不列出来了。有兴趣的可以参考jdk中的BitSet。
3,经过上面两个步骤bitmap就已经基本建立。插入操作通过位运算算法将指定的位设置为1,查询操作即通过位运算算法来判断是改位是否为1。
jdk当中的应用,非常方便(不过还是应该研究一下为运算算法),如下:
java.util.BitSet bitSet = new java.util.BitSet(1000);
bitSet.set(99, true);
bitSet.get(99); //检索
几个常见的大数据处理的题目(引用http://blog.csdn.net/v_july_v/article/details/7382693):
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MByte s,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是 1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。