`3n`不同的元素并找到两个值,`x< y`?

时间:2015-03-19 09:15:20

标签: c++ algorithm search data-structures mergesort

这是我昨天被问到的面试问题。任何专家都可以向我核实哪些索赔是真的吗?

如果我们有一个算法给出带有3n个不同元素的未排序数组并计算两个值,x < y使n个元素低于x,{{1元素大于n,n个元素介于yx之间。

  声明A)有一个y平均顺序的算法来解决这个问题   问题

     声明B)有一个O(n)阶的算法。

     声明C)除了输入数组之外还假设O(n)额外存储,我们无法在多边形时间内解决这个问题。

     声明D)解决此问题的每个算法都有O(1)次序。

3 个答案:

答案 0 :(得分:4)

O(n)时间解决方案,使用selection algorithm

找到n+1最小元素和2n最小元素,这些是您寻找的必需元素。

选择算法的每个调用都是O(n)最坏情况(中位数方法的中位数),你需要其中的两个,所以复杂度仍为O(n)

所以,

  • 声明B是正确的,并声称A - 此算法均满足这两种声明,其平均+最差情况时间为O(n)
  • 声明C错误,因为检查每对的强力解决方案 元素和迭代每对的数组需要O(n ^ 3) (多项式)时间和O(1)空间。
  • 声明D错误,因为我们建议的算法在O(n)时间内运行,但是却解决了这个问题,所以对于这个问题有一个非Omega(nlogn)的算法

答案 1 :(得分:0)

我不确定你的问题到底是什么,但据我所知,你需要对数组O(n log n)进行排序,然后你就可以轻松地对其进行分区。 所以我猜D是正确的吗?

答案 2 :(得分:0)

这是一个着名的问题。如果您知道stl,则可以使用nth_element。您可以在<algorithm>

中查看实施情况