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

How to convert an array with 0(n log k)?

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

输出:一维数组 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 

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

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

数组 B 应在每一步由堆中最顶层的元素填充。

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

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