ビットマップの概要
C ++ STLには、対応するビットセットコンテナがあります。これは、実際にはビットマップメソッドです。
各ビットを使用して特定の状態を格納することは、大規模なデータに適していますが、データの状態は多くありません。通常、特定のデータが存在するかどうかを判断するために使用されます。
ビットマップ方式を使用して問題を処理するには、データの最大値を事前に知っておく必要があります。最大値Max = 100000の場合、unsignedchar配列のサイズsize = Max / 8 + 1
数値を記録するときは、そのバイト位置とビット位置を計算する必要があります。
// 计算整数应该放置的字节位,即数组下标
int index = num / 8;
// 计算对应字节的位位置
int offset = num % 8;
繰り返されるかどうかを判断する必要がある場合は、以下の操作を行ってください。
// 计算整数应该放置的字节位,即数组下标
int index = num / 8;
// 计算对应字节的位位置
int offset = num % 8;
int v = p[index] & (1 << offset);
if (0 != v){
cout << vec[i] << "是第一个重复的数据" << endl;
break; // 如果要找所有重复的数字,这里就不用break了
}else{
// 表示该数据不存在,把相应位置置1,表示记录该数据
p[index] = p[index] | (1 << offset);
}
ビットマップを使用して大量のデータ重複の問題を解決する場合、ビットマップ配列が占めるメモリがデータの最大数に依存するという欠点があります。たとえば、整数が10個あり、最大値が10億であるため、次のことを行う必要があります。 10を押すビットマップ配列のサイズを開くために、10億の数が計算されます。