算法 BitMap 排序 && 索引

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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值