当前位置:网站首页>位图的基本原理以及应用
位图的基本原理以及应用
2022-08-09 22:13:00 【HHYX.】
位图的应用场景
假设生活中有以下这种应用场景:有未排序的40亿个数,需要在其中查找一个数字是否存在。如果直接使用数组来存放这些数,那么一个整型的数占4个字节,40亿个数需要16G的内存大小,从空间上来说一般很难实现,更不用说如果要进行排序产生的损耗等问题了。那有没有什么好方法来存放这么大量的数据呢?这种时候可以用到位图。
位图的基本概念
所谓位图,就是用每一位来存放某种状态。一个字节有8位,那么每一位都可以用来存放某个数字是否存在。一般单个位图虽然适用于海量数据,但是遇到重复数据只能记录一次存在,不过如果使用多个位图也可以解决数据出现次数问题。下面来看看位图具体是怎么做的
位图
这里是C++库里面对位图的介绍,那么为了更深刻的理解位图,可以自己来简单实现一下。实现代码如下:这里需要注意的是数组里面存放的是char占一个字节,也就是8位,用来表示状态的话相当于可以存放8个数据,因此在开空间的时候,将需要的数据大小除以8,这样一来原本需要16G左右的数据现在仅需要0.5M即可(原来数据是用int保存int占4个字节)。为了开足够的空间,这里在除以8之后再加上1。
后面简单实现的3种功能:设置和取消设置某个数的状态以及判断一个数是否存在。
这里的关键点在于需要确定某个数应当存放的vector数组的下标,用该数与8取模即可得到。然后该数存放的比特位位置,使用该数除8也可以得到,然后使用位运算符进行计算即可。
template<size_t N>
class bitset
{
public:
bitset()
{
_bits.resize(N / 8 + 1, 0);
}
void Set(size_t x)//设置为1
{
size_t i = x / 8;//确定该数字存储位置
size_t j = x % 8;//确定该数字存在该char类型的第几个位
_bits[i] |= (1 << j);
}
void Reset(size_t x)//设置为0
{
size_t i = x / 8;//确定该数字存储位置
size_t j = x % 8;//确定该数字存在该char类型的第几个位
_bits[i] &= (~(1 << j));
}
bool test(size_t x)//判断是否存在
{
size_t i = x / 8;//确定该数字存储位置
size_t j = x % 8;//确定该数字存在该char类型的第几个位
return _bits[i] & (1 << j);
}
private:
vector<char> _bits;
};
测试代码如下:
void test_bit_set()
{
bitset<100> bs;
bs.Set(5);
bs.Set(10);
bs.Set(20);
cout << bs.test(5) << endl;
cout << bs.test(10) << endl;
cout << bs.test(20) << endl;
bs.Reset(20);
bs.Reset(10);
bs.Reset(5);
cout << bs.test(5) << endl;
cout << bs.test(10) << endl;
cout << bs.test(20) << endl;
}
运行结果如下:
边栏推荐
猜你喜欢
随机推荐
ElasticSearcch集群
Gartner全球集成系统市场数据追踪,超融合市场增速第一
How to insist to use procedural system?
离散选择模型之Gumbel分布
力扣:474.一和零
继承关系下构造方法的访问特点
金仓数据库 KingbaseGIS 使用手册(6.3. 几何对象创建函数)
上海一科技公司刷单被罚22万,揭露网络刷单灰色产业链
[JZOF] 82 binary tree with a path of a certain value (1)
Install win7 virtual machine in Vmware and related simple knowledge
函数习题(下)
【对象——对象及原型链上的属性——对象的操作方法】
What are the basic steps to develop a quantitative trading strategy?
Sqlserver限制账户在哪些ip下才可以访问数据库
shader学习笔记(五)
华为云全流程护航《流浪方舟》破竹首发,打造口碑爆款
Bi Sheng Compiler Optimization: Lazy Code Motion
String类常用方法
金仓数据库 KingbaseGIS 使用手册(6.6. 几何对象校验函数、6.7. 空间参考系函数)
LeetCode_2632_字符串压缩