博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
topK问题
阅读量:6988 次
发布时间:2019-06-27

本文共 656 字,大约阅读时间需要 2 分钟。

题目内容

  有N个整数,请找到其中最大的K个数。

解法1

  采用快速排序,将这些整数从大到小排序,那么前K个整数即为所求。所需的时间复杂度为O(NlogN),空间复杂度为O(1)。

解法2

  采用改进的快速排序算法,每次patition后,只继续对某一侧的数据进行排序。如果某次patiton后,左侧的数据有M个,那么有两种可能:

  • M>K,那么继续对这M个数据取topK
  • M<=K,那么继续对另一侧的数据取top(K-M)

这种算法在最坏情况下的时间复杂度为O(NK)(即每次只能找到一个数),空间复杂度为O(1)。

解法3

  采用局部淘汰法。首先将前K个整数排序,然后依次将剩余整数按照插入排序的方法,插入到前K个整数中,最后前K个整数即为所求。所需的时间复杂度为O(NK),空间复杂度为O(1)。

解法4

  采用冒泡排序,只需要进行K此冒泡即可。所需时间复杂度为O(NK),空间复杂度为O(1)。

解法5

  采用小顶堆,依次将所有数字入堆。当且仅当堆中元素超过K时,将堆顶元素删除。最后结束时,堆中元素个数为K,即为所求。所需的时间复杂度为O(NlogK),空间复杂度为O(1)。

  最后,应该选用哪种方法呢?无论如何,快排的方法都不是最佳的。而其他四种情况,要看具体的情况,比如N和K的大小,以及机器的配置等。如果K很大,那么堆排序是很适合的方法。如果K很小,其他三种方法都是比较合适的。

转载于:https://juejin.im/post/5c25983d6fb9a049e66050b4

你可能感兴趣的文章
JSP 注释的详解及简单实例
查看>>
c:\Windows\System32\drivers\etc\hosts的作用
查看>>
2.Xml与多个对象的映射(聚合或组合)及注意事项
查看>>
java报表开发之报表总述
查看>>
正确释放Vector的内存
查看>>
【零基础学习iOS开发】【02-C语言】04-常量、变量
查看>>
最小堆的基础操作(Java)
查看>>
bzoj2039: [2009国家集训队]employ人员雇佣(最小割)
查看>>
AspNetCore Mvc 使用 PartialView
查看>>
bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)
查看>>
Sql Server 网络配置
查看>>
Oracle案例11——Oracle表空间数据库文件收缩
查看>>
看博客学学Android(十四)
查看>>
在Windows下安装配置jforum测试环境
查看>>
WEB基础
查看>>
AtCoder Regular Contest 081
查看>>
树状数组模板
查看>>
2017"百度之星"程序设计大赛 - 初赛(A)
查看>>
Python3 输出
查看>>
实验四 shell编程2
查看>>