算法通关村第十五关——从10亿数字中寻找最小的100万个数字

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

本题有三种常用的方法,一种是先排序所有元素,然后取出前100万个数,该方法的时间复杂度为O(nlogn)。很明显对于10亿级别的数据,这么做时间和空间代价太高。

第二种方式是采用选择排序的方式,首先遍历10亿个数字找最小,然后再遍历一次找第二小,然后再一次找第三小,直到找到第100万个。很明显这种方式的时间代价是0()也就是要执行10亿 * 100万次,这个效率一般的服务器都达不到。

第三种方式,采用大顶堆来解决,堆的原理在《查找》一章专门介绍过,方法思想是一致的,都是"查小用大堆,查大用小堆"。

首先,为前100万个数字创建一个大顶堆,最大元素位于堆顶。

然后,遍历整个序列,只有比堆顶元素小的才允许插入堆中,并删除原堆的最大元素。

之后继续遍历剩下的数字,最后剩下的就是最小的100万个。

采用这种方式,只需要遍历一次10亿个数字,还可以接受。更新堆的代价是0(logn),也勉强能够接受。堆占用的空间是100万*4,大约为4MB左右的空间就够了,因此也能接收。

如果数据量没有这么大,也是可以直接使用这三种方式的。

如果将10亿数字换成流数据,也可以使用堆来找,而且对于流数据,几乎只能用堆来做。

相关推荐
维克兜率天3 分钟前
5.3 宏观因子:抬头看天
笔记·python·深度学习·算法·量化
LuminousCPP4 分钟前
数据结构-排序(五):计数排序与排序专题阶段总结|从外部归并到线性排序,再看算法边界与选型
c语言·数据结构·笔记·算法·排序算法
流云枫9 分钟前
003-上下文窗口:物理限制、KV Cache 与工程应对策略
算法
盟道科技11 分钟前
小程序订阅消息大规模投递实践:频控令牌池、Redis限流与失败补偿设计
分布式·算法·小程序
工具派14 分钟前
视频场景检测是怎么找到切镜头位置的?三种思路与实测
算法·计算机视觉·视频
钓鱼的肝18 分钟前
csp-j-s总结(1)
c++·笔记·算法·青少年编程
流云枫19 分钟前
001-Transformer架构与Self-Attention机制深度解析
算法
生信大杂烩39 分钟前
Xenium H&E空间原位可视化——细胞轮廓、基因表达与转录本可视化
python·算法·数据分析
linx2951 小时前
第七章 · 标准库容器、算法与 ranges
c语言·开发语言·数据结构·c++·算法
钓鱼的肝1 小时前
csp-j-s总结(4)
c++·经验分享·笔记·算法