其他分享
首页 > 其他分享> > 如何找出一组数中最大的K个数?

如何找出一组数中最大的K个数?

作者:互联网

如何找出一组数中最大的K个数,这就是“Top K”问题,这里简单记录下对这个问题的思考过程。

当数据量不大时

很容易想到快排中划分算法的运用——找出数组中第K个数。每次划分数组,直到找到第K个数,由于第K个数作为哨兵进行了一次划分,那么前K个数就是我们要找的数。划分算法的时间复杂度是 O ( n ) O(n) O(n)的,看起来已经是最好的了,不过前提是数据都能被一次读到内存中。

当数据量较大时

“数据量较大”指的是数据不能一次读完,那么我们就得想想怎么利用好内存,这里可以使用最小堆(如果找最小的K个就用最大堆)。简单来说,就是先建好一个大小为K的最小堆,然后每次读入一个数,和堆顶比较:如果比堆顶大,那么就替换掉堆顶,然后调整为新的堆;如果比堆顶大,那么就跳过。调整堆的时间是 O ( l o g K ) O(logK) O(logK),所以整体的时间复杂度是 O ( n l o g K ) O(nlogK) O(nlogK),由于 n n n远大于 K K K,所以近似 O ( n ) O(n) O(n)。

如果数据量非常大呢?

我想应该使用分布式的算法去解决,限于所学知识,以后接触到再补充……

标签:找出,划分算法,复杂度,个数,数据量,logK,nlogK,数中
来源: https://blog.csdn.net/weixin_43184560/article/details/112204714