TopK问题:在大量的数据中找出前k个最大值或者最小值
对于海量数据,如果我们只需要找出其中最大的k个或者最小的k个,怎样才能找出呢?
假设我们对所有的数据进行排序,时间复杂度(快速排序):O(nlog2n); 如果这是数亿个数据,那这样的方法也就不那么高效了
哪哈有没有更加高效的方法呢?
利用堆来解决TopK问题(以最大的k个举例)
我们知道大根堆的堆顶是堆中的最大元素;而小根堆的堆顶是堆中的最小元素;
思路是:我们可以建立一个大小为K小根堆,然后从第k个元素开始遍历,如果大于小根堆的堆顶,那么就交换两个元素,交换一次调整一次,直到所有数据遍历结束,堆中的元素就是海量数据中最大的k个
为什么是小根堆,而不是大根堆呢?大根堆的堆顶是堆中的最大值呀
答:我们的目的是小根堆中保存所有数据中最大的k个,正因为小根堆的堆顶是最小的值,当我们遍历剩余的数据时,只有大于我们这个堆中的最小值,才有资格放进来,这样当遍历结束后堆中的元素就是最大的k个;
为什么建立大小为k呢?
答: