Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如:
从20亿个数字的文本中,找出最大的前100个。
解决Top K问题有两种思路,
- 最直观:小顶堆(大顶堆 -> 最小100个数);
- 较高效:Quick Select算法。
LeetCode上有一个问题215. Kth Largest Element in an Array,类似于Top K问题。
1. 堆
小顶堆(min-heap)有个重要的性质——每个结点的值均不大于其左右孩子结点的值,则堆顶元素即为整个堆的最小值。JDK中PriorityQueue实现了数据结构堆,通过指定comparator字段来表示小顶堆或大顶堆,默认为null,表示自然序(natural ordering)。
小顶堆解决Top K问题的思路:小顶堆维护当前扫描到的最大100个数,其后每一次的扫描到的元素,若大于堆顶,则入堆,然后删除堆顶;依此往复,直至扫描完所有元素。Java实现第K大整数代码如下:
本文介绍了Top K问题的两种解决方案:使用小顶堆和Quick Select算法。小顶堆通过维护最大元素的堆来找到最大的K个数,而Quick Select则通过对数组进行切分来寻找第K大元素。两者都在不同的场景下有各自的效率优势。
订阅专栏 解锁全文
4938

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



