[Go版]算法通关村第十五关黄金——继续研究超大规模数据场景的问题

目录

海量数据中,此时普通的数组、链表、Hash、树等等结构有无效了 ,因为内存空间放不下了。而常规的递归、排序,回溯、贪心和动态规划等思想也无效了,因为执行都会超时,必须另外想办法。这类问题该如何下手呢?这里介绍三种非常典型的思路:

  1. 使用位存储,使用位存储最大的好处是占用的空间是简单存整数的1/8。例如一个40亿的整数数组,如果用整数存储需要16GB左右的空间,而如果使用位存储,就可以用2GB的空间,这样很多问题就能够解决了。

  2. 如果文件实在太大 ,无法在内存中放下,则需要考虑将大文件分成若干小块,先处理每个块,最后再逐步得到想要的结果,这种方式也叫做外部排序。这样需要遍历全部序列至少两次,是典型的用时间换空间的方法

  3. 如果在超大数据中找第K大、第K小,K个最大、K个最小,则特别适合使用堆来做。而且将超大数据换成流数据也可以,而且几乎是唯一的方式,口诀就是“查小用大堆,查大用小堆”。
    常识补充:10亿 ≈ 1G、100万 ≈ 1M

题目:对20GB文件进行排序

解决思路:外部排序 + 两两合并

  1. 需要先考虑内存要求、时间要求等限制条件,然后根据要求确定需要划分为多少块进行处理。
  2. 比如内存限制为1GB,则将20GB文件分为20块文件。
  3. 对每块文件进行排序。
  4. 最后两两合并即可。(也可以使用堆排序策略合并)

题目:超大文本中搜索两个单词的最短距离

题目要求:有个超大文本文件,内部是很多单词组成的,现在给定两个单词,请你找出这两个单词在这个文件中的最小距离,也就是像个几个单词。你有办法在 O(n)时间 里完成搜索操作吗?方法的空间复杂度如何。
在这里插入图片描述

解决思路:双指针法

使用两个指针来记录两个单词的索引位置,通过遍历文本文件,不断更新这两个指针,以便计算最小距离。

  1. 声明两个指针,初始都默认指向-1;再声明一个变量length,用于接收两个单词的距离。
  2. 遍历这个文本文件,
    • 遇道单词1,就让指针1指向单词1的索引,
    • 遇道单词2,就让指针2指向单词2的索引,
    • 如果指针1和指针2都>0时,算出两指针的距离,如果该距离比<length,就赋值给length。
  3. 遍历完了之后,此时length就是两个单词的最短距离。

复杂度:时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1)

题目:从10亿数字中寻找最小的100万个数字

题目要求:设计一个算法,给定一个10亿个数字,找出最小的100万的数字。假定计算机内存足以容纳全部10亿个数字。

解决思路

方案1:对10亿数字做 快速排序,返回前100万个。

对10亿数字做升序的快速排序后,前100万个就是最小的100万个数字了。

复杂度:时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)、空间复杂度 O ( l o g n ) O(logn) O(logn)

所需内存大概4G左右,太高不推荐。

方案2:对10亿数字做 选择排序,100万次

对10亿数字做选择排序,每次遍历找到当前最小的数字,遍历100万次就能找到最小的100万个数字了。

复杂度:时间复杂度 O ( n m ) O(nm) O(nm)、空间复杂度 O ( m ) O(m) O(m)

时间复杂度为:10亿*100万次,这个效率一般的服务器都达不到。

方案3【推荐】:维护长度为100万的最大堆

  1. 构建一个长度为100万的最大堆,
  2. 遍历10亿-100万中剩余的数字,依次和堆顶比较,如果 < 堆顶,就跟堆顶交换,然后最大堆化。
  3. 最后该最大堆就是最小的100万个数字。

补充说明:
如果数据量没有这么大,也可以直接使用这种方式。
如果将10亿数字换成流数据,也可以使用堆来找,而且对于流数据,几乎只能用堆来做。

复杂度:时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)、空间复杂度 O ( m ) O(m) O(m)

所需内存为 100万*4B ≈ 4MB ,可以接受。

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

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

相关文章

接口优化通用方案

