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

  继续研究超大规模数据场景的问题

一、对20GB文件进行排序

 题目要求:假设你有一个20GB的文件,每行一个字符串,请说明如何对这个文件进行排序?
 分析:这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到内存里,因此我们只能将文件划分成一些块,每块大小是xMB,x就是可用内存的大小,例如1GB一块,那我们就可以将文件分为20块。我们先对每块进行排序,然后再逐步合并。这时候我们可以使用两两归并,也可以使用堆排序策略将其逐步合并成一个。相关方法我们在《查找》一章的堆排部分有介绍。这种排序方式也称为外部排序。

二、超大文本中搜索两个单词的最短距离

 题目要求:有个超大文本文件,内部是很多单词组成的,现在给定两个单词,请你找出这两个单词在这个文件中的最小距离,也就是像个几个单词。你有办法在O()时间里完成搜索操作吗?方法的空间复杂度如何。
 分析:这个题咋看很简单,遍历一下,找到这两个单词w1和w2的位置然后比较一下就可以了,然而这里的w1可能在很多位置出现,而w2也会在很多位置出现,如下图:
image.png
 这时候如何比较寻找哪两个是最小距离呢?
 最直观的做法是遍历数组words,对于数组中的每个word1,遍历数组words找到每个word2并计算距离。该做法在最坏情况下的时间复杂度是O(n^2),需要优化。
 本题我们少不了遍历一次数组,找到所有word1和word2出现的位置,但是为了方便比较,我们可以将其放到一个数组里,例如:

l1stA:{1,2,9,15,25}
listB:{4,10,19}
合并成
list:{1a,2a,4b,9a,10b,15a,19b,25a}

 合并成一个之后更方便查找,数字表示出现的位置,后面一个元素表示元素是什么。然后一边遍历一边比较就可以了。
 但是对于超大文本,如果文本太大那这个ist可能溢出。如果继续观察,我们会发现其实不用单独构造ist,从左到右遍历数组words,当遍历到word1时,如果已经遍历的单词中存在word2,为了计算最短距离,应该取最后一个已经遍历到的word2所在的下标,计算和当前下标的距离。同理,当遍历到word2时,应该取最后一个已经遍历到的word1所在的下标,计算和当前下标的距离。
 基于上述分析,可以遍历数组一次得到最短距离,将时间复杂度降低到O(n)。用index1和index2分别表示数组words已经遍历的单词中的最后一个word1的下标和最后一个word2的下标,初始时index1=index2=-1。遍历数组words,当遇到word2时,执行如下操作:
1.如果遇到word1,则将index1更新为当前下标;如果遇到word2,则将index2更新为当前下标。
2.如果index1和index22都非负,则计算两个下标的距离|index1-index2|,并用该距离更新最短距离。
遍历结束之后即可得到word1和word2的最短距离。
 进阶问题如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,则可以维护一个哈希表记录每个单词的下标列表。遍历一次文件,按照下标递增顺序得到每个单词在文件中出现的所有下标。在寻找单词时,只要得到两个单词的下标列表,使用双指针遍历两个下标链表,即可得到两个单词的最短距离。

三、从10亿数字中寻找最小的100万个数字

 题目要求:设计一个算法,给定一个10亿个数字,找出最小的100万的数字。假定计算机内存足以容纳全部10亿个数字。
 本题有三种常用的方法,一种是先排序所有元素,然后取出前100万个数,该方法的时间复杂度为O(nlogn)。很明显对于10亿级别的数据,这么做时间和空间代价太高。
 第二种方式是采用选择排序的方式,首先遍历10亿个数字找最小,然后再遍历一次找第二小,然后再一次找第三小,直到找到第100万个。很明显这种方式的时间代价是O(m)也就是要执行10亿100万次,这个效率一般的服务器都达不到。
 第三种方式,采用大顶堆来解决,堆的原理在《查找》一章专门介绍过,方法思想是一致的,都是“查小用大堆,查大用小堆”。
 首先,为前100万个数字创建一个大顶堆,最大元素位于堆顶。然后,遍历整个序列,只有比堆顶元素小的才允许插入堆中,并删除原堆的最大元素。之后继续遍历剩下的数字,最后剩下的就是最小的100万个。
 采用这种方式,只需要遍历一次10亿个数字,还可以接受。更新堆的代价是O(nlogn),也勉强能够接受。堆占用的空间是100万
4,大约为4MB左右的空间就够了,2因此也能接收。如果数据量没有这么大,也是可以直接使用这三种方式的。如果将10亿数字换成流数据,也可以使用堆来找,而且对于流数据,几乎只能用堆来做。

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

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

相关文章

单片机学习记录(四)

第8章 1.在异步串行通信中,接收方是如何知道发送方开始发送数据的? 答:当接收方检测到RXD引脚上有负跳变时,即可知道发送方开始发送数据; 2.AT89S51单片机的串行口有几种工作方式?有几种帧格式&#xff…

世邦通信 SPON IP网络对讲广播系统addscenedata.php任意文件上传漏洞

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统存在任意文件上传漏洞,攻击者可以通过构造特殊请求包上传恶意后门文件&#xff…

Sentinel微服务保护

文章目录 Sentinel微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.解决方案1.1.3.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链路2.1.快速入门2.2.流控模式2.2.1.…

华纳云:cdn主服务器连通性异常怎么办

