参考文献:
给定一个文件,里面包含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
));
}
}