top K 总结与分析,其基础方法以及一些拓展问题

这是一道非常经典的题,在实际中有非常广泛的应用。

在这里做出一些总结。

常见的几种方法

1. 直接排序

看到问题的直观想法就是排序,排完序取前k个便是top k。

有许多排序方法,如快排、堆排,平均复杂度为O(N * log2N)

不过实际上找出top k个数我们并不需要对后 N-K 个数进行排序,这部分排序是无用功,所以我们应当除去,可以参考第三种方法。

2. 分治法

将数据分为x份,如果某个数为top k 数之一的话,那么在某份子集数据中,也应当在top k 中

因此找出每个子集的top k,再将这 x 个 top k 进行归并得到最终的top k

3. 基于快排的分治法

考虑快速排序的过程,选定一个主元,每次扫描都可以得到比主元大的集合S1,和比该主元小的集合S2。

当|S1| < k时,S1中的元素必然在 top k中,接下来只需在集合 S2 中寻找 top (k - |S1|)个元素

当|S1| > k时,S2中的元素必然都不在 top k 中,因此下一步在集合 S1 中寻找 top k 元素即可。

当|S1| = k时,可结束递归

众所周知,在一些极端情况下,快排的效果不是很好。因此出现了基于快速排序划分思想的二分法(BFPRT算法)。该方法能够使得最坏的情况下仍然为线性时间。

大致过程为:给元素分为5个一组,对其排序

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值