位图这些知识点,又不难,不知道白不知道;
看看万一以后用到,还能有这个概念;
一、位图:
1.1、位图概念:
用每个比特位判断某种状态,0/1 判断为两种状态,可以大大节省空间;
适用于数据无重复,海量数据;通常判断数据存不存在;
2.2、位图实现原理:
2.2.1、构造位图:
2.2.2、位图的存储:
2.2.3、位图的查找
算出位置,然后通过与只有该位置为1,其他位置为0的数,相与(&),返回结果;
2.2.4、位图的删除:
算出位置,然后通过与只有该位置为0,其他位置都为1的数,相与(&)。
2.3、位图代码实现:
#include<vector>
using namespace std;
//用于存储不重复数据的简单信息,不需要存放数据本身
//节省空间,查找效率高o(1)
class Bitmap {
public:
//位图大小和数据范围有关
Bitmap(size_t range)
:_bit(range/32+1)
{ }
//存储信息
void set(size_t num) {
//计算位置
//计算整数位置:/32
int idx = num / 32;
//计算比特位位置:%32
int bitIdx = num % 32;
//把对应比特位变为1
//按位或运算
_bit[idx] |= 1 << bitIdx;
}
//查找信息
bool test(size_t num) {
int idx = num / 32;
int bitIdx = num % 32;
return _bit[idx] & (1 << bitIdx);
}
//删除信息
void reset(size_t num) {
int idx = num / 32;
int bitIdx = num % 32;
_bit[idx] &= ~(1 << bitIdx);
}
private:
//整数数组
vector<int> _bit;
};
2.4、位图的应用:
- 快速查找某个数据是否在一个集合中
- 排序
- 求两个集合的交集、并集等
- 操作系统中磁盘块标记