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

参考文献:


给定一个文件,里面包含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 ));
          
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值