TOP K问题

Posted Hesier

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TOP K问题相关的知识,希望对你有一定的参考价值。

题目描述:查找数组中最小的k个数。

思路:

(1)维护k个元素的最大堆,即用容量为k的最大堆存储最先遍历到的k个数,并假设它们即是最小的k个数,建堆费时O(k)后,有k1<k2<...<kmax(kmax设为大顶堆中最大元素)。继续遍历数列,每次遍历一个元素x,与堆顶元素比较,x<kmax,更新堆(用时logk),否则不更新堆。这样下来,总费时O(k+(n-k)*logk)=O(n*logk)。此方法得益于在堆中,查找等各项操作时间复杂度均为logk。

(2)把数组构造成最小堆,然后取前k个值。复杂度O(n)+k*O(log n),即为:O(n+k*logn)。

  采取建立n个元素的最小堆后取其前k个数的方法的复杂度小于采取常规的建立k个元素最大堆后通过比较寻找最小的k个数的方法的复杂度。但建立n个元素的最小堆,其空间复杂度为O(N),而建立k个元素的最大堆的空间复杂度为O(k)。综合考虑,一般还是选择用建立k个元素的最大堆的方法解决此类寻找最小的k个数的问题。

以上是关于TOP K问题的主要内容,如果未能解决你的问题,请参考以下文章

TOP K问题

[Leetcode]Top K问题总结

top K问题

选取TOP K的问题之快速排序

215. 数组中的第K个最大元素(TOP-K问题)

TOP K 问题