【C++】bitset位图的简单模拟实现及常见面试题

news2024/11/20 10:41:28

文章目录

  • 前言
  • 一、 bitset模拟实现
  • 二、 常见面试题
    • 1.给你一百亿个整数,找到只出现一次的数字
    • 2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?


前言

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

数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:
在这里插入图片描述

一、 bitset模拟实现

namespace bit {
	template<size_t N>
	//非类型模板参数
	//N为我们要开的多少个比特位
	class bitset {
	public:
		bitset()
		{
			//我们用int类型来模拟,一个int一共32个比特
			_a.resize(N / 32 + 1);
		}

		void set(size_t x) {
			//将对应比特位变为1
			int i = x / 32;
			//i为在第几个int中
			int j = x % 32;
			//j为在这个int的32个比特位的哪个位置
			_a[i] |= (1 << j);
			//按位或::只有双方对应位置都是0的时候才为0

		}

		void reset(size_t x) {
			//将对应比特位变为0
			int i = x / 32;
			int j = x % 32;
			_a[i] &= (~(1 << j));
			//按位与::只有双方对应位置都是1的时候才为1
			//左移后按位取反,相当于除了j位置为0其他位置都为1,按位与的时候其他位
			//不受影响
		}

		bool test(size_t x) {
		//判断这个位置存不存在
			int i = x / 32;
			int j = x % 32;
			//这里按位与并没有改变原来值的大小,
			//因为返回的是一个临时变量
			return _a[i] & (1 << j);
		}

	private:
		vector<int> _a;
	};

在这里插入图片描述
在这里插入图片描述

二、 常见面试题

1.给你一百亿个整数,找到只出现一次的数字

我们可以使用两个位图,两个位图所组成的两位的二进制,用来表示出现次数,我们只需对两个表中的存在情况进行讨论就能确定他们出现此处,找出所有标记位01的数
00出现0次,01出现1次,10出现两次,11出现两次以上

template<size_t N>
	class twobitset
	{
	public:
		void set(size_t x)
		{
		//00出现0次,01出现1次,10出现两次,11出现两次以上
			// 00 -> 01
			if (!_bs1.test(x) && !_bs2.test(x))
			{
				_bs2.set(x);
			} // 01 -> 10
			else if (!_bs1.test(x) && _bs2.test(x))
			{
				_bs1.set(x);
				_bs2.reset(x);
			}
			// 本身10代表出现2次及以上,就不变了
		}

