码迷,mamicode.com
首页 > 其他好文 > 详细

TOP K问题

时间:2016-09-22 01:05:27      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:查找数组中最小的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问题

标签:

原文地址:http://www.cnblogs.com/hesier/p/5894686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!