Bitsetデータ構造の使用
2433 ワード
詳細
BitsetはJavaのデータ構造です.Bitsetには主にバイナリビットが格納され、ビット演算も行われ、各ビットは0、1値のみが格納され、主にデータのタグに使用されます.
BitSetはビット操作のオブジェクトであり、値は0または1(すなわちtrueとfalse)しかなく、内部にはlong配列が維持され、初期化にはlong segementが1つしかないため、BitSetの最小sizeは64である.ストレージの要素が多くなるにつれてBitSet内部は自動的に拡張され、一度に64ビット拡張され、最終的に内部はN個のlong segementによって格納される.
Bitsetの基本原理は,1ビットで1つのデータが出現したか否かを表し,0は出現しなかった,1は出現したことを表す.デフォルトでは、BitSetのすべてのビットは0、falseです.
JDKがBitSetの内部記憶構造としてlong配列を選択したのは,性能を考慮してandとorの際にサイクル数を減らし,性能を向上させるためである.
適用シーン:大量のデータの重量除去、ソート、圧縮ストレージ
利点:ビット単位のストレージで、メモリ容量が小さい
欠点:スレッドが安全でない
基本操作:
並べ替えの解除:
BitsetはJavaのデータ構造です.Bitsetには主にバイナリビットが格納され、ビット演算も行われ、各ビットは0、1値のみが格納され、主にデータのタグに使用されます.
BitSetはビット操作のオブジェクトであり、値は0または1(すなわちtrueとfalse)しかなく、内部にはlong配列が維持され、初期化にはlong segementが1つしかないため、BitSetの最小sizeは64である.ストレージの要素が多くなるにつれてBitSet内部は自動的に拡張され、一度に64ビット拡張され、最終的に内部はN個のlong segementによって格納される.
Bitsetの基本原理は,1ビットで1つのデータが出現したか否かを表し,0は出現しなかった,1は出現したことを表す.デフォルトでは、BitSetのすべてのビットは0、falseです.
JDKがBitSetの内部記憶構造としてlong配列を選択したのは,性能を考慮してandとorの際にサイクル数を減らし,性能を向上させるためである.
適用シーン:大量のデータの重量除去、ソート、圧縮ストレージ
利点:ビット単位のストレージで、メモリ容量が小さい
欠点:スレッドが安全でない
基本操作:
BitSet bitSet1 = new BitSet();
BitSet bitSet2 = new BitSet();
for(int i=0; i<15; i++){
if(i%3 != 0 && i%5 != 0) bitSet1.set(i);
if(i%2 == 0) bitSet2.set(i);
}
bitSet1.and(bitSet2); //
bitSet1.or(bitSet2); //
bitSet1.andNot(bitSet2); // BitSet , BitSet
bitSet1.xor(bitSet2); // BitSet , BitSet
bitSet1.intersects(bitSet2); // true , true
bitSet1.set(100); // 100
System.out.println(bitSet1.get(100)); // 100
System.out.println(bitSet1.size()); // ,64
System.out.println(bitSet1.length()); //
System.out.println(bitSet1.cardinality()); // true
bitSet1.set(100);
// index true index, -1
System.out.println(bitSet1.nextSetBit(0));
System.out.println(bitSet1.nextSetBit(14));
System.out.println(bitSet1.nextSetBit(15));
// index true index, -1
System.out.println(bitSet1.previousSetBit(200));
System.out.println(bitSet1.previousSetBit(14));
System.out.println(bitSet1.previousSetBit(0));
並べ替えの解除:
ThreadLocalRandom rnd = ThreadLocalRandom.current();
//
int arrayLength = 10;
int[] array = new int[arrayLength];
for(int i=0; i=0; i=bitSet.nextSetBit(i+1)){
System.out.print(i + ", ");
}
System.out.println();
//
for(i=bitSet.previousSetBit(bitSet.length()); i>=0; i=bitSet.previousSetBit(i-1)){
System.out.print(i + ", ");
}
System.out.println();