海量数据小内存!从未出现过的数在哪里

news2024/11/24 11:06:40

文章目录

    • 题目
    • 要求
      • 1)内存 1G
      • 2)内存 3 KB
      • 3)内存 有限变量
      • 举例

题目

现在有 40 亿个无符号整数,无符号整数的范围是 0 ~ 232-1(42亿+),哪怕 40 亿个数完全不同,在该范围中也总有没有出现过的数,试问如何找到所有该范围中没出现过的数?

要求

1)内存 1G

直接使用位图

常见的存储数据单位有 int,long等,而位图则是采用作为单位来存储数据,使用一个或者多个位来标记某个元素对应的值

位图是通过位数组来表示对应的元素是否存在的。像在本题中无符号整数一共有 232 个,如果使用位数组来表示每个数有没有出现过(0 表示没出现过,1 表示出现过),那么差不多只要花费 500 MB 的空间就可以表示这 232 个数

在这里插入图片描述

那么之后我们只需要遍历这 40 亿个数,如果出现过就将位数组中对应的位置标记为 1,如果从未出现过,那么对应的位一定还是 0

最后位数组中还是 0 的位对应的数就是我们要找的从未出现过的数们

2)内存 3 KB

内存只有 3 KB,但是只需要找到一个没有出现过的数即可

将这 3 KB的内存都拿来申请 int 类型的数组,该数组中元素的个数为 2 的某次方,那么 3 KB最多可以申请到 2 的 9 次方大小(512)的 int 类型的数组

在这里插入图片描述

既然为 2 的某次方,就意味着 512 一定可以被 2 的32 次方整除,那么我们就把 2 的32 次方平均分成 512 份,每一份应该有 2 的 23 次个数

接下来,我们就可以遍历这 40 亿个数,遍历到数字 X,我们就把该数除以 2 的 23 次方,来看看,这个数属于哪个范围,将数组对应的位置的值加一

如果说一共有 2 的 32 次方个数(每个数都是不同的),那么将上面的数进行以上的操作,最后 512 个 int 的值都会是 2 的 23 次方

由于现在只有 40 亿个数,并且只要求找到一个没有出现过的数即可,那就意味着,数组中一定会有一个 int 的值不足 2 的 23 次方

既然如此,就可以将缺少的数定位到该区间内,再将该区间内的值分成 512 份,进行之前类似的操作,每一份就是 2 的 14 次方个数,周而复始,一定能够定位到没有出现过的数

3)内存 有限变量

只提供有限几个变量,如何找到一个没有出现过的数

原理和上面的方法差不多,只不过没有办法申请更多元素的 int 数组罢了,没有办法将 2 的32 次方的数分成更多份,那我们可以进行二分,就有两个区间 [0,231-1] 和 [231,232-1]

如果只有 40 亿个数,将其遍历,找两个变量分别统计两个区间出现的数的个数,最后找到一个没有满 2 的 31 次方的区间,继续二分,那么最多分 32 次,一定能够找到一个没出现过的数

举例

如果理解有困难,我们可以将数量变小,进行举例

比如一共有 9 个数(5,8,2,0,3,2,9,4,3),这 9 个数都在 [0,9] 这个范围内,那么至少有一个数在范围内但是不在提供的 9 个数中,请找出没有出现过的数

按照位图的解法,就相当于内存足够让我们申请一个有 10 位的数组

在这里插入图片描述

依次遍历这 9 个数,如果出现就将对应的位的位置标记成 1,就像下面这样

在这里插入图片描述

遍历完成后,就会发现没出现过的数是 1、6、7

在这里插入图片描述

再举另外一个例子

比如一共有 9 个数(5,8,14,0,10,2,9,4,3),这 9 个数都在 [0,15] 这个范围内,那么至少有一个数在范围内但是不在提供的 9 个数中,只提供 20 个字节的内存,请找出一个没有出现过的数

按照申请数组的方法就应该是这样的

一共只有 20 个字节,那么申请的 int 类型的数组最多有 4 个元素(必须是 2 的某次方),如果将提供的 9 个数分别除以 4 来确定每个数应该存在哪个范围,从而数组对应的位置值加一,比如 9,除以 4 就是 2,那么数组第 2 个值加一。

在这里插入图片描述

遍历完成后

在这里插入图片描述

题目只要求找到一个没出现过的数即可,发现数组下标为 0 的值为 3,没有满 4,说明 0~3 这个范围内一定有数没有出现过,将下一轮搜查的范围限制到 0~3,继续之前的操作

在这里插入图片描述

最后可以发现 1 从未出现过

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

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

相关文章

傻白探索Chiplet,关于EPYC Zen2 的一些理解记录(五)

