1.
排序,快速排序。
快速排序平均所费时间为nlogn,从小到大排序这n个数,然后再遍历序列中后k个元素输出,即可,总的时间复杂度为O(nlogn+k)=O(n*logn)。
2.
堆排序 什么是堆?
维护k个元素的最小堆,原理与上述第2个方案一致,即用容量为k的最小堆存储最先遍历到的k个数,并假设它们即是最大的k个数,建堆费时O(k),并调整堆(费时O(logk))后,有k1>k2>…kmin(kmin设为小顶堆中最小元素)。继续遍历数列,每次遍历一个元素x,与堆顶元素比较,若x>kmin,则更新堆(用时logk),否则不更新堆。这样下来,总费时O(klogk+(n-k)logk)=O(nlogk)。此方法得益于在堆中,查找等各项操作时间复杂度均为logk(不然,就如上述思路2所述:直接用数组也可以找出最大的k个元素,用时O(nk))。
核心思想:分治法 聊聊分治算法
采用分治算法解决的问题需要满足的条件(特征):
- . 原问题规模通常比较大,不易直接解决,但问题缩小到一定程度就能较容易的解决。
- . 问题可以分解为若干规模较小、求解方式相同(似)的子问题。且子问题之间求解是独立的互不影响。
- . 合并问题分解的子问题可以得到问题的解。
网友评论