TopK问题是算法中的一道经典题目,在各种面试中也是高频题,这里介绍两种解决思路。
1.quick select
基于快排的思想,我们可以实现topk的选择。首先定义一个函数,输入一个数组和上下界下标,函数会将所有大于数组首个数(记做n0)的数字挪到第一个数的左边,这样n0所在的位置就是它应该在的位置,返回这个下标;然后定义topk函数,输入这个数字,取上界为数组长度-1,下界为0,查看此时的下标,如果下标等于K-1,说明此时就是要寻找的第K个数,返回;如果小于K-1,则说明第K大的数在index右边,令下界取index+1;如果大于,则取上界为index-1
2.小顶堆
在实际的环境中,数据可能并不是一次性给出,而是一个个的进来,此时维护一个小顶堆的方法会更好。
python中可以导出heapq的包来构造,首先用前K个数构造一个小顶堆,接下来对于数据流的数字,若该数字比堆顶大,则将堆顶推出,插入新数字,最终返回堆顶即可。