100亿个数中找出最大的k个数(TopK问题)

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))。


核心思想:分治法 聊聊分治算法

采用分治算法解决的问题需要满足的条件(特征):

  • . 原问题规模通常比较大,不易直接解决,但问题缩小到一定程度就能较容易的解决。
  • . 问题可以分解为若干规模较小、求解方式相同(似)的子问题。且子问题之间求解是独立的互不影响。
  • . 合并问题分解的子问题可以得到问题的解。

解题参考1
解题参考2

你可能感兴趣的:(100亿个数中找出最大的k个数(TopK问题))