【面试题】位图

news2025/1/18 7:41:45

文章目录

  • 位图
  • 如何添加数据
  • 如何删除数据
  • 代码实现
  • 给100亿个整数,如何找到只出现一次的数字
  • 代码实现
  • 给两个文件,分别有100亿个整数,但只有1g内存,如何找到文件的交集?
  • 1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

位图

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

中。【腾讯】

  1. 遍历,时间复杂度O(N)
  2. 排序(O(NlogN)),利用二分查找: logN

申请512M的内存

一个bit位代表一个unsigned int值

读入40亿个数,设置相应的bit位

读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在

我们可以用每一个二进制位来记录一个数据,一个int本来只能记录一个数据的,现在可以记录64个数字了,大大减少的空间。

在小端存储的机器上是这样存储的:数据高字节保存在内存的高地址中,数据的低字节保存在低地址中。

比如我要把19记录进去

19/8=2

19%8=3

从0开始算,原本19/8=2,因此是在第三个字节当中,第3个位置(位置从0开始算)。

如何添加数据

如果我要把6这个数据添加到位图当中,初始化的位图的状态是全0。

如下图所示(位图的初始状态):

00000000

6/8=0;

6%8=6;

因此就是在第0个字节中第6个位置。

可以构造出一个如下的二进制序列

01000000

将两个二进制序列**按位或(|)**一下,0|1=1,0|0=0,不会对其他位置的数据造成改变。

那么如何进行构造呢?

只要将1左移(<<)j个位置即可1<<j

如何删除数据

如果我要把6这个数据从位图当中删除

6/8=0;

6%8=6;

因此就是在第0个字节中第6个位置。

如下图所示(位图的初始状态):

01000000

可以构造出一个如下的二进制序列

10111111

将两个二进制序列**按位与(&)**一下,0&1=0,0&0=0,1&1=1,不会对其他位置的数据造成改变。

那么如何进行构造呢?

只要将1左移(<<)j个位置然后按位取反即可~(1<<j)

代码实现

namespace mudan
{
	template<size_t N>
	class bitset
	{
	public:

		bitset()
		{
			_bits.resize(N / 8 + 1, 0);//计算出需要多少字节来存储
		}

		void set(size_t x)
		{
			size_t i = x / 8;
			size_t j = x % 8;

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

		void reset(size_t x)
		{
			size_t i = x / 8;
			size_t j = x % 8;

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

		bool test(size_t x)
		{
			size_t i = x / 8;
			size_t j = x % 8;

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

	private:
		vector<char> _bits;
	};

	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;

		cout <<"=====================" << 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;
	}
}

测试结果可以看到正常运行了,可以查到找这个数字,删除之后就无法查找到了。

给100亿个整数,如何找到只出现一次的数字

可以用两个位图来记录情况

分类:

出现0次:00

出现1次:01

1次以上:10

代码实现

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)
			{
				//出现了一次,变成一次以上
				_bs1.set(x);//1
				_bs2.reset(x);//0
			}
			else if (inset1 == true && inset2 == false)
			{
				//10->11
				_bs1.set(x);
				_bs2.set(x);
			}
		}

		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();
	}

可以看到,把只出现了一次的数字筛选出来了。

一次类推,出现两次三次四次五次六次都可以用这种方法。

给两个文件,分别有100亿个整数,但只有1g内存,如何找到文件的交集?

这个其实也简单,开两个位图,然后遍历位图是1 1就代表存在交集,反之没有。

1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

和之前的解决方式类似,记录几种状态

0次:00

1次:01

2次:10

3次及以上:11

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

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

相关文章

如何使用ArcGIS Pro制作建筑立体效果

虽然ArcGIS Pro已经将二三维场景融合于一个软件之中&#xff0c;但是在某些使用场景下&#xff0c;我们只需要看到建筑的立体效果就行&#xff0c;不用实际的三维建筑效果&#xff0c;毕竟三维的效果对硬件的要求更高&#xff0c;地图的加载效率也没有二维好&#xff0c;所以这…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

住宅小区门禁管理,居然还能这样做!

安全是我们生活中最重要的一环。而在现代社会&#xff0c;门禁监控系统成为了保障居民安全的重要措施之一。 门禁系统利用先进的人脸识别技术&#xff0c;为小区居民带来了更高效、更安全的出入管理体验&#xff0c;更为居民创造了便捷、智能的生活方式。 客户案例 东莞市某花…

Flask项目打包为exe(附带项目资源,静态文件)

1.在项目根目录创建my_app.spec文件&#xff0c;内容如下&#xff1a; # -*- mode: python ; coding: utf-8 -*-block_cipher Nonea Analysis([server.py], # flask入口pathex[],binaries[], datas[("E:/**/templates","/templates"),("E:/**/s…

SpringBoot3 整合Prometheus + Grafana

通过Prometheus Grafana对线上应用进行观测、监控、预警… 健康状况【组件状态、存活状态】Health运行指标【cpu、内存、垃圾回收、吞吐量、响应成功率…】Metrics… 1. SpringBoot Actuator 1. 基本使用 1. 场景引入 <dependency><groupId>org.springframew…

大数据之Hadoop(一)

