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 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();