第k个最小的数字

时间:2016-05-27 06:27:12

标签: algorithm binary-search

假设我们有n(1 <= n <= 10 ^ 3)个大小为A1,A2,......的分类数组。 (1 << =艾&LT = 10 ^ 3)。我们需要将唯一组合中的第k个最小整数归类为这些数组。是否有一种有效的方法来执行此操作,复杂度小于O(A1 + A2 .. + An)?

可以解决类似于二分搜索的问题吗?

PS:我这里有similar problem,但无法理解如何为独特元素扩展它。

编辑1:我想你们有些人误解了这个问题。我们举一个例子: N = 3,

A1 = 1,1,3,3

A2 = 6,7,9

A3 = 1,6,8

上述数组的独特组合是{1,2,3,6,7,8,9}。现在假设我想要第二个元素它应该返回2而第四个元素它应该返回6。

2 个答案:

答案 0 :(得分:1)

可以O(k n log n)

  • 使用每个数组中的最小元素创建一个小堆。
  • 重复k次:
    • 查看最小堆中的最小元素q并记住它
    • 从最小堆中提取,最小值等于q
    • 对于每个提取的元素,将第一个元素放在大于q的相应数组
  • 答案是min-heap中的最小元素

Python代码:

import heapq
import bisect

def kth(A, k):
    h = []

    for idx,a in enumerate(A):
        if len(a) > 0:
            heapq.heappush(h, (a[0], idx))

    for i in xrange(k):
        if len(h) == 0:
            return None

        val, _ = h[0]

        while (len(h) > 0) and (h[0][0] == val):
            _, idx = heapq.heappop(h)
            nxt = bisect.bisect_right(A[idx], val)
            if nxt < len(A[idx]):
                heapq.heappush(h, (A[idx][nxt], idx))

    if len(h) > 0:
        return h[0][0]
    return None

答案 1 :(得分:0)

是否有空间要求,或者数组中的数字是否可以重复?

如果没有,您可以创建2个有序集:唯一和非唯一。 添加数组时,循环遍历数组并将其数字添加到2个有序集中,如下所示:

  • 如果nonUniques中存在新号码,请跳过它
  • 如果uniques中存在某个数字,请将其从uniques中删除并将其添加到nonUniques
  • 否则将新号码添加到uniques

然后,您可以立即在排序的唯一身份集中查找第k个最小数字。