【C++位图】构建灵活的空间效率工具

目录

  • 位图
    • 位图的基本概念
    • 如何用位图表示数据
    • 位图的基本操作
      • set
      • reset
      • test
    • 封装位图的设计
  • 总结

在这里插入图片描述

在计算机科学中,位图(Bitmap)是一种高效的空间管理数据结构,广泛应用于各种场景,如集合操作、图像处理和资源管理。与传统的数据结构相比,位图通过使用二进制位来表示元素的存在与否,从而显著降低存储空间的消耗。然而,尽管位图的原理简单,其实现与操作却可能面临诸多挑战。

在本文中,我们将深入探讨如何在 C++ 中封装位图数据结构,重点介绍其基本操作、性能优化以及实际应用。通过封装,我们不仅可以提高代码的可读性和可维护性,还能为后续的功能扩展打下坚实的基础。让我们一起来揭开位图的神秘面纱,探索其在现代编程中的价值。

位图

位图的基本概念

位图(Bitmap)是一种用于高效表示集合的数据结构,其核心思想是使用二进制位来指示某个元素是否存在。在位图中,每个元素对应一个二进制位,若该元素存在,则对应的位为1;若不存在,则为0。这种表示方式使得位图能够在存储上以极高的空间效率来管理大规模数据。
位图特别适用于需要频繁查询和更新的场景,如数据库索引、图像处理和网络协议等。在这些应用中,位图不仅能节省存储空间,还能提高算法的执行速度。
假如我们有几十亿个数据需要在当中查找某个数,我们需要在当中查看某个数是否存在,很容易想到的方法是先用数组存起来,然后再进行排序,排序之后利用二分进行查找,如果单看时间复杂度其实是不大的,这里的问题其实不在算法上,而是在我们该如何存储着几十亿个数据,假如我们有四十亿个数据如果存储起来也需要16g的内存,消耗是相当大的,所以我们就引入了位图用来处理海量数据,这40亿个数据我们可以用40亿个比特位来表示,比特位只有1和0,1表示存在0表示不存在。40亿个比特位大约500mb,节省了将近33倍的空间,效率是相当大的。

如何用位图表示数据

我们是无法操作比特位的,C++操作内存的最小单位是字节,所以我们只能通过位运算来控制比特位,所以我们用 int类型的vector来控制。
在这里插入图片描述我们通过一个vector控制,每个int位可以控制32个数。

位图的基本操作

位图有三个核心接口:reset,set还有一个test。
reset表示将指定数对应的比特位设置为0。
set表示将指定数对应的比特位设定为1。
test表示检测指定数对应的比特位是0还是1,如果是0返回0,如果是1返回1。

首先对位图我们需要一个:

std::vector<int> _bs;

set

void set(size_t x)
{size_t i = x / 32,j = x % 32;//需要把这个整形的第j位标记为1//bs或等于1左移七位_bs[i] |= (1 << j);
}

先将给定数的位置算出来,i表示在第几个int,j表示在比特位的第多少位。
由于这里我们需要将第j位设置为1,而且不能动其他位,所以可以想到位运算(|),先将1左移j位(左移不是表示向左移动,而是表示低位向高位移动),由于两个数进行按位或运算是如果有1结果就是1,0|1也是1,0|0也是0,所以这里不会改变其他位的数。
在这里插入图片描述

reset

void reset(size_t x)
{size_t i = x / 32, j = x % 32;//标记为0左移j位然后取反,直接与等_bs[i]  &= (~(1 << j));
}

reset和set很相似,set需要将当前位置设置为1,reset是要将指定数对应的比特位设置为0,所以我们会想到位运算&,还是先找到对应的byte位,然后将1移到对应的数的比特位的位置,因为两个数的&运算的特点是只要有0就是0,两个都为1才是1,所以这里只需要将除对应比特位以外的所有位置变为1然后将对应比特位位置变为0即可。
在这里插入图片描述

test

bool test(size_t x)
{size_t i = x / 32, j = x % 32;//取到j位置的值return _bs[i] & (1 << j);
}

test只需要取到对应数的比特位即可。

封装位图的设计

