文件包含10000000个整数,对其排序,内存不够10000000*4 B,解决办法bitmap 只需10000000bit,节省32倍空间
package com.java.ly2011.June;
/**
* 假设n个整数 需要 n*4B=n*4*8b=32n bit
* 用位图法只需要n bit
* 节省空间4*8倍
* @author Acer
*
*/
public class BitMapSort {
public static void main(String[] args) {
//这个数组就是位图
int[] bitMap = new int[1+N/IntBit];//计算存储Nbit位所需的int数组大小
int[] array = new int[]{1,10,1000,100000, 100, 2, 10000, 9999, 4567, 78902};
bitsort(array, bitMap);
}
private static int IntBit = 32; //一个整形变量32bit
private static int SHIFT = 5;
private static final int N = 10000000;//这么多个数也就需要这么多bit位
public static void initBitMap(int[] bitMap){
for (int i = 0; i < bitMap.length; i++) {
bitMap[i]=0;
if(bitMap[i]!=0x00){
System.out.println("!=");
}
}
}
public static void addToBitMap(int i ,int[] bitMap){
bitMap[i>>SHIFT] |= (1<<i);//位或,添加新的位信息的同时也要保存好老的信息,不能直接等于(后面覆盖前面的)
}
public static boolean isInBitMap(int i , int[] bitMap){
boolean result= false;
result = ( ( bitMap[i>>SHIFT]&(1<<i) ) == (1<<i) );
return result;
}
public static void bitsort(int[] array ,int[] bitMap){
initBitMap(bitMap);
for (int i = 0; i < array.length; i++) {
addToBitMap(array[i], bitMap);
}
for (int i = 0; i < N; i++) {
if(isInBitMap(i, bitMap)){
System.out.println(i);
}
}
}
}