位图

来源:互联网 发布:apache html 编辑:程序博客网 时间:2024/05/04 00:16

位图(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,都是一样的道理。



原创粉丝点击