一道java面试题,求大牛解答

sandy刘 2019-01-24 01:00:33
给你5000万个int,求出前1000个最大的数,怎么做,并给出其时间复杂度和空间复杂度
...全文
458 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
纵马饮白虹 2019-02-20
  • 打赏
  • 举报
回复
用链表
从数据集中读取数据构建一个有序双向链表,长度为K放到楼主的例子这里就是1000个(头结点大或者尾结点大都可以),举例时头结点大
之后遍历剩下的数据,从尾结点开始向前比较大小,不断的淘汰链表中的数据,直到遍历完一遍,剩下的就是前1000个大的数据
空间复杂度是O(n + k),
最好时间复杂度是O(n),最坏时间复杂度是O(n * k)
在楼主的例子中K=1000,空间复杂度是O(n),时间复杂度是O(n)
Soyoger 2019-01-29
  • 打赏
  • 举报
回复
这个问题考察的知识点比较多,通过以下几方面来思考: 1. 5000万个int,假设一个int占4个字节,4*5000万=195312.5kb 约等于190.M,一般的计算机都可以存储在内存中,如果输量再大,Kelvin不能被内存完全加载,但是目前可以完全加载; 2.被完全加载之后,可以考虑数据特性,题目给出了5000W个int,如果已经被排号序了呢?哈哈,这是极端,我们继续考虑数据没有排序,这个时候需要用排序算法进行排序,效率高的比如归并 快排 最大堆排等等,如果接触了mapreduce,归并+快排是较好的选择; 3.考虑分布式来处理,典型的mapreduce。
sandy刘 2019-01-24
  • 打赏
  • 举报
回复
从N个数中找出最大的K个数,通过小堆的方式,第一次构建容量为K的小堆,时间复杂度是O(K),然后从N个数中取一个和堆顶元素进行比较,如果堆顶元素小,就替换,然后再构建一下小堆,这个过程时间复杂度是O(logK),一共(N-K)次,所以,最终的时间复杂度是O(K)+(N-K)O(logK)≈O(NlogK)。我这个计算过程和最终结果对吗?
十八道胡同 2019-01-24
  • 打赏
  • 举报
回复
就是利用1楼说的大小堆来做。
LovelyBear2019 2019-01-24
  • 打赏
  • 举报
回复
100亿个数中找出最大的前K个数,我们可以遍历K次找到,但是时间复杂度就很大为 O(KN);因此,我们可以用堆来实现,只需遍历一次,思路如下:
如果要找前K个最大的数,我们用小堆,每次用堆顶元素和遍历的数比,如果堆顶元素小,则让堆顶元素的值等于它,然后向下调整
如果要找前K个最小的数,我们用大堆,每次用堆顶元素和遍历的数比,如果堆顶元素大,则让堆顶元素的值等于它,然后向下调整

随便搜了搜,把别人的复制了过来,这是一道互联网面试必问题,希望能帮助到你。

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