首页 > 代码库 > TOP K问题
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问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。