【数据结构与算法】堆的经典应用——TOP-K问题

📋 摘要

TOP-K问题 :即求数据集合中前K个最大的元素或最小的元素,一般情况下数据量都很大,比如:世界500强,专业前10名,游戏中前100的活跃玩家等,是数据处理中的经典场景。
本文深入探讨了该问题的核心解决方案——堆(Heap)数据结构,通过构建小堆(找最大K个)或大堆(找最小K个)并利用堆顶比较,在仅需O(K)内存的情况下高效解决问题。该方法适用于内存受限、数据无法一次性加载的场景。


对于TOP-K问题,能想到的最简单直接的方式就是排序,但是如果数据量非常大排序就不太可取了(可能数据不能一下子全部加载到内存中)
假设n是10亿个整数,需要申请多大的内存?
1G = 1024 MB = 1024 * 1024 KB
= 1024 * 1024 * 1024 Byte
这就差不多是10亿,10亿*4 = 40亿
意味着排10亿个数就需要4个G的内存
但是只有1个G的内存,怎么办呢?
如果只有1KB的内存,怎么办?

最佳的方法就是用堆来解决,具体如下

1)用数据集合中的前k个元素来建堆
前k个最大的元素,则建小堆
前k个最小的元素,则建大堆
2)用剩余的n-k个元素依次与堆顶元素来比较,不满足则替换堆顶元素
将剩余n-k个元素依次与堆顶元素比完之后,堆中剩余的k个元素就是所求的前k个最小或者最大的元素

开始:找最大的前k个数据

取前k个数据

建小堆

遍历剩下的n-k个数据

当前数据 > 堆顶?

替换堆顶数据

向下调整堆(堆化)

继续遍历下一个数据

还有数据未遍历?

结束:堆中即为最大的前k个数据

数据不一定是放在数组里面占用内存,可以放在文件里面统一管理
首先创建一个随机生成十万个数据的文件
在这里插入图片描述

然后用代码实现上述思路
在这里插入图片描述

为了便于观察,我们可以将自己创建的文件中的数据手动修改一下,将最大/最小的几个数据更换为明显的,这样代码运行起来效果更加明显

在这里插入图片描述
运行代码,分别建大堆和小堆,可以观察到以下结果
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值