		bool is_once(size_t x)
		{
			return !_bs1.test(x) && _bs2.test(x);
		}
	private:
		bitset<N> _bs1;
		bitset<N> _bs2;
	};

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

两个文件分别放到位图里面,然后判断两个位图的相同位置值是否相同。

int main()
{
	int a1[] = {1,2,3,3,4,4,4,4,4,2,3,6,3,1,5,5,8,9 };
	int a2[] = {8,4,8,4,1,1,1,1};

	bit::bitset<10> bs1;
	bit::bitset<10> bs2;

	// 去重
	for (auto e : a1)
	{
		bs1.set(e);
	}

	// 去重
	for (auto e : a2)
	{
		bs2.set(e);
	}

 	int N=10;
 	//N为两个文件中的最大值
	for (int i = 0; i < N; i++)
	{
	//遍历如果在两个位图中相同位置都为1说明为交集
		if (bs1.test(i) && bs2.test(i))
		{
			cout << i << " ";
		}
	}
	cout << endl;
}

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

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

相关文章

Java Fluent编程

背景 Fluent Api最早是由Martin Fowler1提出的一种简洁的编程风格, 其每一步的执行都返回一个对象并可用于进一步的方法调用. 这样的编程风格可以很好的简化某些领域的开发, 并显著地提高代码的可读性和可维护性. 无论是在Java的流式api中, 还是众多DLS中都有它的身影. 原因主…

应急响应学习

网站 首先确定网站的基本信息&#xff0c;如语言&#xff0c;数据库&#xff0c;中间件&#xff0c;CMS&#xff0c;系统等。对网站可能存在的漏洞有初步判断 基于时间分析 询问管理员&#xff0c;确定网站发生异常的时间 查看日志&#xff0c;查看状态码&#xff0c;200为成…

Avl树(有详细图解)

目录 介绍 引入 概念 特点 模拟实现 思路 插入 旋转 左旋 无子树 有子树 右旋 无子树 有子树 左右旋 引入(也就是有子树版本的抽象图解) 解决方法(也就是左右旋) 总结 无子树(也就是curright的位置就是newnode) 有子树 模型高度解释 旋转 更新三个…

如何像开发人员一样思考_成为一个问题解决者

程序员在处理大问题时通常会将其分解成多个小问题来解决。这个过程通常被称为“分解”或“分治”&#xff0c;它是一种将复杂问题分解成可管理的小问题的方法。 以下是程序员思考如何将大问题分解成小问题的一些步骤&#xff1a; 确定问题域&#xff1a;程序员需要了解和理解问…

Kettle REST Client获取token调用接口解析JSON入文件实战

Kettle REST Client通过GET获取token以POST方式请求接口解析JSON入文件完整实例 需求说明 通过kettle组件调用接口并解析JSON成结构化数据入文件。 完整实例 解决方法 利用生成记录组件定义URL参数通过REST ClENT组件请求得到TOKEN通过JSON INPUT组件解析接口请求的结果通过…

vue3新语法糖<script setup>

各种使用方法参考&#xff1a;(184条消息) 【vue3学习系列】组合式api中&#xff0c;替代setup()函数的&#xff1c;script setup&#xff1e;特性写法_庞囧的博客-CSDN博客https://blog.csdn.net/pagnzong/article/details/121733394 一、参考&#xff1a;Vue3 script setup …

Git版本控制:入门到精通

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

简单的自托管书签服务NeonLink

什么是 NeonLink &#xff1f; NeonLink 是一个简单且开源的自托管书签服务。它是轻量级的&#xff0c;使用最少的依赖项&#xff0c;并且易于通过 Docker 安装。由于系统要求较低&#xff0c;该应用程序非常适合部署在 RaspberryPI 上。 安装 在群晖上以 Docker 方式安装。 …

图片可变码怎么做?可编辑二维码制作教程

现在很多人会将拍摄的图片转二维码来展示&#xff0c;这种方法能够有效的让更多人更快的查看图片内容&#xff0c;那么图片生成二维码该怎么做呢&#xff1f;有些小伙伴知道现在二维码可以在图案不变情况下修改内容&#xff0c;如果我们需要不断填充照片&#xff0c;那么这种类…

4.基本IO口操作

CC2530端口资源&#xff1a;三个端口&#xff0c;表示为 P0、P1 和 P2。P0 和 P1 是完全的 8 位端口&#xff0c;而 P2 仅有 5 位可用 CC2530的IO口的一些功能&#xff1a; 通用IO口、外设IO口&#xff08;定时器、USART、ADC&#xff09; 输入引脚、输出引脚 当输入时&#…

奇安信天擎Linux客户端部署相关事项

奇安信天擎Linux客户端部署 一 Linux天擎客户端部署在线部署离线部署 二 Linux 单机部署需要开放的端口三 Linux天擎客户端停止和启动天擎的命令四 Linux天擎客户端卸载五 卸载后检查六 Linux天擎客户端病毒库更新操作步骤七 Linux客户端是否有补丁库&#xff1f; 一 Linux天擎…

设备巡检电力水利物业巡检小程序开源版开发

设备巡检电力水利物业巡检小程序开源版开发 以下是设备巡检电力水利物业巡检小程序开源版的可能功能列表&#xff1a; 用户登录/注册&#xff1a;用户可以通过手机号或其他方式进行登录和注册。 首页展示&#xff1a;展示设备巡检电力水利物业巡检小程序的基本信息和操作指南…

6.1 KMP算法搜索机器码

KMP算法是一种高效的字符串匹配算法&#xff0c;它的核心思想是利用已经匹配成功的子串前缀的信息&#xff0c;避免重复匹配&#xff0c;从而达到提高匹配效率的目的。KMP算法的核心是构建模式串的前缀数组Next&#xff0c;Next数组的意义是&#xff1a;当模式串中的某个字符与…

【力扣】83. 删除排序链表中的重复元素

题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输…

笔试强训Day(一)

T1&#xff1a;组队竞赛 链接&#xff1a;组队竞赛__牛客网 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个队员…

【DDPM论文解读】Denoising Diffusion Probabilistic Models

0 摘要 本文使用扩散概率模型合成了高质量的图像结果&#xff0c;扩散概率模型是一类受非平衡热力学启发的潜变量模型。本文最佳结果是通过根据扩散概率模型和朗之万动力学的去噪分数匹配之间的新颖联系设计的加权变分界进行训练来获得的&#xff0c;并且本文的模型自然地承认…

Jupyter Notebook中的魔法命令

关于魔术命令 Jupyter Notebook 使用的 Python 内核通常是 IPython 内核。IPython 是 Python 的增强交互式解释器&#xff0c;它提供了许多额外的功能&#xff0c;使得在 Jupyter Notebook 中编写和执行 Python 代码更加方便和强大。所以jupyter使用的是IPython的语法 IPytho…

彩色图像处理在数字图像处理中的应用(数字图像处理概念 P5)

文章目录 彩色模型伪彩色处理全彩色数字图像处理基础彩色变换平滑和锐化 彩色模型 伪彩色处理 全彩色数字图像处理基础 彩色变换 平滑和锐化

有名管道及其应用

创建FIFO文件 1.通过命令&#xff1a; mkfifo 文件名 2.通过函数: mkfifo #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 参数&#xff1a; -pathname&#xff1a;管道名称的路径 -mode&#xff1a;文件的权限&a…

MySQL学习笔记5

1、MySQL中的SQL语句&#xff1a; SQL 是 Structure Query Language(结构化查询语言)的缩写,它是使用关系模型的数据库应 用语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型关 系语言,实现了关系数据库中的信息检索。 20 世纪 80 年代初,美…