Java中的 top K 问题

top K 问题

给定一个集合(元素个数很多 N),想找到前 K 个最大的或最小的元素

 

以找前 K 大的值为例(两个方案)

1、针对这个集合,建立一个大小为 N 的大堆,循环取 K 此堆顶元素即可

2、建立一个大小为 K 的小堆,堆顶元素中的最小值(守门员),循环遍历 N 个元素中的每个元素,分别和守门员进行比较,如果比守门员大,此时就直接把守门员替换成当前元素,并且向下调整堆,得到新的守门员,当所有的元素遍历完毕,堆中剩下的元素就是前 K 大元素

 

N>>K 第一种方案的时间效率和空间效率都低于第二种方案,另外N可能很大,如果 N 太大导致 N 个元素无法被同时加载到内存中,此时也就只能使用第二种方案

第二种方案得到的前 K 个元素是无序的,如果要明确知道顺序还需要重新排序

对于 N >> K 的情况下,第二种方案更优

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值