这是我在网上看到的一个面试问题,我不确定我是否有正确的想法。
问题在于:
设计算法以找到n个数字序列中的两个最大元素。 比较次数需要为n + O(log n)
我想我可以选择快速排序并在找到两个最大的元素时停止? 但不是100%肯定它。任何人都有这个想法请分享
答案 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个元素”的问题,快速排序是一个很好的思路,但你不必真正对整个数组进行排序。
试试这个
它基本上就像在数组N中定位k一样。你需要log(N)迭代,并且平均移动(N / 2)^ i个元素。所以这是一个N + log(N)算法(满足你的要求),并且具有非常好的实用性能(比普通的快速排序更快,因为它避免了任何排序,所以输出没有排序)。