topK

最大K个数:

       当数据量小时:快排和堆排O(Nlog(N));部分排序(选择or交换)O(N*K)

                  快排加分治O(N*log(K));二分查找

当数据是整数且重复数比较多时:计数排序;若不是整数,则分区间计数。

当数据量大时:

1)小根堆:O(N*KlogK)

2)分治法:hash成M份数据,取每份数据的前K个。然后使用快排(分治)对M*K个数据求出K个数。【用MapReduce】

实际应用:当数据量大,且重复数据多时,求频率最高的K个

1)先用hash_map进行频率统计(得到一个数组)

2)然后用小根堆(对数组)取前K。

PS:若内存存储不了不重复的数据,则先将数据hash成M份文件。然后再对不同文件进行hash_map统计,然后去每份数据前K个,最后用快排(分治)对M*K个数据求出K个数【此处排序针对的是词频】

4、第K大的数(两个有序数组):分治法(短的数组的K/2为切割点)

你可能感兴趣的:(top)