首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >面试算法:在n个大小的数组中找到两个最大元素

面试算法:在n个大小的数组中找到两个最大元素
EN

Stack Overflow用户
提问于 2012-05-14 21:09:56
回答 2查看 4.9K关注 0票数 8

这是我在网上看到的面试问题,我不确定我对这个问题有什么正确的想法。

问题在于:

设计了一种在n个数序列中寻找两个最大元素的算法。需要比较的数目为n+ O(log n)

我想我可能会选择快速排序和停止时,两个最大的元素是找到?但不能百分之百肯定。任何有此想法的人请与我分享

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-14 21:33:46

递归地拆分数组,在每一半中找到最大的元素,然后找到最大的元素,这是比较过的最大的元素。第一部分要求n比较,最后一部分要求O(log )。下面是一个示例:

代码语言:javascript
运行
复制
1 2 5 4 9 7 8 7 5 4 1 0 1 4 2 3
2   5   9   8   5   1   4   3
5       9       5       4
9               5
9

在每一步,我合并相邻的数字,并采取较大的两个。用n比较得到最大的数,9。然后,如果我们看每一个与(5,5,8,7)相比较的数字,我们就会发现最大的一个是8,这肯定是数组中的第二大。由于其中有O(log )级别,因此需要进行O(log )比较。

票数 15
EN

Stack Overflow用户

发布于 2012-05-15 04:56:34

对于只有2最大元素,正常选择可能足够好。基本上是O(2*n)。

对于更一般的“从数组大小n中选择k元素”的问题,快速排序是一个很好的想法,但您不必真正对整个数组进行排序。

尝尝这个

  1. 选择一个枢轴,将数组拆分为Nm和Nm,如果k< m,则忽略Nm部分,在Nm中执行步骤1。如果k> m,则执行
  2. ,忘记Nm部分,在Nn-m中执行步骤1。这一次,您试图在Nn-m.
  3. 中找到第一个k-m元素,如果k= m,就得到了。

这基本上就像在数组N中定位k一样,您需要log(N)迭代,并平均移动(N/2)^i元素。因此,它是一个N+ log(N)算法(满足您的要求),并且具有非常好的实际性能(比普通的快速排序更快,因为它避免了任何排序,因此输出没有排序)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10591112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档