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