重複チェックの問題を解決するためのビットマップ方式

ビットマップの概要

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億の数が計算されます。

おすすめ

転載: blog.csdn.net/qq_44132777/article/details/114901811