//飞类型模版参数
template<size_t N>
class bit_set
{
public:bit_set(){//一个整数是32个位,所以这里要n个位需要除以32//向上取整(如果开60个位60/32=1,那么久少开了一个位)_bs.resize(N / 32 + 1);}//位图的三个核心接口//x映射的位标记为1void set(size_t x){size_t i = x / 32;size_t j = x % 32;//需要把这个整形的第j位标记为1//bs或等于1左移七位_bs[i] |= (1 << j);}//把之前标记的位标记为0void reset(size_t x){size_t i = x / 32, j = x % 32;//标记为0左移j位然后取反,直接与等_bs[i]  &= (~(1 << j));}//x映射的位置是0返回假,是1返回真bool test(size_t x){size_t i = x / 32, j = x % 32;//取到j位置的值return _bs[i] & (1 << j);}
private://C/C++中定义的最小单位是一个字节//一个int是32个位std::vector<int> _bs;
};

总结

在本文中,我们深入探讨了位图数据结构的基本概念及其在 C++ 中的封装实现。位图通过使用二进制位高效地表示集合,极大地节省了内存空间,并在查询和操作上提供了卓越的性能。通过封装,我们不仅提升了代码的可读性和可维护性,还为后续的扩展奠定了基础。

在实际应用中,位图能够在资源管理、网络协议等多个领域发挥重要作用。随着数据规模的不断增长,掌握位图的使用和优化将对程序员的技能提升至关重要。希望本文能为你在数据结构和算法的学习中提供有价值的参考和启发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/54928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂 Pencils Protocol 近期不可错过的市场活动

Pencils Protocol 是 Scroll 上综合性的 DeFi 协议&#xff0c;自 9 月 18 日开始其陆续在 Tokensoft、Bounce、Coresky 等平台开启 DAPP 通证的销售&#xff0c;并分别在短期内完成售罄。吸引了来自韩国、CIS、土耳其等 70 多个国家的 5 万多名认证用户&#xff0c;反响热烈&a…

Jmeter关联,断言,参数化

一、关联 常用的关联有三种 1.边界提取器 2.JSON提取器 3.正则表达式提取器 接下来就详细讲述一下这三种的用法 这里提供两个接口方便练习 登录接口 接口名称&#xff1a;登录 接口提交方式&#xff1a;POST 接口的url地址&#xff1a;https://admin-api.macrozheng.com/a…

C#常用数据结构栈的介绍

定义 在C#中&#xff0c;Stack<T> 是一个后进先出&#xff08;LIFO&#xff0c;Last-In-First-Out&#xff09;集合类&#xff0c;位于System.Collections.Generic 命名空间中。Stack<T> 允许你将元素压入栈顶&#xff0c;并从栈顶弹出元素。 不难看出&#xff0c;…

Vue引入js脚本问题记录(附解决办法)

目录 一、需求 二、import引入问题记录 三、解决方式 一、需求 我想在我的Vue项目中引入jquery.js和bootstrap.js这种脚本文件&#xff0c;但发现不能单纯的import引入&#xff0c;问题如下。 二、import引入问题记录 我直接这么引入&#xff0c;发现控制台报错TypeError: …

华为HarmonyOS地图服务 11 - 如何在地图上增加点注释?

场景介绍 本章节将向您介绍如何在地图的指定位置添加点注释以标识位置、商家、建筑等&#xff0c;并可以通过信息窗口展示详细信息。 点注释支持功能&#xff1a; 支持设置图标、文字、碰撞规则等。支持添加点击事件。 PointAnnotation有默认风格&#xff0c;同时也支持自定…

《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch9 策略梯度方法 Box 8.1 马尔可夫决策过程的平稳分布

Box 8.1&#xff1a; 马尔可夫决策过程的平稳分布 整理自 链接 分析平稳分布的关键工具是 P π ∈ R n n P_\pi \in {\mathbb R}^{n\times n} Pπ​∈Rnn&#xff0c;它是给定策略 π π π 下的概率转移矩阵。 如果状态被索引为 s 1 , ⋯ , s n s_1,\cdots, s_n s1​,⋯…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支&#xff0c;切换到该分支下面&#xff0c;输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支&#xff0c;因为刚刚提交的分支在dev环境&#xff0c;所以master是没有 3、合并分支 点击push&#xff0c;将dev里面的代码合并到…

图片尺寸不合适?这3款免费好用的AI绘图神器帮你免费无缝拓展!一键扩展画面之外的内容,真的泰裤啦!

大家好&#xff0c;我是灵魂画师向阳 在处理图片素材时&#xff0c;大家有没有遇到过尺寸不合适但又不能裁切的情况&#xff1f;是不是也想过图像要是能自己“长”出一块就好了&#xff1f;这种要求在以前或许很难实现&#xff0c;但生产式 AI 技术出现后它就不再是问题了&…

基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue

基于GIKT深度知识追踪模型的习题推荐系统 目录结构 Flask-BackEnd flask后端 app 后端主体文件 alg 深度学习模块 data 数据集data_process.py 数据预处理gikt.py GIKT模型pebg.py PEBG模型params.py 一些参数train.py 仅模型训练train_test.py 模型训练和测试-五折交叉验证t…

WebGIS开发四大开源框架对比

本篇文章主要介绍GIS开发四大地图框架的差异和特点。 Cesium: Cesium是目前主流的一款三维地图框架&#xff0c;支持桌面端、web端、移动端等多平台。Mapbox&#xff1a;高清经纬度矢量瓦片&#xff0c;个性化前端表达&#xff0c;前端矢量绘制&#xff0c;支持海量地名地址。…

数据库实验2—1

10-1 查询重量在[40,65]之间的产品信息 本题目要求编写SQL语句&#xff0c; 检索出product表中所有符合40 < Weight < 65的记录。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product (Pid varchar(20), --商品编号PName varchar(50), --商品名称…

仓颉编程入门2,启动HTTP服务

上一篇配置了仓颉sdk编译和运行环境&#xff0c;读取一个配置文件&#xff0c;并把配置文件简单解析了一下。 前面读取配置文件&#xff0c;使用File.readFrom()&#xff0c;这个直接把文件全部读取出来&#xff0c;返回一个字节数组。然后又创建一个字节流&#xff0c;给文件…

C语言实现常见的数据结构

栈 栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构 #include <stdio.h> #include <stdlib.h>#define MAX 100typedef struct {int data[MAX];int top; } Stack;// 初始化栈 void init(Stack *s) {s->top -1; }// 判断栈是否为空…

VBA技术资料MF204:右键多按钮弹出菜单中使用图标

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【python】【绘制小程序】动态爱心绘制

背景介绍 参考链接&#xff1a;https://blog.csdn.net/Python_HUHU/article/details/139703289点的背景颜色在开始修改&#xff1b;文字的颜色在最后修改。文字内容可以修改。 python 代码 import tkinter as tk import random from math import sin, cos, pi, log from PIL…

Cocos 3.8.3 实现外描边效果(逃课玩法)

本来想着用Cocos 的Shader Graph照搬Unity的思路来加外描边&#xff0c;发现不行&#xff0c;然后我就想弄两个物体不就行了吗&#xff0c;一个是放大的版本&#xff0c;再放大的版本上加一个材质&#xff0c;这个材质面剔除选择前面的面剔除就行了&#xff0c;果不其然还真行。…

如何使用ssm实现基于java web的防疫工作志愿者服务平台的设计与实现

TOC ssm693基于java web的防疫工作志愿者服务平台的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进…

详细解读,F5服务器负载均衡的技术优势

在现代大规模、高流量的网络使用场景中&#xff0c;为应对高并发和海量数据的挑战&#xff0c;服务器负载均衡技术应运而生。但凡知道服务器负载均衡这一名词的&#xff0c;基本都对F5有所耳闻&#xff0c;因为负载均衡正是F5的代表作&#xff0c;换句通俗易懂的话来说&#xf…

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪&#xff0c;都什么年代了&#xff0c;还学makefile&#xff0c;cmake都有些过时了&#xff0c;为什么还要再学这个呢&#xff1f; 我是这么看待这个问题的&#xff0c;cmake跨平台性还是很有有优势的&#xff0c;有着多年积累的底蕴&#xff0c;借助大模…

基于springboot的驾校预约管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的驾校预约管理系统5拥有三种角色&#xff1a;管理员、教练、学员 管理员&#xff1a;学员管理、教练管理、车辆管理、车辆关联、维修管理等 教练&#xff1a;学员查看/毕…