算法通关村——从40个亿中产生一个不存在的整数

Titile: 海量数据场景下的热门算法题

从40个亿中产生一个不存在的整数

题目要求:给定一个输入文件,包含40亿个非负整数,请设计一个算法,产生一个不存在该文件中的整数,假设你有1GB的内存来完成这项任务。

  • 进阶:如果只有10MB的内存可用,该怎么办

位图存储大数据的原理

假设用哈希表来保存出现过的数,如果 40 亿个数都不同,则哈希表的记录数为 40 亿条,存一个 32 位整数需要 4B,所以最差情况下需要 40 亿 * 4B = 160 亿字节,大约需要16GB 的空间,这是不符合要求的。

40 亿 * 4B = 160 亿字节,大约需要16GB

40 亿 / 8 字节 = 5亿字节,大约 0.5GB 的数组就可以存下 40亿 个

image-20230901160541548

我们申请一个 40亿 的 bitArray 然后直接遍历这里的数据,假如遍历到了 1000 那么就找到 bitArray [1000 - 1] = 1 ,以此类推直到完成最后一个数字的遍历。之后进行第二次的遍历这个 bitArray 循环找到值为 0 的位置这个位置对应的 index + 1 就是不存在的整数

只有10MB来存储

只有 10MB 此时位图也失效了,因为类图最小需要大约 0.5GB 的内存才能进行处理先关的数据
此时就可以尝试使用分块思想,时间换空间,通过两次遍历来搞定

那么如何分块,分多少快才合理?

首先,我们要先大概估算一下,0.5G 大概是 500MB 所以只有 10MB 可以使用我们至少需要分为 50 块。但是我们一般分块都是 2 的倍数 当我们分成 64块的时候那么此时正好每一块大概是 8MB 那么这个就很合理当让如果我们如果分成 128块、256块也是完全问题的

那么我们这里就假设分成 64块进行处理

  • 第 0 区间:(0 ~ 67 108 863)
  • 第 1 区间(67 108 864~134 217 728)
  • 第 i 区间(67 108 864^i ~ 67 108 864^(i + 1) - 1)
  • 第 63 区间(4 227 858 432 ~ 4 294 967 295)。

第一次遍历,首先我们创建一个整型数组 countArr[0…63],使用 countArr[i] 用来统计区间 i 上的数有多少。然后使用当前的数字 i 和 67108864 进行取整操作,如果是 0 的话那么就是 第 0 区间上的值,如果是 12 那么还是第 0 区间的值进行countArr[0]++,那么这样的操作之后我们找到自己需要的 0 ~ 67 108 863 的数据的总共的大小,如果大小和 67108864 一样那么就证明这个区间里面没有一个所谓的 不存在的值

何时需要第二次遍历? 当然是对应的数据的长度小于 67108864 我们进行第二次的遍历
下面的步骤和第一个解法就有异曲同工直之妙了

  1. 申请长度为 67 108 864 的 bit map,这占用大约 8MB 的空间,记为 bitArr[0…67108863]。
  2. 遍历这 40 亿个数,此时的遍历只关注落在第 37 区间上的数,记为 num(num满足num/67 108 864==37),其他区间的数全部忽略。
  3. 如果步骤 2 的 num 在第 37 区间上,将 bitArr[num - 67108864*37]的值设置为 1,也就是只做第 37 区间上的数的 bitArr 映射。
  4. 遍历完 40 亿个数之后,在 bitArr 上必然存在没被设置成 1 的位置,假设第 i 个位置上的值没设置成 1,那么 67 108 864´37+i 这个数就是一个没出现过的数。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 5种索引应用

文章目录 简介一、聚集索引二、唯一索引三、聚集索引和唯一索引对比四、非唯一(普通)索引五、全文索引六、组合索引七、索引验证总结 简介 在本篇文章中,我们将学习MySQL中5种不同类型的索引及其应用场景,以及它们的优缺点。 一…

基于YOLOv8分割模型实现垃圾识别

基于YOLOv8分割模型实现垃圾识别 本文首发于公众号【DeepDriving】,欢迎关注。 0. 引言 YOLOv8是Ultralytics开源的一个非常火的AI算法,目前支持目标检测、实例分割、姿态估计等任务。如果对YOLOv8的安装和使用还不了解的可以参考我之前写的这篇文章&am…

从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr

目录 1. 智能指针的引入_内存泄漏 1.1 内存泄漏 1.2 如何避免内存泄漏 2. RAII思想 2.1 RAII解决异常安全问题 2.2 智能指针原理 3. auto_ptr 3.1 auto_ptr模拟代码 4. unique_ptr 4.1 unique_ptr模拟代码 5. shared_ptr 5.1 shared_ptr模拟代码 5.2 循环引用 6.…

