STL之位图(bitset)

news2024/12/28 3:05:14

目录

  • 位图
    • bitset介绍
    • bitset使用
  • 模拟实现
  • 位图的应用——题目
  • 总结

位图

bitset介绍

在这里插入图片描述

参考文档:bitset

在 C++ STL 中,std::bitset 是一个固定大小的容器类,用于表示二进制位序列。它可以被看作是一个长度固定为 N 的布尔数组,其中每个元素只有两种取值:0和1。
在这里插入图片描述

bitset使用

常见应用:1.快速查找某个数据是否在集合中 2.排序+去重 3.求两个集合的交集、并集等 4.操作系统中磁盘块标记

接口:

在这里插入图片描述

示例:

排序+去重

#include <iostream>       // std::cout
#include <string>         // std::string
#include <cstddef>        // std::size_t
#include <bitset>         // std::bitset

int main ()
{
    std::bitset<5> foo (std::string("01011"));

    std::cout << "foo contains:";

    for (std::size_t i=0; i<foo.size(); ++i)
        std::cout << foo.test(i) << ' ';

    return 0;
}

模拟实现

代码:

template<size_t N>
class bitset
{
public:
	bitset()
	{
		//开辟(N/8+1)个字节空间
		_bits.resize(N / 8 + 1, 0);
	}
		
	//在第x位上置1
	void set(size_t x)
	{
		size_t i = x / 8;
		size_t j = x % 8;

		_bits[i] |= (1 << j);
	}

	//在第x位上置0
	void reset(size_t x)
	{
		size_t i = x / 8;
		size_t j = x % 8;

		_bits[i] &= ~(1 << j);
	}

	//判断x位上的值
	bool test(size_t x)
	{
		size_t i = x / 8;
		size_t j = x % 8;

		return _bits[i] & (1 << j);
	}
    
    //获取可以容纳的位的个数
    size_t size()
    {
        return N;
    }

private:
	vector<char> _bits;
};

将一个整型数字x映射到位图中的具体的一个比特位。

  • 找到在第几个字节里面(以char为单位开辟的空间)
  • 找到在该字节的第几个位,并通过位操作(&、|、~)访问

以set()示例:

在这里插入图片描述

使用:

void test_bit_set1()
{
    bitset<100> bs1;
    bs1.set(8);
    bs1.set(9);
    bs1.set(20);

    cout << bs1.test(8) << endl;
    cout << bs1.test(9) << endl;
    cout << bs1.test(20) << endl;

    bs1.reset(8);
    bs1.reset(9);
    bs1.reset(20);

    cout << bs1.test(8) << endl;
    cout << bs1.test(9) << endl;
    cout << bs1.test(20) << endl;
}

位图的应用——题目

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

1 G = 1024 ∗ 1024 ∗ 1024 = 2 30 ≈ 10 亿 b y t e 1G = 1024*1024*1024=2^{30}\approx10亿byte 1G=102410241024=23010亿byte

40亿个整数大约需要占用16G空间大小

使用位图的话,用对应bit位的0/1来判断某个数字是否存在。

其中按照上述代码实现的bitset的话,template<size_t N>,最多可以传 2 32 − 1 2^{32} - 1 2321(4294967295,42亿多)大小的数字,这最大开辟42亿多比特位的空间,其中每个比特位都可以映射到对应的数。

bool judge()
{
    bitset<-1> bs;
    //bitset<0xffffffff> bs1;
    
    //将整数映射到位图bs中
    for()
    {
        bs.set(x);
    }
    
    //判断
    bs.test(x);
}

2.给定100亿个整数,设计算法找到只出现一次的整数?

状态:0次、1次、2次及以上

思路:使用两个bitset,一个表示高位,一个表示第位。一个数就有{00, 01, 10, 11}4种表示了

