好久没用过bitmap,都忘记了他的定义,重新实现一个简单的温故知新。
bitmap一般用于大数据的排序,去重,查找等用途。总体实现上类似于伴随数组,开辟额外的空间用于存储数据,但是不同的是他是利用位来存储,这样可以在有限的内存中存储很多数据,但是缺点就是数据不能重复。
32位机器上,一个int是四个字节,一共是32个位,可以保存1-32的所有数字。如下图,保存的是数字2,4和32。
而对于很多的数据,可以使用数组进行存储,例如开辟长度为10的数组,他可以保存的数据为1-3200。
具体测试代码:
void my_test_bitmap()
{
std::vector<int> veValue = { 67, 34, 129, 12, 30, 22 };
int xx = 3; //数组长度和宽度
std::vector<std::vector<int>> veRes;
veRes.resize(xx);
for (int i = 0; i < xx; ++i)
veRes[i].resize(xx);
for (int i = 0; i < veValue.size(); ++i)
{
int iPosTmp = veValue[i] / 32;
int iPosx = iPosTmp / xx;
int iPosy = iPosTmp % xx;
int iMove = veValue[i] % 32;
//cout << "move:" << iMove << endl;
if (iMove)
veRes[iPosx][iPosy] |= (1 << (iMove-1));
}
for (int i = 0; i < xx; ++i)
{
for (int j = 0; j < xx; ++j)
{
int iVal = 1;
for (int k = 0; k < 32; ++k)
{
if (iVal & (veRes[i][j]))
{ //计算实际数值
cout << i * 32 * xx + j * 32 + k+1 << endl;
}
iVal <<= 1;
}
}
}
cout << "-------------------" << endl; //打印vector中实际存储内容
for (int i = 0; i < xx; ++i)
{
copy(veRes[i].begin(), veRes[i].end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
cout << "-------------------" << endl;
}