(笔记六)利用opencv进行图像滤波

(1)自定义卷积核图像滤波 import numpy as np import matplotlib.pyplot as plt import cv2 as cvimg_path r"D:\data\test6-6.png" img cv.imread(img_path)# 图像滤波 ker np.ones((6, 6), np.float32)/36 # 构建滤波器(卷积…

Stable Diffusion中的ControlNet插件

文章目录 ControlNet的介绍及安装ControlNet的介绍ControlNet的安装 ControlNet的功能介绍ControlNet的应用与演示 ControlNet的介绍及安装 ControlNet的介绍 ControlNet 的中文就是控制网,本质上是Stable Diffusion的一个扩展插件,在2023年2月份由斯坦…

supervisorctl(-jar)启动配置设置NACOS不同命名空间

背景 由于需要在上海服务器上面配置B测试环境,原本上面已有A测试环境,固需要将两套权限系统分开 可以使用不同的命名空间来隔离启动服务 注:本文章均不涉及公司机密 1、新建命名空间 命名空间默认会有一个public,并且不能删除&a…

数据结构入门 — 栈

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。 博客主页&am…

Linux 忘记密码解决方法

很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?答案是不需要进入单用户模式更改一下root密码即可。 步骤如下: 重启linux系统 3 秒之内要按一下回车,出现如下界面 …

VUE笔记(十)Echarts

一、Echarts简介 1、什么是echarts ECharts是一款基个基于 JavaScript 的开源可视化图表库 官网地址:Apache ECharts 国内镜像:ISQQW.COM x ECharts 文档(国内同步镜像) - 配置项 示例:echarts图表集 2、第一个E…

滑动窗口实例4(将x减到0的最小操作数)

题目: 给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 ,返回 …

全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!

全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据! 1.简介 目标:基于pytorch、transformers做中文领域的nlp开箱即用的训练框架,提…

WebGPU加载Wavefront .OBJ模型文件

在开发布料模拟之前,我想使用 WebGPU 开发强大的代码基础。 这就是为什么我想从 Wavefront .OBJ 文件加载器开始渲染 3D 模型。 这样,我们可以快速渲染 3D 模型,并构建一个简单而强大的渲染引擎来完成此任务。 一旦我们有了扎实的基础&#x…

视频文件损坏无法播放如何修复?导致视频文件损坏的原因

如果我们遇到因视频文件损坏而无法正常播放,我们该怎么办?这种情况通常意味着视频文件已经损坏。我们不能访问、编辑或使用它们。那么应该用什么正确的工具和修复程序来修复视频呢? 视频文件损坏的原因 了解视频损坏如何修复之前&#xff0c…

【C51基础实验 LED流水灯】

51单片机项目基础篇 LED流水灯1、硬件电路设计和原理分析2、软件设计2.1、利用循环和移位操作符功能实现:LED流水灯2.2、利用利用封装好的库函数功能实现:LED流水灯 3、编译结果4、结束语 LED流水灯 前言: 前几篇学会了LED驱动原理&#xff…

Mysql001:Mysql概述以及安装

前言:本课程将从头学习Mysql,以我的工作经验来说,sql语句真的太重要的,现在互联网所有的一切都是建立在数据上,因为互联网的兴起,现在的数据日月增多,每年都以翻倍的形式增长,对于数…

数据库CPU飙高问题定位及解决

在业务服务提供能力的时候,常常会遇到CPU飙高的问题,遇到这类问题,大多不是数据库自身问题,都是因为使用不当导致,这里记录下业务服务如何定位数据库CPU飙高问题并给出常见的解决方案。 CPU 使用率飙升根因分析 在分…

概念解析 | 量子时代的灵感:探索量子感知技术

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:量子感知技术。 量子时代的灵感:探索量子感知技术 量子感知技术是一个充满希望和挑战的新兴领域。在此,我们将深入探讨这个主题,概述其背景,解释其工作原理,讨论现有的…

mov怎么改成mp4?跟我一起操作吧

mov怎么改成mp4?mov因为并不是一种常见的视频文件格式,因此大家对这种视频文件可能知道的并不多,但如果你是用的是苹果手机,那么你会发现苹果手机拍摄的视频转移到电脑上后就是mov格式的,因为mov格式的视频并没有受到大…

JDBC使用了哪种设计模式

JDK中提供了操作数据库的接口,比如 java.sql.Driver java.sql.Connection java.sql.Statement java.sql.PreparedStatement 不同的数据库厂商提供操作自己数据库的驱动包, 比如mysql public class Driver extends NonRegisteringDriver implements jav…

一篇文章带你了解-selenium工作原理详解

前言 Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome&#xff0c…