采访算法:找到大小为n的数组中的两个最大元素

时间:2012-05-14 21:09:56

标签: algorithm sorting

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

问题在于:

  

设计算法以找到n个数字序列中的两个最大元素。   比较次数需要为n + O(log n)

我想我可以选择快速排序并在找到两个最大的元素时停止? 但不是100%肯定它。任何人都有这个想法请分享

2 个答案:

答案 0 :(得分:15)

递归拆分数组,找到每一半中最大的元素,然后找到最大元素与之比较的最大元素。第一部分需要n比较,最后部分需要O(log n)。这是一个例子:

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.然后,如果我们看一下9被比较的每个数字(5,5,8,7),我们看到最大的数字是8,这必须是数组中的第二大。由于此处有O(log n)级别,因此需要进行O(log n)比较。

答案 1 :(得分:1)

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

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

试试这个

  1. 你选择一个转轴,将数组拆分为N [m]和N [n-m]。
  2. 如果k < m,忘记N [n-m]部分,在N [m]中执行步骤1。
  3. 如果k> m,忘记N [m]部分,进入N [n-m]。这次,你试图找到N [n-m]中的第一个k-m元素。
  4. 如果k = m,你就明白了。
  5. 它基本上就像在数组N中定位k一样。你需要log(N)迭代,并且平均移动(N / 2)^ i个元素。所以这是一个N + log(N)算法(满足你的要求),并且具有非常好的实用性能(比普通的快速排序更快,因为它避免了任何排序,所以输出没有排序)。