BitMap

算法思想

    32位机器上,一个整形,比如int a;在内存中占32bit,4个字节,可以用对应的32bit位对应十进制的0-31的数,bitmap算法利用这种思想处理大量数据的排序与查询。

    优点:

    1. 运算效率高,可以不进行比较和移位

    2. 占用内存少,比如:N=10000000个数,只需要占用内存 N / 32 * 4 = 1250000 Byte = 1.25M,原本需要40M

     缺点:数据不能有重复


0-31:对应在a[0] 
i=0                         00000000000000000000000000000000 
temp=0                  00000000000000000000000000000000 
answer=1               00000000000000000000000000000001 
i=1                         00000000000000000000000000000001 
temp=1                  00000000000000000000000000000001 
answer=2                00000000000000000000000000000010 
i=2                          00000000000000000000000000000010 
temp=2                   00000000000000000000000000000010 
answer=4                 00000000000000000000000000000100 
i=30                        00000000000000000000000000011110 
temp=30                  00000000000000000000000000011110 
answer=1073741824  01000000000000000000000000000000 
i=31                        00000000000000000000000000011111 
temp=31                  00000000000000000000000000011111 
answer=-2147483648 10000000000000000000000000000000 


32-63:对应在a[1] 

i=32                   00000000000000000000000000100000 
temp=0               00000000000000000000000000000000 
answer=1             00000000000000000000000000000001 
i=33                    00000000000000000000000000100001 
temp=1                00000000000000000000000000000001 
answer=2              00000000000000000000000000000010 
i=34                     00000000000000000000000000100010 
temp=2                 00000000000000000000000000000010 
answer=4               00000000000000000000000000000100 
i=61                      00000000000000000000000000111101 
temp=29                 00000000000000000000000000011101 
answer=536870912   00100000000000000000000000000000 
i=62                       00000000000000000000000000111110 
temp=30                  00000000000000000000000000011110 
answer=1073741824  01000000000000000000000000000000 
i=63                        00000000000000000000000000111111 
temp=31                  00000000000000000000000000011111 
answer=-2147483648 10000000000000000000000000000000 


1.求十进制0-N对应在数组a中的下标: 
    十进制0-31,对应在a[0]中,先由十进制数n转换为与32的余,可转化为对应在数组a中的下标。比如n=24,那么 n/32=0,则24对应在数组a中的下标为0。又比如n=60,那么n/32=1,则60对应在数组a中的下标为1,同理可以计算0-N在数组a中的下标。 
2.
0-N对应在0-31中的数: 
十进制0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32,求得对应0-31中的数。 


Java实现

public class BitMap {

    private final int[] bitmap;
    private final int size;

    public static void main(String[] args) {
        BitMap bm = new BitMap(10000000); //根据int的最大值来初始化int[]长度,再大的就无法容下了
        int searchNum = 10;
        int[] numArr = new int[10000000];
        for(int i=0;i<10000000;i++){
            numArr[i] = i;
        }
        bm.add(numArr); //存入原始数据
        System.out.println(bm.getIndex(searchNum));
    }

    public BitMap(final int size) { //需要几个int[]
        this.size = size;
        int sLen = ((size%32) == 0) ? size/32 : size/32 + 1;
        this.bitmap = new int[sLen];
    }
    public void add(int[] numArr){
        for(int i=0; i<numArr.length; i++)
            add(numArr[i]);
    }
    public void add(int number) {
        adjustBitMap(_Index(number),_Position(number));
    }
    private static int _Index(final int number ){
        return number / 32;
    }
    private static int _Position(final int number){
        return number % 32;
    }
    private void adjustBitMap(final int index, final int position) { // |表示或,一个为1则为1;^表示异或,不同才为1
        int bit = bitmap[index] | (1 << position);      // 左移表示乘 2^n-->实际中,位表示的是真实值,但是转为十进制就不是了。
        bitmap[index] = bit;
    }
    public boolean getIndex(final int index) {
        if(index > size) return false;  //如果大于int能表示的最大范围,则原始数据中肯定没有
        int bit = (bitmap[_Index(index)] >> _Position(index)) & 0x0001; // 按位与&,都为1才为1;思想为:根据index找到[]下标,然后将对应为1的数右移到最低位,进行&运算。
        return (bit == 1);
    }
}


你可能感兴趣的:(BitMap)