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

news2024/11/19 22:39:43

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

一、对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.coloradmin.cn/o/1384427.html

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

相关文章

墙地砖外形检测的技术方案-图像获取

硬件系统 墙地砖外形检测硬件系统主要由工业相机、光源、瓷砖位置检测电路和上位机组成,其结构如图所示。为了提高系统检测精度和稳定性,系统采用的是较高精度的高速工业相机用于抓取墙地砖表面轮廓图像,图像数据通过USB接口向上位机传送&am…

Maven《一》-- 一文带你快速了解Maven

目录 🐶1.1 为什么使用Maven 1. Mavan是一个依赖管理工具 ①jar包的规模 ②jar包的来源问题 ③jar包的导入问题 ④jar包之间的依赖 2. Mavan是一个构建工具 ①你没有注意过的构建 ②脱离IDE环境仍需构建 3. 结论 🐶1.2 什么是Maven &#x…

系列四、Spring Security中的认证 授权(前后端不分离)

一、Spring Security中的认证 & 授权(前后端不分离) 1.1、MyWebSecurityConfigurerAdapter /*** Author : 一叶浮萍归大海* Date: 2024/1/11 21:50* Description:*/ Configuration public class MyWebSecurityConfigurerAdapter extends WebSecuri…

ZZULIOJ 1110: 最近共同祖先(函数专题)

题目描述 如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结 点(编号是1 的结点)都有一条唯一的路径,比如从10 到根结点的路径是(10, 5, 2, 1), 从4 到根结点的路径是(4, 2, 1)&#xff0…

x-cmd pkg | qrencode - 二维码生成工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 qrencode 是一个用于生成二维码的命令行工具。它可以将文本、URL、电话号码等信息转换为二维码图像。生成的二维码图像可以保存为图片文件,方便在电子文档、网页、移动应用等各种场景中使用。 它支持的二维…

python爬虫小练习——爬取豆瓣电影top250

爬取豆瓣电影top250 需求分析 将爬取的数据导入到表格中,方便人为查看。 实现方法 三大功能 1,下载所有网页内容。 2,处理网页中的内容提取自己想要的数据 3,导入到表格中 分析网站结构需要提取的内容 代码 import requests…

Random的使用

作用:生成伪随机数 1.导包:import java.util.Random 2.得到随机数对象:Random r new Random(); 3.调用随机数的功能获取随机数: 这里随机生成一个0-9的整数: int number r.nextInt(10); 实现指定区间的随机数&a…

C语言中关于指针的理解及用法

关于指针意思的参考:https://baike.baidu.com/item/%e6%8c%87%e9%92%88/2878304 指针 指针变量 地址 野指针 野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的) 以下是导致野指针的原因 1.指针…

利益兑现期越短,积极性越高

在2023年一次部门项目提成时间节点的调整,引发了相关的销售部门 ,项目集成部门,软件开发部门截然不同的工作积极性。 公司案例 公司做项目的时候,采用的是相关部门都可以在项目获取提成 ,之前的提成方式为销售部门为…

maven镜像源设置aliyun提升下载速度

一、打开pom.xml project下在添加 <repositories><repository><id>aliyunmaven</id><name>aliyun</name><url>https://maven.aliyun.com/repository/public</url></repository><repository><id>central2&l…

【Arduino】编程语言:定时函数、数学函数、字符函数(功能、语法格式、参数说明、返回值) | 软件开发环境:安装步骤介绍(EXE安装版、ZIP安装版)

你的负担将变成礼物,你受的苦将照亮你的路。———泰戈尔 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🏅[4] 阿里云社区…

prometheus常用exporter

一、node-exporter node_exporter&#xff1a;用于监控Linux系统的指标采集器。 未在k8s集群内的linux机器监控 GitHub - prometheus/node_exporter: Exporter for machine metrics 常用指标&#xff1a; •CPU • 内存 • 硬盘 • 网络流量 • 文件描述符 • 系统负载 •…

电子电器架构车载软件 —— 集中化架构软件开发

电子电器架构车载软件 —— 集中化架构软件开发 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任…

vulnhub靶场之DC-8

一.环境搭建 1.靶场描述 DC-8 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. This challenge is a bit of a hybrid between being an actual challenge, and being a "proof of concept&quo…

机器学习入门知识

一、引言 机器学习是当前信息技术中最令人振奋的领域之一。在这门课程中&#xff0c;我们将探索该技术的前沿&#xff0c;并能够亲自实现机器学习的算法。 或许你每天都在不知不觉中使用了机器学习的算法。每次你打开谷歌或必应搜索你需要的内容&#xff0c;正是因为它们拥有出…

如何使用vite框架封装一个js库,并发布npm包

目录 前言介绍 一、创建一个vite项目 1、使用创建命令&#xff1a; 2、选择others 3、 模板选择library 4、选择开发语言 ​编辑 二、安装依赖 三、目录介绍 1、vite.config.ts打包文件 2、package.json命令配置文件 三、发布npm 1、注册npm账号 2、设置npm源 3、登…

深信服超融合HCI版本升级,6.0.0R5升级至6.8.0R2

超融合升级&#xff0c;需要满足以下条件及前期准备&#xff1a; 确认HCI的升级序列号有效升级时长大概在一个半小时&#xff0c;安全起见&#xff0c;需预留至少三至四小时窗口期升级前&#xff0c;需要将所有虚拟机关机&#xff0c;涉及到业务无法访问&#xff0c;需提前通知…

车规MCU开发之E2E协议

啥是E2E&#xff1f; E2E的原理&#xff1a; 1. 发送端&#xff1a;发送数据包添加E2E保护头 2. 接收端&#xff1a;接收数据包校验E2E保护头 E2E例子 - profile 11为例 E2E_P11ConfigType wk_stP11Cfg { .CounterOffset 8, .CRCOffset 0, .DataID …

opencv多张图片实现全景拼接

最近camera项目需要用到全景拼接&#xff0c;故此查阅大量资料&#xff0c;终于将此功能应用在实际项目上&#xff0c;下面总结一下此过程中遇到的一些问题及解决方式&#xff0c;同时也会将源码附在结尾处&#xff0c;供大家参考&#xff0c;本文采用的opencv版本为3.4.12。 首…

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺&#xff0c;4*A53架构&#xff0c;Android 9.0操作系统&#xff0c;搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力&#xff0c;专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…