Java実装ビットマップ

ビットマップは有用な構造です。いわゆるビットマップを使用することで要素をマークする1ビットが、配列の添字はその要素です店舗へのint型の配列は、その後、メモリが浪費され、4Gのメモリについてかかる場合ビットマップは、多くの場合、そのよう10億などビッグデータの問題、int型の数で使用されます。ビットマップで解決した場合、それはより便利です。int型のビットマップは、それは我々が両方のアナログおよびバイトint型を使用し、書き込みにJava言語で、唯一の論理的な概念であり、また、バイトをシミュレートするために使用することができ、シミュレートするために使用することができます。

メソッドが使用するバイト:(より転載ビットマップでのJavaの実現

下に示すように8ビットを表すバイト、各ビットの値が存在するかどう、すなわち、1または0、。

この例では、それは原稿を説明していない、個人が理解さ:バイト配列の長さがint配列の最大値に依存しない最大値が11である場合、例えば、長さバイト配列= 2 11/8 + 1に等しいです。しかし、これは(大規模データの長さとの間に矛盾を持つ任意の接続の開始点であると思われるこの場所はまだ確認されなければならないときに、このブログを書きます

ビットマップコードの実装

ステップ:特定のバイト配列の構築(新しいバイト[容量/ 8 + 1])の容量は、整数配列の長さである長さ(例:1000000000の番号、等)

byte[] bits = new byte[getIndex(n) + 1];

上図は、例えば、1バイトの長さである場合。

第二段階:NUMバイト[K]で言うことである(NUM / 8 >> 3と同じ数値)における数値位置NUMバイト[]、計算は、kは、いくつかのそのカウント値であります

/**
     * num/8得到byte[]的index
     * @param num
     * @return
     */
    public int getIndex(int num){
        return num >> 3;
    }

同様に、図の例については、この意味で配列、すなわち、バイト[0]の0バイトに対応する第1の素子int配列1は、内の「線」と呼ぶことができます。

第三段階:[インデックス]はいくつかの最初のbyte [インデックス]、すなわち、ある数NUMバイト位置を算出し、各バイトは8(NUMの8%)を有します

/**
     * num%8得到在byte[index]的位置
     * @param num
     * @return
     */
    public int getPosition(int num){
        return num % 8;
    }

同様に、図の例については、この意味で配列、すなわち、バイト[0]の0バイトに対応する第1の素子int配列1は、内の「線」と呼ぶことができます。その後、バイト[0]に対応する係数を1ビット。

ステップ4:位置が0から​​1に変化し、他の位置不変

/**
     * 标记指定数字(num)在bitmap中的值,标记其已经出现过
     * 将1左移position后,那个位置自然就是1,然后和以前的数据做|,这样,那个位置就替换成1了
     * @param bits
     * @param num
     */
    public void add(byte[] bits, int num){
        bits[getIndex(num)] |= 1 << getPosition(num);
    }

ビット[0]は8「ビットを有し、getPosition(1)の値が1である、左シフトの結果は、変更後の左バイナリ 『1』のビット位置1(0000 0001の整数であります0000 0010)。同時に、または動作が行われた後、ビット値を1に変更された場合、算術演算または位置のいずれかを交換すること。

ステップ5:指定した番号numがあるかどうかを判断します

/**
     * 判断指定数字num是否存在<br/>
     * 将1左移position后,那个位置自然就是1,然后和以前的数据做&,判断是否为0即可
     * @param bits
     * @param num
     * @return
     */
    public boolean contains(byte[] bits, int num){
        return (bits[getIndex(num)] & 1 << getPosition(num)) != 0;
    }

ステップ6:デジタル値にビットマップ対応をリセット

/**
     * 重置某一数字对应在bitmap中的值<br/>
     * 对1进行左移,然后取反,最后与byte[index]作与操作。
     * @param bits
     * @param num
     */
    public void clear(byte[] bits, int num){
        bits[getIndex(num)] &= ~(1 << getPosition(num));
    }

次のようにすべてのコードは次のとおりです。

public class Test {

    /**
     * 创建bitmap数组
     */
    public byte[] create(int n){
        byte[] bits = new byte[getIndex(n) + 1];
        
        for(int i = 0; i < n; i++){
            add(bits, i);
        }
        
        System.out.println(contains(bits, 11));
        
        int index = 1;
        for(byte bit : bits){
            System.out.println("-------" + index++ + "-------");
            showByte(bit);

        }
        
        return bits;
    }
    
    /**
     * 标记指定数字(num)在bitmap中的值,标记其已经出现过<br/>
     * 将1左移position后,那个位置自然就是1,然后和以前的数据做|,这样,那个位置就替换成1了
     * @param bits
     * @param num
     */
    public void add(byte[] bits, int num){
        bits[getIndex(num)] |= 1 << getPosition(num);
    }
    
    /**
     * 判断指定数字num是否存在<br/>
     * 将1左移position后,那个位置自然就是1,然后和以前的数据做&,判断是否为0即可
     * @param bits
     * @param num
     * @return
     */
    public boolean contains(byte[] bits, int num){
        return (bits[getIndex(num)] & 1 << getPosition(num)) != 0;
    }
    
    /**
     * num/8得到byte[]的index
     * @param num
     * @return
     */
    public int getIndex(int num){
        return num >> 3;
    }
    
    /**
     * num%8得到在byte[index]的位置
     * @param num
     * @return
     */
    public int getPosition(int num){
        return num & 0x07;
    }
    
    /**
     * 重置某一数字对应在bitmap中的值<br/>
     * 对1进行左移,然后取反,最后与byte[index]作与操作。
     * @param bits
     * @param num
     */
    public void clear(byte[] bits, int num){
        bits[getIndex(num)] &= ~(1 << getPosition(num));
    }
    
    /**
     * 打印byte类型的变量<br/>
     * 将byte转换为一个长度为8的byte数组,数组每个值代表bit
     */
    
    public void showByte(byte b){
        byte[] array = new byte[8];
        for(int i = 7; i >= 0; i--){
            array[i] = (byte)(b & 1);
            b = (byte)(b >> 1);
        }
        
        for (byte b1 : array) {
            System.out.print(b1);
            System.out.print(" ");
        }
        
        System.out.println();
    }
    
    public static void main(String[] args) {
        int n = 100;
        new Test().create(n);
    }
}

結果は、100個の数字の合計を示している:(PS、この場合は、実行に思える非常に良いではありませんので、何を言うことができません)

int型の方法が採用さ:思考のバイトを、intは32ビットであるので、これだけ32に8に入れます。

公開された61元の記事 ウォンの賞賛9 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_33204444/article/details/94738210