📋 摘要
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个最小或者最大的元素
数据不一定是放在数组里面占用内存,可以放在文件里面统一管理
首先创建一个随机生成十万个数据的文件

然后用代码实现上述思路

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

运行代码,分别建大堆和小堆,可以观察到以下结果


5793

被折叠的 条评论
为什么被折叠?



