对于top k问题:
1.既然是属于排序问题,最快能想到的就是快排,排序后取出前k个,这种针对数据量不大的情况快速可行。时间复杂度O(nlogn)
2.采用快排的 partition 划分思想,每次划分,若中间位置为k则左边部分即为top k。时间复杂度是 O(n) ,但是对于在海量数据的情况下,最主要的就是内存问题,没办法一次性将数据全部加载入内存,这个时候这个方法就不再适用。还有一点就是这种思路需要我们修改输入的数组,这也是值得注意的一点。
3.采用一个大小为 K 的小顶堆,依次将数据放入堆中,当堆的大小满了的时候,将堆顶元素与下一个数比较:如果大于堆顶元素,则将当前的堆顶元素去除,并将该元素插入堆中。遍历完全部数据,Top K 的数据就都在堆里面了。如果是求前 K 个最小的数,只需要改为大顶堆即可。
C++中可以用优先队列 priority_queue< type, container, function>
priority_queue<int,vector<int>,less<int> > big_heap; //大顶堆
也可以用 priority_queue<int> big_heap; //一般默认大顶堆,
priority_queue<int,vector<int>,greater<int> > small_heap; //小顶堆
如果我们想要自定义比较方式,可以写结构体重载()运算符 【eg:见下面题目】