高阶数据结构 位图的介绍

news2024/10/6 20:32:57

作者:@学习同学
专栏:@数据结构进阶
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:简单介绍高阶数据结构位图

位图的介绍

  • bitset的介绍
    • 位图的引入
    • 位图的概念
    • 位图的引用
  • bitset的使用
    • bitset定义方式
      • 方式一 默认初始化
      • 方式二 赋初值
      • 方式三 字符串初始化
    • bitset成员函数的使用
      • set
      • reset
      • flip
      • test
      • count
      • size
      • any none all
    • bitset运算符的使用
      • 流插入 流提取运算符
      • 赋值 单目 复合运算符
      • 位运算符
      • bitset中[ ]运算符的使用

bitset的介绍

位图的引入

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?

对于无序的数组来说 我们这里可能会想到这么几种方法来查找里面的元素

  1. 直接遍历整个数组 时间复杂度O(N) 但是每找一次都要从头遍历一遍
  2. 排序后二分查找 排序的时间复杂度是O(N*Log(N)) 之后每次查找时间复杂度Log(N)
  3. 将所有数据插入到unordered_set中 插入时间复杂度O(N) 每次查找的时间复杂度O(1)

这些算法的效率看上去很不错 但是忽略了一种很重要的点

40亿个重复的无符号数 它占用的内存是16个G 从空间消耗来说 这是不被允许的

解决方案

我们在从这四十亿个数中找一个数存不存在实际上就是判断这个数的状态

而这个数的状态只可能是存在或者不存在两种 只需要通过二进制 1 0 就能表示这两种状态

所以说对于每个整数我们只需要计算机中的一个最小储存单位来记录就可以

如图
在这里插入图片描述
而本来需要四个字节的数据 现在我们使用一个bit位就解决了

所以说使用空闲缩小了 32倍 也就是500多mb

位图的概念

位图 就是用每一位来存放某种状态

它适用于海量数据 数据无重复的场景 通常是用来判断某个数据存不存在的

位图的引用

  1. 快速查找某个数据是否在一个集合中
  2. 排序
  3. 求两个集合的交集 并集等
  4. 操作系统中磁盘块标记
  5. 内核中信号标志位(信号屏蔽字和未决信号集)

bitset的使用

bitset定义方式

方式一 默认初始化

代码表示如下

   bitset<16> bs1;

显示效果如下

在这里插入图片描述
我们可以发现 所有的比特位都被初始化为0了

方式二 赋初值

代码表示如下

  bitset<16> bs1(0xffff);

显示效果如下

在这里插入图片描述
我们可以发现所有的bit位全部被初始化成1了 刚好符合0xffff

方式三 字符串初始化

代码表示如下

	bitset<16> bs1(string("011011"));

显示效果如下
在这里插入图片描述
我们可以看到这个字符串匿名对象将前六个bit位初始化了

bitset成员函数的使用

bitset中常用的成员函数如下

在这里插入图片描述

set

设置指定位置 若不指定设置位置则设置全部位

tip: 基本bitset的所有成员函数都是你如果不指定位置就设置整个容器 我们只在set中强调一遍 后序所有代码均指定位置

代码如下

	bitset<8> bs;
	bs.set();

显示效果如下
在这里插入图片描述

假设我们设置指定位置的话 代码如下 显示效果如下

	bitset<8> bs;
	bs.set(2);

在这里插入图片描述

我们可以发现只有第二位被设置成了1

reset

清空指定位和所有位

代码和演示效果如下

在这里插入图片描述
我们可以看到reset之后2的位置变成0了

flip

翻转指定或者是所有位

flip我们一般就是用来反转所有位置的 因为要反转单个位的话其实set和reset就够用了

代码和显示效果如下

在这里插入图片描述
我们可以发现 全部位置都被反转了

test

获取指定位置的状态

我们用2和3来做测试 代码和演示效果如下

在这里插入图片描述
我们可以发现 和上面的测试结果相吻合

count

获取被设置的个数

代码和演示效果如下

	bitset<8> bs;
	bs.set(2);
	bs.set(3);
	bs.reset(2);
	bs.flip();
	cout << bs.count() << endl;

在这里插入图片描述

size

获取位图的大小 代码和演示结果表示如下

	bitset<8> bs;
	cout << bs.size() << endl;

在这里插入图片描述

any none all

这三个结构函数的返回值都是bool类型 它们的含义分别是

  • any 如果有值被设定就返回真
  • none 如果没有值被设定就返回真
  • all 如果所有值被设定就返回真

验证代码如下

在这里插入图片描述
结果确实符合我们的预期

bitset运算符的使用

流插入 流提取运算符

