标准答案
- 全量加载并排序简单,复杂度 O(n log n),但需要 O(n) 内存。
- 维护 K 大小的最小堆,每个元素大于堆顶时替换,复杂度 O(n log k),空间 O(k)。
- 分布式场景先在分片上求局部 Top K,再合并候选集;必须说明重复、排序相同和数据倾斜。
题目解析
Top K 的算法取决于数据是否能一次加载、K 与 n 的比例、是否需要精确结果以及数据是否持续流入。全量排序最直观,但会保存全部候选;大小为 K 的最小堆只保留当前最有价值的候选。
最小堆的堆顶是当前 K 个元素里最小的一个,新元素只有超过堆顶才替换。扫描复杂度 O(n log k),额外空间 O(k),最后还要把堆内结果按题目要求重新排序。
分布式场景每个分片必须先保留局部 Top K,中心节点再合并候选;如果是频次 Top K,还要说明统计窗口、计数一致性、并列排序和热点分布。
代码示例
最小堆的比较和替换逻辑:
TypeScript
for (const item of input) {
heap.push(item)
if (heap.size > k) heap.pop()
}
return heap.toArray().sort((a, b) => b.score - a.score)常见误区
- 误区:先全量排序却不说明内存边界。改正:数据规模未知或不能一次加载时使用大小为 K 的堆或分片聚合。
- 误区:用最大堆保留 K 个最大值。改正:求最大 Top K 应使用最小堆,让最小候选位于堆顶便于淘汰。
- 误区:每个分片只返回一个局部最大值。改正:局部结果至少保留 K 个候选,否则全局 Top K 可能被截断。