template<size_t N>
class twobitset
{
public:
	void set(size_t x)
	{
		bool inset1 = _bs1.test(x);
		bool inset2 = _bs2.test(x);

		// 00
		if (inset1 == false && inset2 == false)
		{
			// -> 01
			_bs2.set(x);
		}
		else if (inset1 == false && inset2 == true)
		{
			// ->10
			_bs1.set(x);
			_bs2.reset(x);
		}
		else if (inset1 == true && inset2 == false)
		{
			// ->11
			_bs1.set(x);
			_bs2.set(x);
		}
	}
	//出现一次的整数: 01
	void print_once_num()
	{
		for (size_t i = 0; i < N; ++i)
		{
			if (_bs1.test(i) == false && _bs2.test(i) == true)
			{
				cout << i << endl;
			}
		}
	}

private:
	bitset<N> _bs1;
	bitset<N> _bs2;
};
void test_bit_set3()
{
    int a[] = { 3, 4, 5, 2, 3, 4, 4, 4, 4, 12, 77, 65, 44, 4, 44, 99, 33, 33, 33, 6, 5, 34, 12 };

    twobitset<100> bs;
    for (auto e : a)
    {
        bs.set(e);
    }

    bs.print_once_num();
}

3.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

同上题,使用两个bitset,一个bitset映射一个文件,映射位都是1的值就是交集

4.位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

同上上题,使用两个位图,一个高位,一个低位。
出现0次(00)、出现1次(01)、出现2次(10)、出现3次及以上(11)。找01和10

总结

位图的特点:

  • 节省空间,快(直接定址法,不存在冲突)
  • 相对局限,只能映射处理整型

    🦀🦀观看~~

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

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

相关文章

[Selenium] 通过Java+Selenium查询文章质量分

文章目录 前言一、环境准备二、查询文章质量分2.1、修改pom.xml配置2.2、配置Chrome驱动2.3、引入浏览器配置2.4、设置无头模式2.5、启动浏览器实例&#xff0c;添加配置信息2.6、访问质量分地址2.7、窗口设置2.8、定位到输入框并输入博文地址2.9、定位到查询按钮并点击2.10、强…

三、Docker的基本组成和常用命令(二)

文章目录 容器命令创建并启动容器列举运行的容器退出容器命令启动容器重启容器停止容器强制停止容器删除容器 常用其他命令后台启动容器查看运行日志查看容器中的进程信息查看容器或镜像的元数据进入当前正在运行的容器从容器内拷贝文件到主机上 容器命令 说明&#xff1a;有镜…

【Linux】常用指令(二)

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 man指令 echo指令 补充: echo和cat的区别&#xff1f; CP指令 mv命令 ctrlc 指令 which指令 学习中遇到得问题: 1.如何看待指令&#xff1f; 2.在执行指令之前&#xf…

【MySQL】不就是MySQL——子查询

前言 今天我们来学习多表查询的下一个模块——子查询&#xff0c;子查询包括了标量子查询、列子查询、行子查询、表子查询&#xff0c;话不多说我们开始学习。 目录 前言 目录 一、子查询 1. 子查询的概念 2. 子查询语法格式 2.1 根据子查询结果不同可以分为&#xff1a;…

全志V3S嵌入式驱动开发(基于usb otg的spi-nor镜像烧入)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 说到了用usb otg来实现spi nand flash的烧入&#xff0c;这中间主要用到了PhoenixSuit软件。那么怎么用usb otg来实现spi nor flash的烧入呢&#…

从零开始 Spring Boot 47:缓存

从零开始 Spring Boot 47&#xff1a;缓存 图源&#xff1a;简书 (jianshu.com) Spring 提供一个简单但使用的缓存&#xff08;Cache&#xff09;机制&#xff0c;我们可以利用它来优化代码执行效率。 简单示例 老规矩&#xff0c;我们从一个简单示例开始&#xff1a; Serv…

RedHat红帽认证---RHCSA

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; RHCSA node1 1.配置网络设置 将 node1 配置为具有以下网络配置&#xff1a;主机名&#xff1a;node1.domain250.example.comIP 地址&#xff1a;172.25.250.100子网…

基于Java+Swing实现聊天室

基于JavaSwing实现聊天室 一、系统介绍二、功能展示三、其它1.其他系统实现 四、获取源码 一、系统介绍 Java聊天室系统主要用于实现在线聊天&#xff0c;基本功能包括&#xff1a;服务端和客户端。本系统结构如下&#xff1a; &#xff08;1&#xff09;服务端&#xff1a; 1…

SpringBoot中使用Tomcat、Undertow、jetty等容器

