一、位图的基本概念
位图法(bitmap)
作用: 判断某个数据存在不存在
适用范围:大规模数据,数据状态又不多
什么是位图: http://baike.sogou.com/v72576997.htm?fromTitle=位图法
所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。
例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示。那么就可以开一个int 数组,一个int有32个位,就可以表示32个人。操作的时候可以使用 位操作。
应用举例:
一、给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中
申请512M的内存
一个bit位代表一个unsigned int值
读入40亿个数,设置相应的bit位
读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在
二、使用位图法判断整形 数组是否存在重复
三、使用位图法进行整形 数组排序
四、位图法存数据
二、代码块
#pragma once
#include<iostream>
using namespace std;
#include <vector>
class BitMap
{
public:
BitMap() :_size(0)
{}
BitMap(size_t size) :_size(0)//构造函数的重载
{
_array.resize((size >> 5) + 1);//创建这么多int空间
}
void Set(size_t num)
{
size_t index = num >> 5;//获取数据在第几个字节
size_t i = num % 32;//获取数据在第几个位
//<< 左移往高位移 (相当于乘法)
//>> 右移往低位移 (相当于除法)
//左右移并不代表方向与大端或小端也没有关系
if (_array[index] & (1 << i))//该数据已存在
{
return;
}
else
{
_array[index] |= (1 << i);
_size++;
}
}
void Reset(size_t num)//重置 把该位从 1-->0
{
size_t index = num >> 5;
size_t i = num % 32;
if (_array[index] & (1 << i))
{
_array[index] &= ~(1 << i);
_size--;
}
else
{
return;
}
}
void Test(size_t num)//测试该位是0 还是1 )(0:该数不存在,1:该数存在)
{
size_t index = num >> 5;
size_t i = num % 32;
if (_array[index] & (1 << i))
{
cout << num << "-->1 :值存在" << endl;
}
else
{
cout << num << "-->0 :值不存在" << endl;
}
}
protected:
vector<size_t> _array;
size_t _size;//记录有效数据存在的个数
};
void BitMapTest()
{
BitMap bm(62);
bm.Set(1);
bm.Set(5);
bm.Set(33);
bm.Set(92);
bm.Set(888);
bm.Reset(5);
bm.Test(1);
bm.Test(5);
bm.Test(32);
bm.Test(33);
bm.Test(92);
bm.Test(128);
bm.Test(888);
}