如何将数组转换为0(n log k)?

时间:2015-02-12 09:52:20

标签: algorithm converter

输入:n个整数的数组A和k值(k <= n)

输出:1D阵列B

B[i]{ if i<k = 0 
      else k-th smallest number of A[1...i]

B应该具有A [1]到A [i]中最小值的第3个值,但如果i<k B值为0

O(nlogk)

示例:

A: 2 -3 5 1 6
k=3
B: 0 0 5 2 2 

1 个答案:

答案 0 :(得分:2)

除了数组外,还要维护一个包含目前为止看到的k个最小元素的最大堆。

然后从let到右扫描数组,如果数组中的当前元素小于堆中最顶层的元素,则删除最顶层的元素并插入这个新元素(在log(k)时间内)

阵列B应由每一步中堆中最顶层的元素填充。

在您的示例中,最初堆是空的。

  1. 扫描2.堆包含2,B [1] = 0.
  2. 扫描-3。堆现在是:
    ..2
    -3
    B [2] = 0.
  3. 扫描5.现在堆:
    ... 5
    -3 2
    B [3] = 5.
  4. 扫描1.堆现在:
    ... 2
    -3 1
    B [4] = 2.
    等等..