请问海量数据如何去取最大的K个

本文探讨了在处理海量数据时如何找出最大的K个数的问题,涉及内存限制、排序、分治、最小堆和哈希等方法。最小堆法是一种常见策略,先建立最小堆,然后与剩余数据比较,替换堆顶元素。哈希法则适用于有大量重复数据的情况,减少内存占用。实际应用中,最佳方案应结合具体需求和资源条件选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这可能是形而上学很有深度一个算法题目,因为这个会的人能天马行空设计出绝妙的算法,不会的人可能连题目都无处下手。海量数据top K问题,在互联网大厂的产品中到处体现出来,比如微信的计步软件,统计出K名,然后进行排序。

当然类似的题目还有有一亿个浮点数,如何找出其中最大的10000个。这里面其实涉及代码技能就是内存的处理以及数据的去重优化,把本来需要占大量内存空间的海量数据通过各种方法处理出来。以下有几种方法,包括最蠢和最明智的方案,在面试中可以供你吹水。

内存允许的情况下,直接全部排序

这可能是最直接简单粗暴的方法,但是你懂的,我们的前提是海量数据,这个方法是一种方案,但是肯定不靠谱的。全部排序从大到小排序之后,我们直接取头部的K个,方法需要消耗大量内存并且不高效,做了很多无用功,不建议使用。当然如果在口谈面试中,你大脑短路的时候可以先提出这个。

内存允许的情况下,分治法

其实分治的思想里就包括快排和归并排序。思想先分都是将数据不断的分成N份,治是找到每份数据中最大的K个数。

最小堆法(也叫局部淘汰法)

一种局部淘汰法。先读取前K个数,建立一个最小堆。然后将剩余的所有数字依次与最小堆的堆顶进行比较,如果小于或等于堆顶数据,则继续比较下一个;否则,删除堆顶元素,并将新数据插入堆中,重新调整最小堆。当遍历完全部数据后,最小堆中的数据即为最大的K个数。

时间复杂度为O(n+m^2)(其中m为K,比如10000)

这里面会涉及到堆的调整和创建操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ToF君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值