目录 一、知识铺垫 (1)Chiplet (2)Zen架构 (3)EPYC和Ryzen (4)EPYC Zen2 二、关于EPYC Zen2里的部件 (1)内存控制器 (2&#xff…

Python本地下载-实例的SQL审计日志

简介:使用阿里云的RDS数据库,开启DAS的数据库治理服务。会产生大量的审计日志。 我们有2T的审计日志数据,保留180天,每小时收费空间:0.008元/GB/小时 计算下来:2x1024x 24x 30 x 0.008 11796 元 解决&…

分类预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络分类预测(语音分类)

分类预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络分类预测(语音分类) 目录 分类预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络分类预测(语音分类)基本描述模型结构设计过程参考资料基本描述 传统的语音识别技术,主要在隐马尔可夫模型和高斯混合模型两大”神器“的加持…

[element plus] 分页组件使用 - vue

学习关键语句: 饿了么加组件分页组件 element分页组件 vue3 饿了么分页组件 写在前面 必须要说明的是 , 这篇文章使用的分页组件样式包含了饿了么官方给出警告以后会弃用的部分 但是问题是什么呢? 问题就是我还没找到这个用 vmodel 绑定的使用方法 , 再加上现在也算是有点…

C++代码简化之道

1. 善用emplace C11开始STL容器出现了emplace(置入)的语义。比如 vector、map、unordered_map,甚至 stack和 queue都有。 emplace方便之处在于,可以用函数参数自动构造对象,而不是向vector的push_back,ma…

论文投稿指南——中文核心期刊推荐(电工技术2)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

机器人开发--霍尔元件

机器人开发--霍尔元件1 霍尔效应2 霍尔元件特点3 霍尔传感器的典型应用电流传感器位移测量测转速或转数参考1 霍尔效应 霍尔效应是电磁效应的一种,这一现象是美国物理学家霍尔于1879年在研究金属的导电机制时发现的。当电流垂直于外磁场通过半导体时,载…

ORB-SLAM2 --- Tracking::SearchLocalPoints函数解析

1.函数作用 用局部地图点进行投影匹配,得到更多的匹配关系。 局部地图点中已经是当前帧地图点的不需要再投影,只需要将此外的并且在视野范围内的点和当前帧进行投影匹配。 2.函数流程 Step 1:遍历当前帧的地图点,标记这些地图点不…

Mycat(6):mycat简单配置

1 找到conf/schema.xml并备份 2 配置虚拟表table[在schema里面] 其中 sharding-by-intfile 为rule.xml中的规则 规则文件为conf文件夹中的partition-hash-int.txt 3 配置数据节点dataNode 现在数据库新建3个数据库,skywalking,skywalking1,s…

[附源码]计算机毕业设计Python的低碳生活记录网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

MapReduce 排序

文章目录WritableComparable 排序一、排序概述1、排序分类2、自定义排序(1)、原理分析二、WritableComparable 排序案例(全排序)1、需求WritableComparable 排序 一、排序概述 排序是MapReduce框架中最重要的操作之一 MapTask和ReduceTask均会对数据按照key进行排序&#xff…

使用c++部署tensorrt加速yolov7

先放上一张我运行成功的截图,只要跟着我的教程一步一步按操作,下载好匹配的软件是一定可以成功的! 我相信想要在C++平台使用tensorrt加速的朋友们也是有很强的计算机基础的,那么简单的部分我们就跳过,重点是和大家介绍模型转换的部分以及环境的搭建。 一. 环境 我的cudn…

docker-compose安装部署

一、前言 docker compose 给容器做单机编排的。Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 docker compose是docker的独立产品,因此安装docker compose之前需要安装docker,Centos部署Docker_crazyK.的博…

高斯信号的贝叶斯步长最小均方算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

云原生爱好者周刊 | 使用 WASM 来写博客是什么感觉?

开源项目推荐 zzhack zzhack 是一个静态博客框架,是一个纯正的 WASM 应用,它由 Rust & Yew 来作为技术栈进行搭建,UI 设计比较美观,大家也可以直接使用该项目的设计模板零成本构建 WASM 应用。 Tracee Tracee 是一个运行时…

数据结构与算法之双向链表的设计与实现

文章目录前言一、双向链表1.1 概念1.2 双向链表的应用1.3 双向链表的node方法1.4 双向链表的add方法1.5 双向链表的remove方法1.6 整体代码1.7 接口测试二、对比学习2.1 单向链表 vs 双向链表2.2 双向链表 vs 动态数组2.3 ArrayList和LinkedList的区别前言 文章链接之前所介绍…

基于python的C环境安装(NLP文本纠错项目使用)

1.下载c环境:(window系统) 链接:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 2.安装 1.打开下载的安装包 2.进入如下页面,按照下图进行勾选,注意,其它不要动…

全渠道营销与多渠道营销:定义、比较、示例

关键词:全渠道营销、多渠道营销 全渠道还是多渠道?您正在踏上跨境电子商务之旅,为您的品牌寻找合适的营销策略,但这一切似乎都过于理论化和复杂。 我们将使事情变得更容易,因为本文全面解释了多渠道营销和全渠道营销之…

【文本检测】1、DBNet | 实时场景文本检测器

文章目录一、背景二、方法2.1 二值化2.2 Adaptive threshold2.3 可变形卷积2.4 生成标签2.5 优化过程三、效果3.1 实验数据3.2 实验细节3.3 消融实验3.4 和其他方法的对比论文:Real-time Scene Text Detection with Differentiable Binarization 代码:h…

不懂应该怎么选合适的医疗器械进销存?

在医院运行过程中,需要管理医疗设备的采购、养护、报废等各个环节。医疗器械进销存软件是集医院设备、物资、耗材的申请、采购、出入库、维修、维护、折旧、固定资产管理、效益分析等全流程管理功能于一体,实现医院医疗设备的信息化,数据库规…