非唯一排序数组中的第k个最小元素

时间:2012-06-21 17:20:29

标签: algorithm data-structures language-agnostic

这可能是微软面试的问题。

从排序数组中找出第k个最小元素(忽略重复) [编辑] :数组可能包含重复项(未指定)。

多次思考,但仍在质疑自己:是否还有更好的解决方案?

方法1:

拿一个最大堆&插入第一个k个独特元素[可以轻松检查]。堆积堆。
现在,当一个新元素小于堆的头部时,用这个新元素替换head将它堆积起来。最后,如果堆的大小为k,则堆的头指示第k个最小元素,否则第k个最小元素不存在。

时间复杂度:O(NlogK)
空间复杂度:O(K)

方法2 [更好的方法]:

元素可能是正确的。因此,通过与之前的元素进行比较来检查独特元素。如果到目前为止发现的唯一变量计数为k,则停止 时间复杂度:O(N)
空间复杂度:O(1)

方法3 [更好的方法(可能)]:

也可以使用快速排序分区算法的修改版本。但是,由于阵列已经排序,可能会导致最坏的情况 这里出现两个问题:
1. 如果数组包含重复项,它是否有效?
2. 它会不会比我的第二个apporach好吗?


我想知道是否存在任何O(logn)解决方案?

2 个答案:

答案 0 :(得分:8)

这是一个O(kLogN)解决方案:

使用二进制搜索的变体来查找给定值的最后一次出现,

  1. 获得第一个值 - O(1)。
  2. 搜索此值O(logN)的最后一次出现,然后查看下一个元素以获取第二个值 - O(1)。
  3. 重复直到找到第k个值。

答案 1 :(得分:5)

k - 最小元素似乎有两种不同的解释。我假设它意味着“ k - 最小元素,忽略重复。”

最好的解决方案是O(n)时间和O(1)空间,正如您在方法2中描述的那样。我们可以证明这一点。

  • 我们无法改进O(1)空间(至少不是O符号)。
  • 考虑一种小于O(n)的方法。这种方法不能考虑数组中的每个元素。考虑一个这样的遗漏元素。它不知道这个元素是否是它之前或之后的值的重复¹,并且该信息是断言数组中哪个值对应于 k -th最小值所必需的。

¹在两个非相邻数组元素具有相同值的特殊情况下,可以推断排序数组的任意长子序列的值:所有临时元素必须共享该值。但这不是一个典型的案例,所以我忽略了它。