目录 批量异步、回调缓存预取池化并行锁粒度索引大事务海量数据 批量 批量思想&#xff1a;批量操作数据库 优化前&#xff1a; //for循环单笔入库 for(TransDetail detail:transDetailList){ insert(detail); } 优化后&#xff1a; batchInsert(transDetailList); 异步、回…

yolo增加mobileone

代码地址&#xff1a;GitHub - apple/ml-mobileone: This repository contains the official implementation of the research paper, "An Improved One millisecond Mobile Backbone". 论文地址&#xff1a;https://arxiv.org/abs/2206.04040 MobileOne出自Apple&am…

动态数组 Vector(难度1)(V)

C数据结构与算法实现&#xff08;目录&#xff09; 前驱课程 C 精简教程 目录&#xff08;必读&#xff09; 堆数组 heap array 面相对象的堆数组 1 原始堆数组的缺点&#xff1a; 1&#xff09; 原始堆数组 其长度是固定不变的。 2&#xff09; 使用指针管理元素&#…

简易虚拟培训系统-UI控件的应用1

目录 前言 UI结构总体介绍 建立初步的系统UI结构 Image控件 前言 前面的文章介绍了关于Oculus设备与UI控件的关联&#xff0c;从本文开始采用小示例的方式介绍基本的UI控件在系统中的基本作用&#xff08;仅介绍“基本作用”&#xff0c;详细的API教程可参考官方文档&#x…

从0到1学会Git(第一部分):Git的下载和初始化配置

1.Git是什么: 首先我们看一下百度百科的介绍:Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 …

前端调用电脑摄像头

项目中需要前端调用&#xff0c;所以做了如下操作 先看一下效果吧 主要是基于vue3&#xff0c;通过canvas把画面转成base64的形式&#xff0c;然后是把base64转成 file文件&#xff0c;最后调用了一下上传接口 以下是代码 进入页面先调用一下摄像头 navigator.mediaDevices.ge…

NTP时钟同步服务器

目录 一、什么是NTP&#xff1f; 二、计算机时间分类 三、NTP如何工作&#xff1f; 四、NTP时钟同步方式&#xff08;linux&#xff09; 五、时间同步实现软件&#xff08;既是客户端软件也是服务端软件&#xff09; 六、chrony时钟同步软件介绍 七、/etc/chrony.conf配置文件介…

构建 NodeJS 影院预订微服务并使用 docker 部署(04/4)

一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 我们前几章的快速回顾 第一篇文章介绍了微服务架构模式&#xff0c;并讨论了使用微服务的优缺点。第二篇…

RHCE——十二、Mysql服务

Mysql服务 一、什么是数据库1、数据&#xff1a;2、数据库&#xff1a; 二、mysql概述三、版本及下载四、yum仓库安装1、添加yum源2、安装3、后续配置 五、本地RPM包安装1、使用迅雷下载集合包2、上传数据3、安装 六、生产环境中使用通用二进制包安装1、作用2、软件包下载3、使…

结算日-洛谷

结算日 - 洛谷 解释&#xff1a; 1.用sum记录贝西走到某位置的累计的总钱&#xff0c;flag标记是否有欠债还不了的情况&#xff08;1为有&#xff09;&#xff0c;ans记录步数。 2.若sum<0&#xff0c;则欠债无法还&#xff0c;flag标记为1&#xff0c;并记录下此刻的位置…

方面级别情感分析之四元组预测

情感四元组预测现有方法 阅读本文之前我们默认你对情感分析有基本的认识。 如果没有请阅读文章(https://tech.tcl.com/post/646efb5b4ba0e7a6a2da6476) 情感分析四元组预测涉及四个情感元素: 方面术语a&#xff0c;意见术语(也叫观点术语)o&#xff0c; 方面类别ac&#xff0c…

Kotlin入门1. 语法基础

Kotlin入门1. 语法基础 一、简介二、在Idea创建一个示例项目三、基本语法1. 第一个程序2. 基本数据类型(1) 数字(2) 类型转换(3) 数学运算位运算 &#xff08;4&#xff09;可空类型 3. 函数4. 字符串(1) 字符串拼接(2) 字符串查找(3) 字符串替换(4) 字符串分割 5. null 安全的…