目录 一、准备三台服务器 二、虚拟机间配置免密登录 三、安装JDK 四、关闭防火墙 五、关闭安全模块SELinux 六、修改时区和自动时间同步 一、准备三台服务器 我们先准备三台服务器&#xff0c;可以通过虚拟机的方式创建&#xff0c;也可以选择云服务器。 关于如何创建虚…

fatal error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译

问题 默认情况下&#xff0c;对象文件最多可存放 65,536 (2^16) 个可寻址的节。 /bigobj将该地址容量增加至 4,294,967,296 (2^32)。大多数模块将从来不会生成包含数超过 65,536 的 .obj 文件。 但是&#xff0c;计算机生成的代码或大量使用模板库的代码可能需要可存放更多节的…

python爬虫(五)_urllib2:Get请求和Post请求

本篇将介绍urllib2的Get和Post方法&#xff0c;更多内容请参考:python学习指南 urllib2默认只支持HTTP/HTTPS的GET和POST方法 urllib.urlencode() urllib和urllib2都是接受URL请求的相关参数&#xff0c;但是提供了不同的功能。两个最显著的不同如下&#xff1a; urllib仅可以…

人工智能技术

目录 1.什么是人工智能 2.人工智能的由来 3.人工智能的代表作 4.人工智能给人类带来的福利 1.什么是人工智能 人工智能 (Artificial Intelligence, AI) 是一门研究计算机如何模拟、模仿以及执行人类智能活动的科学与技术领域。它涉及了构建智能代理体系&#xff0c;使其能够…

电脑怎么设置密码?简单4招,轻松给电脑上锁!

“新买了部电脑&#xff0c;最近在使用时保存了一些比较重要的文件&#xff0c;想给电脑设置个密码以防文件泄露。电脑怎么设置密码呢&#xff1f;求答案&#xff01;” 电脑对我们的生活越来越重要&#xff0c;我们会将很多重要的文件数据等都保存在电脑中。如果电脑没有设置密…

arcgis字段计算器

1、两字段叠加。要求待叠加的字段类型为文本或字符串类型。如下&#xff1a; 2、字符串部分提取。

【《Python树莓派编程从零开始(第3版)》——树莓派编程的优秀指南】

通过阅读《Python树莓派编程从零开始(第3版)》&#xff0c;你将学会配置树莓派&#xff0c;编写并调试Python程序;学会使用Python的字符串、列表、函数和字典&#xff0c;以及模块、类方法等;还可以使用pygame创建用户友好的游戏&#xff0c;使用guizero构建直观的用户界面&…

【数据结构】快速排序

快速排序是一种高效的排序算法&#xff0c;其基本思想是分治法。它将一个大问题分解成若干个小问题进行解决&#xff0c;最后将这些解合并得到最终结果。 快速排序的主要思路如下&#xff1a; 选择一个基准元素&#xff1a;从待排序的数组中选择一个元素作为基准&#xff08;…

DataBase 1. kaggle 发现无法显示验证码进行人机交互怎么办?

这期开始增加一个系列就是我们经常用到的数据库或者网站&#xff0c;便于我们查找数据&#xff0c;在线分析数据&#xff0c;若能很好的利用别人的工具&#xff0c;就没必要自己一句一句码代码&#xff0c;最主要的是不断出现各种bug处理不了&#xff0c;东问西问搞不定&#x…

css在线代码生成器

这里收集了许多有意思的css效果在线代码生成器适合每一位前端开发者 布局&#xff0c;效果类&#xff1a; 网格生成器https://cssgrid-generator.netlify.app/ CSS Grid Generator可帮助开发人员使用CSS Grid创建复杂的网格布局。网格布局是创建Web页面的灵活和响应式设计的强…

面试题学习以及问题

redis redis缓存 缓存穿透 布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是 redisson实现的布隆过滤器。 它的底层主要是先去初始化一个比较大数组&#xff0c;里面存放的二进制0或1。在一 开始都是0&#xff0c;当一个key来了之后经过3次hash计算&…

C#--调用Python(包含第三方库)

1. C# 调用 Python 常见的方法有4种 参考链接 1.1 Pythonnet &#xff08;推荐&#xff09; 可以很好的支持第三方库。 推荐这个&#xff0c;经本人验证这个很好用。 后文 2. 详细使用。 1.2 IronPython 如果使用第三方库就放弃这个吧&#xff0c;真的用不了&#xff0c;使…

大规模向量检索库Faiss学习总结记录

因为最近要使用到faiss来做检索和查询&#xff0c;所以这里只好抽出点时间来学习下&#xff0c;本文主要是自己最近学习的记录&#xff0c;来源于网络资料查询总结&#xff0c;仅用作个人学习总结记录。 Faiss的全称是Facebook AI Similarity Search&#xff0c;是FaceBook的A…

【C语言进阶篇】结构体都学完了,那么现造第一个通讯录呢?(内附源码)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言一 、 通讯录的简介1.1 联系人的类型定义1.2 通讯录的定义1.3 通讯录要实现的功能 二 、 如何…

Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

技术背景 我们在Android平台实现GB28181设备接入&#xff0c;把摄像头和麦克风数据&#xff0c;采集过去&#xff0c;用于移动单兵、智能车载、智慧安防、智能家居、工业仿真等行业时&#xff0c;发现大多场景对视频水印的要求越来越高&#xff0c;从之前的固定位置静态文字水…