JAVA 实现 Bitmap

public class MyBitmap {

    private byte[] buckets;

    public MyBitmap( int maxNum ) {
        this.init( maxNum );
    }

    private void init(int maxNum){
        int maxBucketIndex = this.getBucketIndex(maxNum);
        this.buckets = new byte[ maxBucketIndex + 1];
    }

    public void add(int num){
        int bucketIndex = this.getBucketIndex(num);
        int bitIndex = this.getBucketInnerBitIndex(num);
        this.buckets[ bucketIndex ] |= 1 << bitIndex;
    }
    
    public boolean contains(int num){
        int bucketIndex = this.getBucketIndex(num);
        int bitIndex = this.getBucketInnerBitIndex(num);
        return ( this.buckets[ bucketIndex ] & 1 << bitIndex ) != 0;
    }

    private int getBucketIndex(int num){
        return num >> 3;
    }
    
    private int getBucketInnerBitIndex(int num){
        return num & 0x07;
    }
}

JAVA 实现 Bitmap_第1张图片

测试类:

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        MyBitmap bitmap = new MyBitmap( 1000 );
        List ids = new ArrayList<>();
        ids.add( 1 );
        ids.add( 2 );
        ids.add( 3 );
        ids.add( 15 );
        ids.add( 23 );
        ids.add( 24 );
        ids.add( 25 );
        ids.add( 30 );
        ids.add( 49 );
        ids.add( 50 );
        for( Integer id:ids ){
            bitmap.add( id );
        }
        for( int i=1;i<=50;i++ ){
           if(  bitmap.contains( i ) ){
               System.out.println( i + "存在" );
           }else {
               System.out.println( i + "不存在" );
           }
        }
    }
}

输出:

1存在
2存在
3存在
4不存在
5不存在
6不存在
7不存在
8不存在
9不存在
10不存在
11不存在
12不存在
13不存在
14不存在
15存在
16不存在
17不存在
18不存在
19不存在
20不存在
21不存在
22不存在
23存在
24存在
25存在
26不存在
27不存在
28不存在
29不存在
30存在
31不存在
32不存在
33不存在
34不存在
35不存在
36不存在
37不存在
38不存在
39不存在
40不存在
41不存在
42不存在
43不存在
44不存在
45不存在
46不存在
47不存在
48不存在
49存在
50存在

测试 bitmap 和 hashSet 查询元素的速度:



import java.util.HashSet;
import java.util.Set;


public class Test {


    private static final int SIZE = 5000000;


    public static void main(String[] args) {
        System.out.println( "SIZE = " + SIZE );
        MyBitmap bitmap = new MyBitmap(SIZE);
        Set set = new HashSet<>();

        // 装载元素
        for (int i = 0; i < SIZE; i++) {
            bitmap.add( i );
            set.add( i );
        }

        // 预热阶段
        for (int i = 0; i < 20; i++) {
            test_bitmap( bitmap );
            test_hashSet( set );
        }

        // 测试阶段
        long t1 = System.currentTimeMillis();
        test_bitmap( bitmap );
        long t2 = System.currentTimeMillis();
        test_hashSet( set );
        long t3 = System.currentTimeMillis();
        System.out.println( "位图耗时:" + ( t2 - t1 ) + "毫秒" );
        System.out.println( "hashSet耗时:" + ( t3 - t2 ) + "毫秒" );
    }

    public static Integer test_bitmap( MyBitmap bitmap ){
        int count_exist = 0;
        for (int i = 0; i < SIZE; i++) {
            if( bitmap.contains( i ) ){
                count_exist++;
            }
        }
        return count_exist;
    }

    public static Integer test_hashSet( Set set ){
        int count_exist = 0;
        for (int i = 0; i < SIZE; i++) {
            if( set.contains( i ) ){
                count_exist++;
            }
        }
        return count_exist;
    }
}

测试输出:

SIZE = 1000000
位图耗时:1毫秒
hashSet耗时:4毫秒


SIZE = 5000000
位图耗时:3毫秒
hashSet耗时:28毫秒

SIZE = 10000000
位图耗时:6毫秒
hashSet耗时:200毫秒

你可能感兴趣的:(算法,位图,java,算法,位图,HashSet,数据结构,bitmap)