文章目录 SpringBoot中使用Tomcat、Undertow、jetty等容器&#xff1b;1. 默认使用Tomcat容器&#xff0c;直接运行项目即可&#xff1a;Java -jar xxx.jar2. 使用undertow容器2-1 引入Maven依赖&#xff0c;同时屏蔽内置Tomcat2-2 Undertow容器的常用配置参考2-3 一个特别的报…

人工智能---D分离

D分离&#xff08;D-Separation&#xff09;是一种用来判断变量是否条件独立的图形化方法。相比于非图形化方法&#xff0c;D-Separation更加直观&#xff0c;且计算简单。对于一个DAG&#xff08;有向无环图&#xff09;E&#xff0c;D-Separation方法可以快速的判断出两个节点…

c++11 标准模板(STL)(std::basic_streambuf)(三)

定义于头文件 <streambuf> template< class CharT, class Traits std::char_traits<CharT> > class basic_streambuf; 类 basic_streambuf 控制字符序列的输入与输出。它包含下列内容并提供到它们的访问&#xff1a; 1) 受控制字符序列&#xff…

在Android手机上安装kali Linux 的 QA

本文仅提供在安装时遇到问题的解决方案&#xff0c;查看安装链接请进入教程页面。 教程 https://www.hestudio.net/posts/install-kali-on-android-renew.html 一些命令 这里只说明我的教程涉及到的命令&#xff0c;查看其他博主教程的命令请转到对应博主的文档里查看&…

Linux 学习记录38(C高级篇)

Linux 学习记录38(C高级篇) 本文目录 Linux 学习记录38(C高级篇)一、shell中的分支语句1. case...in语句2. shell中的通配符 二、shell中的循环结构1. while循环2. shell中的printf3. for循环(1. 类似C中的格式(2. shell中的格式(3. 连续列表 4. select ...in 语句5. 辅助控制关…

PyQt学习(二)-----图形的建立(柱状图,折线图,堆叠柱状图,饼图)

数据库列表如图所示&#xff0c;如何对其进行绘图&#xff1a; &#xff08;一&#xff09;柱状图的建立 (1)柱状图初始化 self.__iniBarChart() pyqtSlot()def __iniBarChart(self):chart QChart()chart.setTitle("Barchart 演示")chart.setAnimationOptions(QChar…

md5的特点以及加密原理

MD5的特点及加密原理 简介特点1.长度固定2.结果不可逆3.高度离散性4.抗碰撞性 适用场景1.用户密码保护2.文件传输完整性校验3.数字签名4.云盘秒传 加密原理一.1.对输入的内容进行补位使其长度变成 N * 512 448 &#xff08;即长度对512取余之后 余数为448&#xff09;2.再往后补…

【数据可视化】大作业(意向考研高校的数据可视化)

文章目录 前言一、数据介绍1.1 基本信息1.2 考研信息1.3 导师信息 二、预处理及分析2.1 数据预处理2.1.1 考研信息预处理2.1.2 导师信息预处理 2.2 数据分析 三、可视化方法及结果3.1 可视化方法3.2 可视化结果展示3.2.1 基本信息3.2.2 考研信息3.2.3 导师信息 四、总结五、附录…

pip install安装CPM-Bee出现ModuleNotFoundError: No module named ‘torch‘的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

WPF开发txt阅读器18:用json格式存储配置文件

文章目录 json参数保存 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录&#x1f48e;快捷键翻页字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f48e;快进…

网工大题题型总结(2)---设备类型及设备故障问题

&#xff08;一&#xff09;设备选择 2018年上半年 试题一 根据表 1-1 及图 1-1 可知&#xff0c;在图 1-1 中为了保护内部网络&#xff0c;实现包过滤功能&#xff0c;位置A 应部署(6)设备&#xff0c;其工作在(7)模式. &#xff08;6&#xff09;防火墙 &#xff08;7&a…

AIGC教育(续篇):探索掌握AIGC,引领未来的人才之路

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; 1 未来人才的核心竞争力&#xff1a; 蓬勃绽放的潜力 展望未来&#xff0c;我们不禁思考&#xff1a;当自动化工具日益普及&#xff0c;且代替人力的成本并不高昂时&#xff0c;每个人的工具属性在未来工作中所占比重必…