bitMap ?排序
----10G文件的自然数,乱序排列,在32机器中限制为2G内存进行排序。(x86机器采用的是小端存储模式),即小端模式:数据的高位保存在地址的高位地址,数据的地位保存地址的地位地址上。
数字按照bit 位进行存储,存储的bit 的值 置位 为 1.
如: 2,7,5,1,4 五位数字进行排序,
->byte 8bit: 0000 0000
对应的bit数存相应的值。
->byte 8bit: 1011 0110
然后直接按照数据读取bit的数字即可。 1,2,4,5,7 。顺序即可完成排序。
再看下10G的文件,一个自然数站4bytes,
即一个INT类型,count= 10*1024*1024*1024 /4 bytes 自然数 2684354560个
如果这些数字使用bit为存储时需要 2684354560 / 8*1024*1024=320M .发现只需要320M的空间即可存储。
2G 的空间还是非常多的。
----如何做?
package com.fandong.algorithm;
public class BitMap {
private static int[] arr= null;
public static void main(String[] args) {
int[] randomArr = new int[10];
for(int i=0;i<randomArr.length;i++){
randomArr[i] =(int)(Math.random()*99);
System.out.print(randomArr[i]+" ");
}
arr = new int[(int)(100 >> 5) + ((100 & 31) >0 ? 1: 0)];
System.out.println("print 。。。");
for(int i=0;i<randomArr.length;i++){
setBit(randomArr[i]);
}
for(int i=0;i<100;i++){
if (getflag(i) ==1 ){
System.out.print(i+" ");
}
}
}
public static void setBit(int value){
// System.out.println("input"+value);
int coordinate = value>>5;
int offset = value & 31;
// System.out.println(coordinate);
arr[coordinate] |= 0x01 << offset;
}
public static int getflag(int value){
//System.out.println("input"+ value);
int coordinate = value >> 5;
int offset = value & 31;
int flag = arr[coordinate] >> offset & 0x01;
return flag;
}
}
bitmap 排序要点,会去重。
1、 使用int 进行存储。int 占 4byte = 32bit 。首先要确认int 的数组大小。使用给定排序值的最大值进行。
int index = maxSortValue >> 5
2、 确定偏移量
int offset = maxSortValue & 31 确定偏移量,也可以是 maxSortValue % 32
3、setBit方法
public static void setBit(int value){
// System.out.println("input"+value);
int coordinate = value>>5;
int offset = value & 31;
// System.out.println(coordinate);
arr[coordinate] |= 0x01 << offset;
}
4、设置getflag 方法
public static int getflag(int value){
//System.out.println("input"+ value);
int coordinate = value >> 5;
int offset = value & 31;
int flag = arr[coordinate] >> offset & 0x01;
return flag;
}