bitmap详解与实现

        好久没用过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;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值