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

这篇具有很好参考价值的文章主要介绍了[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)时间 里完成搜索操作吗?方法的空间复杂度如何。
[Go版]算法通关村第十五关黄金——继续研究超大规模数据场景的问题,算法与数据结构,算法,排序算法,大数据

解决思路:双指针法

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

  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 ,可以接受。文章来源地址https://www.toymoban.com/news/detail-693875.html

到了这里,关于[Go版]算法通关村第十五关黄金——继续研究超大规模数据场景的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Go版]算法通关村第十二关黄金——字符串冲刺题

    题目链接:LeetCode-14. 最长公共前缀 以第一个子字符串为标准,遍历其每个字符时,内嵌遍历其余子字符串的对应字符是否一致。不一致时,则返回当前字符之前的子字符串。 复杂度:时间复杂度 O ( n ∗ m ) O(n*m) O ( n ∗ m ) 、空间复杂度 O ( 1 ) O(1) O ( 1 ) 时间复杂度:其中 n

    2024年02月12日
    浏览(40)
  • [Go版]算法通关村第十三关黄金——数字数学问题之数论问题(最大公约数、素数、埃氏筛、丑数)

    题目链接:LeetCode-1979. 找出数组的最大公约数 辗转相除法其核心部分为:若r 是a ÷ b的余数,则 gcd(a, b)=gcd(b, r) 题目链接:LeetCode-204. 计数质数 如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,… 一定不是质数。 时间复杂度分析: 外层循环的迭代次数是 n-2,即 O ( n ) O(n) O ( n ) 次

    2024年02月11日
    浏览(39)
  • 算法通关村第十六关:黄金挑战:滑动窗口与堆结合

    堆的大小一般是有限的,能直接返回当前位置下的最大值或者最小值 该特征与滑动窗口结合,可以解决一些特定场景的问题 1. 滑动窗口与堆问题的结合 LeetCode239 https://leetcode.cn/problems/sliding-window-maximum/ 思路分析 对于最大值,K个最大这种场景,优先队列(堆)是首先该考虑的

    2024年02月09日
    浏览(39)
  • 算法通过村第五关-队列和Hash黄金笔记|LRU的设计与实现

    提示:我曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定从容。 我们层如此盼望世界的认可,到最后才知道:世界是自己,与他人毫无关系。 --杨绛 LRU 是非常经典的问题,而且在常年的算法中也是热门,但是他是存在技巧的,我们这就来一起看

    2024年02月09日
    浏览(37)
  • 算法通关村第四关-黄金挑战栈的经典问题

    描述 :  给定一个只包括  \\\'(\\\' , \\\')\\\' , \\\'{\\\' , \\\'}\\\' , \\\'[\\\' , \\\']\\\'  的字符串  s  ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 题目 : LeetCode 20.有效的括号 : 

    2024年02月07日
    浏览(43)
  • 算法通关村第11关【黄金】| 用4KB内存寻找重复元素

    题目要求:给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。 思路: 直接用大小为32000的int数组来标记对应下标下的值出现次数,但是空间大小是32000*4B超过了4KB 这里采用一种压缩

    2024年02月09日
    浏览(46)
  • 算法通关村第十八关——排列问题

    LeetCode46.给定一个没有重复数字的序列,返回其所有可能的全排列。例如: 输入:[1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次,所以就不能使用startlndex了,为此可以使用一个used数组来标记已经选择的元

    2024年02月09日
    浏览(45)
  • 算法通关村第十七关——跳跃游戏

    leetCode55 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度,判断你是否能够到达最后一个位置。 示例1: 输入:[2,3,1,1,4] 输出:true 解释:从位置 0 到 1 跳 1 步,然后跳 3 步到达最后一个位置。 示例2: 输入:[3

    2024年02月10日
    浏览(37)
  • 算法通关村第十九关——最小路径和

    LeetCode64. 给定一个包含非负整数的 m × n 网格 grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 输入:grid=[[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径1→3→1→1→1的总和最小。 对于每一块方块来说,只能从他的上边或者左边走过来,所以在for循环中

    2024年02月09日
    浏览(45)
  • 算法通关村第十二关-字符串基础题目

    思路:遍历字符串,将第i个字符和第N-i-1个字符串交换即可; 代码实现: 题目:反转字符串2 思路:每2k个一组,将其前k个字符反转,使用i+k与字符串长度n判断剩余字符串长度属于(0,k)还是 [k,2k)之间;然后按照要求剩余字符串即可; 代码实现: 题目:仅仅反转字母 思

    2024年01月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包