当 CDN 主服务器连通性异常时,可能会影响到内容分发网络(CDN)的正常运行。在面对这种情况时,可以采取以下步骤来处理: 检查网络连接: 首先确保本地网络连接正常。尝试通过其他网络或设备访问 CDN 主服务器,以确定问题是…

redis.conf配置文件常用配置项详解

redis.conf 是 Redis 的配置文件,用于配置 Redis 服务器的各种参数和行为。这个配置文件包含了丰富的选项,允许用户调整 Redis 的行为以满足特定需求。以下是一些 redis.conf 中常见配置项的详解: daemonize: 默认值: …

c++八股3

多态:在C中,如果类B继承自A,并且定义了虚函数f(), 类C又继承自B但没有重写f(),那么当你执行如下代码: Cpp C *c new C(); c->f();调用的将是B类中实现的f()方法,因为C没有提供自己的覆盖版本。若要调用…

onlyoffice导入字体

1.进入容器 docker exec -it onlyoffice-server bash 2.删除自带字体 cd /var/www/onlyoffice/documentserver/core-fonts/ rm -rf * 3.退出容器 exit 1.将字体放入/home/Fonts/ ,如果不存在可以新建 2.执行docker cp /home/Fonts onlyoffice-server:/var/www/only…

avcodec send_packet和receive_frame

下面是解码的过程代码,对输入给解码器的pkt桢类型进行判断,关键桢打印出is key frame,解码出来的桢根据pict_type打印桢类型出I/P/B桢类型,从这里也可以看出来,没解码之前,AVPacket只能得到是否关键帧&…

Zung氏焦虑症测试SAS

SAS被称为焦虑自评量表,是一种用来测量焦虑症状程度以及观察治疗过程中变化情况的心理量表。主要用于评估心理状态,辅助参考数据,也是焦虑评定的标准。焦虑自评量表系是由William W.K. Zung编制的,该量表已成为心理咨询师、心理医…

【Python基础】一文搞懂:Python中文件路径的处理方式

文章目录 1 引言2 os 模块2.1 常用函数2.2 示例 3 pathlib 模块3.1 常用类和方法3.1 示例 4 比较 os 和 pathlib5 实例演示5.1 使用 os 模块5.2 使用 pathlib 模块5.3 封装为pathlib_example.py脚本 6 结语 1 引言 在 Python 编程中,正确处理文件路径是一个常见且重…

【GitHub项目推荐--克隆你的声音】【转载】

今天推荐一个黑科技开源项目,只需要你 5 秒钟的声音对话,就能克隆出你的声音,而且能够实时的生成你任意语音。 是不是很顶? 我举个例子,如果我这里有 300 条你说话的语音,我把你的语音数据用这个开源项目…

为求增长,这家消金公司也开始发力小微

来源 | 镭射财经(leishecaijing) 消金公司业务转向,小微贷越来越香,已成消金行业近年转型奋进的一个插曲。 为求业绩增长,拓宽获客基数,越来越多的消金公司不再局限于单一的C端客群,将目光瞄向…

Android jar包编译及集成

Jar包编译和集成有两种编译方式,mk和bp,Android 7版本之后逐渐采用bp格式编译,目前14版本还是兼容mk方式编译,具体写法入下: Android jar包编译 mk: 如果需要打包到systemimg,则需要将此jar包添…

MOJO基础语法

文章目录 打印变量及方法声明结构体python集成 打印 print("Hello Mojo!")变量及方法声明 变量: 使用’ var ‘创建一个可变的值,或者用’ let 创建一个不可变的值。 方法: 方法可以使用python中的def 方法声明,也引…

vue组件中data为什么必须是一个函数?

在Vue组件中,data为组件的私有数据对象,每个实例都必须要有自己独立的数据对象。为了确保每个实例都有独立的数据对象,Vue规定data必须是一个函数,而不是一个简单的对象。 当data是一个简单的对象时,所有组件的实例会…

认知觉醒(九)

认知觉醒(九) 专注力——情绪和智慧的交叉地带 第一节 情绪专注:一招提振你的注意力 用元认知来观察自己的注意力是一件很有意思的事情,相信你可以轻易观察到这种现象:身体做着A,脑子却想着B。 跑步的时候,手脚在…

录第第五十八天——每日温度,下一个更大元素|

单调栈 栈里的元素保持单调递增或者递减,栈内元素是元素下标。单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次求一个元素右边第一个更大元素,单调栈…

行业分享----dbaplus174期:美团基于Orchestrator的MySQL高可用实践

记录 MySQL高可用方案-MMM、MHA、MGR、PXC https://blog.csdn.net/jycjyc/article/details/119731980 美团数据库高可用架构的演进与设想 https://tech.meituan.com/2017/06/29/database-availability-architecture.html

js事件委托是什么?

事件委托是一种 JavaScript 编程技术,用于在父元素上设置事件监听器,以捕获其子元素的事件。这种技术通常用于动态生成元素的场景,其中子元素的增删改频繁,如果直接在子元素上设置事件监听器,会使得代码复杂且难以维护…

C语言实现双向链表

1.版本一 由于节点之间的连接变多 所以我们最好提前将前驱节点和后继节点用变量保存下来 以免等下在进行节点之间的指向时出错 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 节点类 typedef struct Node {// 数据域int data;// 指针域…