bitset中重载了流插入和流提取运算符 演示代码如下

	bitset<8> bs;
	cin >> bs;
	cout << bs << endl;

我们输入 010110 六个bit位

最后结果会变成这样子

在这里插入图片描述

bs的低六位被重设了

赋值 单目 复合运算符

此外 bitset的操作符也被重载了很多

这些操作符大部分用法和原本意义类似 这里演示下它们的用法

	bitset<8> bs(string("01010101"));

	bs >>= 1;
	cout << bs << endl;
	cout << ~bs << endl;

演示结果如下

在这里插入图片描述

位运算符

同样的 bitset也对位运算符进行了重载

我们这里直接给出演示的代码和图

	bitset<8> bs(string("01010101"));
	bitset<8> bs2; // 0000 0000

	cout << (bs | bs2) << endl;
	cout << (bs & bs2) << endl;
	cout << (bs ^ bs2) << endl;

在这里插入图片描述

bitset中[ ]运算符的使用

同样的 bitset对于【】运算符也进行了重载 我们这里给出重载后的代码和效果

	bitset<8> bs(string("11111111"));
	bs[0] = 0;
	cout << bs << endl;

在这里插入图片描述
我们可以发现第0位被修改成0了

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

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

相关文章

基于BGP技术和防火墙双机热备技术的校园网设计与实现

规划设计描述网络拓扑设计分为三部分进行设计&#xff1a;主校区网络、 运营商骨干网络、分校区网络。总公司网络设计&#xff1a;划分&#xff1a;教学楼区域、宿舍区域、办公楼区域、行政楼区域&#xff0c;图书馆区域、数据中心。并且设有web服务器。出口设置双机热备技术&a…

人工智能在网络犯罪中的应用:5个最重要的趋势

在当今的数字世界中&#xff0c;网络威胁不断演变。 人工智能的使用虽然在网络犯罪中还不是必须的&#xff0c;但无疑是我们将在未来几年看到的具有重大发展的最有前途的技术之一。 随着 AI 技术的进步&#xff0c;攻击者开始尝试新的、越来越复杂和有效的攻击模式和技术。 …

PCL OcTree(二)——点云压缩

文章目录 一、应用背景二、代码解读1、官方源码2、代码解释与扩展3、完整代码三、参考文献一、应用背景 点云由庞大的数据集组成,这些数据集通过距离、颜色、法线等附加信息来描述空间三维点。此外,点云能以非常高的速率被创建出来,因此需要占用相当大的存储资源,一旦点云…

【信管9.3】项目干系人管理

项目干系人管理干系人&#xff0c;这三个字我们已经很早就见过了&#xff0c;相信你对它一定不会陌生。在我们的教材中&#xff0c;它是和项目沟通管理放在一起的&#xff0c;在同一个章节中讲完了&#xff0c;我们也遵循教材的顺序&#xff0c;将它和沟通放在一起。其实&#…

【计算机网络(考研版)】第一站:计算机网络概述(二)

目录 四、OSI参考模型和TCP/IP模型 1.ISO/0SI参考模型 2.TCP/IP模型 3.OSI/RM参考模型和TCP/IP参考模型的区别和联系 4.五层教学模型 5.数据流动示意图 四、OSI参考模型和TCP/IP模型 前面我们已经讨论了体系结构的基木概念&#xff0c;在具体的实施中有两个重要的网络体系…

Qt扫盲-QNetworkReply理论总结

QNetworkReply理论总结一、概述二、使用1. 读取body内容2. 获取head属性值3. 错误处理一、概述 QNetworkReply类包含了与QNetworkAccessManager发送的请求回来的相关的数据和元数据。与QNetworkRequest类似&#xff0c;它包含一个URL和头部(包括解析的和原始的形式)&#xff0…

Java基础语法——运算符与表达式

目录 Eclipse下载 安装 使用 运算符 键盘录入 Eclipse下载 安装 使用 Eclipse的概述(磨刀不误砍柴工)——是一个IDE(集成开发环境)Eclipse的特点描述&#xff08;1&#xff09;免费 &#xff08;2&#xff09;纯Java语言编写 &#xff08;3&#xff09;免安装 &#xff08…

【自然语言处理】情感分析(二):基于 scikit-learn 的 Naive Bayes 实现

情感分析&#xff08;二&#xff09;&#xff1a;基于 scikit-learn 的 Naive Bayes 实现在上一篇博客 情感分析&#xff08;一&#xff09;&#xff1a;基于 NLTK 的 Naive Bayes 实现 中&#xff0c;我们介绍了基于 NLTK 实现朴素贝叶斯分类的方法&#xff0c;本文将基于 sci…

