关于bitmap结构的大数据场景应用

参考文献:
http://blog.csdn.net/hguisu/article/details/7880288
http://blog.csdn.net/xiaoliangsky/article/details/38473595?utm_source=tuicool


给定一个文件,里面包含40亿个整数,写一个算法找出文件中不包含的一个整数,假设你有1GB的内存可以用。如果只有10MB 的内存呢?

解析:引出bitmap结构。

对于40亿个整数,如果直接用int数组来表示的话,需要40亿*4*8B=40*10^8*4B=16GB,超出了内存要求。


这里我们使用bitmap结构去解决。

bitmap的主要思想是一bit位表示一个整数,比如1个Byte有8位,那么每一位表示一个数的话,就可以表示8个数,那么一个int类型,4个字节,32位就能表示32个数。本来表示32个整数需要32个int,则32*4=128个字节,现在表示32个字节只需1个int类型即可。


那么如题,40亿个整数需要40*10^8=40*10^8 bit=0.5GB,  这样是满足题目的要求的。


举例,我们现在用一个长度为1000的int型数组。比如我要存30000,首先计算它在第多少个int中,再计算它会落到该int32位的哪一位中?分别30000/32,30000%32得到intIndex和bitIndex。


arr [ intIndex ]= arr [ intIndex ] | (1<< bitIndex );//将30000放到相应的bit位上了;

那么如何判断是否存在呢?

arr [ intIndex ]&(1<< bitIndex )//如果结果为0,则不存在,否则存在


public class Test_bitmap {
     
      public static void main(String[] args ){
          
           int [] arr = new int [1000]; //int类型,1000*32=32000bit
          
           int index =30000;
          
           int intIndex = index /32;
          
           int bitIndex = index %32;
          
          System. out .println( arr [ intIndex ]);
          
           arr [ intIndex ]= arr [ intIndex ] | (1<< bitIndex );
          
          System. out .println( arr [ intIndex ]);
          
          
          System. out .println( arr [ intIndex ]&(1<< bitIndex ));
          
     }
}

你可能感兴趣的:(大数据算法应用场景)