前言:算法题中,有一道经典题,那就是寻一堆数中最大的K个数。在此,我决定总结一下,做做笔记。
1.应用场景有什么?
通常,海量数据搜索最匹配的K个记录,数据库记录中获取最符合某个特性的K个记录,文件中获取出现文字最多的K篇文章,以此等等,我们最终都是在对建立的数据模型的求最大K个数的求解。
2.解法大全
2.1全排序取K数法:这个方法就是用快排或其它排序方法。将所有数都排序好,然后取出最前面或最后的K个数。时间复杂度O(nlgn+k),适用范围是数据量不大时。
2.2快排分治法:采用快排方式,取一个基准数B,将整个数据集合分成2部分Sa,Sb。Sa集合中所有数大于B, Sb集合中所有数小于B。此时,如果集合Sa个数小于K,那么问题就变为在Sb中求出K-n(Sa)个最大数的问题;而如果集合Sa个数大于K,那么就变成了再在Sa中求最大K个数的问题。通过不断减少数据规模,从而达到分治目的。这种算法时间复杂度和第一种一样,也只适用于小数据量场景。
2.3最小堆方法:取K个数构成最小堆,然后扫描所有后续数据,与最小堆的堆顶数比较,如果小于,则跳过,如果大于,则替换该堆顶元素为比较的数,然后调整堆为新的最小堆。此算法时间复杂度为O(n*lgk)。当n很大,K有限大时,这个方法是最好的。因为不需要把所有数据加载到内存,这种算法能处理海量数据规模。
3.结论:
采用那种算法,取决于数据规模n和K的大小。对于海量数据,解法3最优。
网友评论