[算法]科技部与你共成长---11.5
(tx面试题)有N个整数(N>1亿),设计算法找出其中前M个最大的数(0<M<N)的高效算法,分析其时空复杂度
---------------------------------------------------------------------------------------------------------------------------------------------
参考答案:
如果N不是很大的话,可用选择或冒泡排序前M个,时间复杂度为O(N*M),空间为O(1).
由于N比较大(这里可能写得不准确,应该是N>100亿),无法全部在内存中排,所以应该用另一种方法:
在N个数中取前M个,在内存中构造个最小堆,复杂度O(LogM),然后依次从外存剩下(N-M)数中依次读取数与堆顶元素比较,
若小于堆顶,则丢弃,若大于此堆顶,则取代它,并作堆排序。
最后堆中剩下就是前M个大数,最后总的时间复杂度O(N*LogM),空间O(1)
由于N比较大(这里可能写得不准确,应该是N>100亿),无法全部在内存中排,所以应该用另一种方法:
在N个数中取前M个,在内存中构造个最小堆,复杂度O(LogM),然后依次从外存剩下(N-M)数中依次读取数与堆顶元素比较,
若小于堆顶,则丢弃,若大于此堆顶,则取代它,并作堆排序。
最后堆中剩下就是前M个大数,最后总的时间复杂度O(N*LogM),空间O(1)