阿里云效git仓库的创建与使用

一、为何选用阿里仓库为什么要让同学们什么阿里云git仓库呢&#xff1f;主要是考虑速度、容量、人数限制、功能等因素。阿里的速度较快。代码库不限&#xff0c;人数不限制。gitee等仓库要求人员在5名以下&#xff0c;不方便实操练习。云效的功能还强大。有阿里做后盾&#xff…

微服务必经之路,企业应用架构蓝图,有状态和无状态组件之分

微服务如火如荼&#xff0c;但很多时候是事倍功半&#xff0c;花了大力气&#xff0c;收获很少。怎样实现一键扩展&#xff0c;负载量自然伸缩&#xff0c;高可用呢&#xff1f; 一般公司都有了企业级的应用&#xff0c;我们通常所说的三层架构&#xff0c;即用户界面或者说前台…

“华为杯”研究生数学建模竞赛2005年-【华为杯】D题:仓库容量有限条件下的随机存贮管理问题(附获奖论文和matlab代码)

赛题描述 工厂生产需定期地定购各种原料,商家销售要成批地购进各种商品。无论是原料或商品,都有一个怎样存贮的问题。存得少了无法满足需求,影响利润;存得太多,存贮费用就高。因此说存贮管理是降低成本、提高经济效益的有效途径和方法。 问题2 以下是来自某个大型超市的…

【Android】开发一个简单时钟应用每天看时间起床

有没有想过&#xff0c;家里闲置不用的旧手机可以当时钟闹钟来用&#xff0c;觉得这个想法可以吧&#xff0c;把闲置手机充分利用起来了呢&#xff0c;接下来给大家讲一下如何实现&#xff0c;功能简单&#xff0c;可以当作编程入门课。 在电脑上&#xff0c;打开我们熟悉的An…

【设计模式】结构型模式·享元模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.概述 定义&#xff1a;运用共享技术来有效地支持大量细粒度对象的复用。通过共享已经存在的对…

厚积薄发打卡Day115:Debug设计模式<简单工厂、工厂方法、抽象工厂>

厚积薄发打卡Day115&#xff1a;Debug设计模式<简单工厂、工厂方法、抽象工厂> 简单工厂 定义 由一个工厂对象决定创建出哪一种产品类的实例&#xff08;严格意义并不是设计模式&#xff0c;更是一种风格&#xff09; 类型&#xff1a;创建型&#xff0c;但不属于GOF…

PyAutoFEP Tutorial--基于Gromacs

PyAutoFEP 自由能微扰计算–基于Gromacs 简介 注意&#xff1a;以下教程假定读者熟悉分子动力学 (MD) 和自由能微扰 (FEP) 理论。此外&#xff0c;了解 GROMACS 工具、拓扑和输入文件也很有用。整个教程都使用 Linux 命令行。最后&#xff0c;建议用户阅读并参考 PyAutoFEP 手…

17种编程语言+10种排序算法

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、前…

AI算法工程师 | 09机器学习-概率图模型(二)朴素贝叶斯算法与文本分类(1)

目录机器学习 - 概率图模型 之 朴素贝叶斯算法一、贝叶斯与朴素贝叶斯算法1、相关概念2、朴素贝叶斯分类的工作流程3、朴素贝叶斯的优缺点二、文本分类1、one-hot 编码2、TF-IDF 词频-逆文档频率3、代码&#xff1a;基于朴素贝叶斯实现文本分类&#xff08;使用 Python 手动实现…

力扣刷题| 239. 滑动窗口最大值、347.前 K 个高频元素

文章目录LeetCode 239. 滑动窗口最大值题目链接&#x1f517;思路代码实现LeetCode 347.前 K 个高频元素题目链接&#x1f517;思路代码实现LeetCode 239. 滑动窗口最大值 题目链接&#x1f517; LeetCode 239. 滑动窗口最大值 思路 这是使用单调队列的经典题目 难点是如何…

html列表

1.无序列表&#xff1a; 场景&#xff1a;在网页中表示一组无顺序之分的列表 如&#xff1a;新闻列表 标签组成&#xff1a; ul&#xff1a; 表示无序列表的整体&#xff0c;用于包裹li标签 li&#xff1a;表示无序列表的每一项&#xff0c;用于包含每一行的内容 注意点&…

Makefile学习③:编译流程

Makefile学习③&#xff1a;编译流程 学习前准备 实现七个文件的编写&#xff0c;例如&#xff1a;实现加减乘三个函数的.c文件和.h文件的编写加上主函数main.c&#xff0c;方便后续使用Makefile将其分别编译。 博主的demo如下&#xff1a; 使用gcc 命令将所有文件编译出来生…