如何在O(N log k)时间内创建最大堆

时间:2018-03-10 21:32:34

标签: algorithm

我想在O(N log k)时间内创建最大堆排序,k是列表中k个最大元素的数量。但是,下面的伪代码算法将生成O(N log(N))时间。如何在O(N log k)时间内调整此值?

function heapsort(array[1..N])
  heapify(array[1..N])
  for i = N to 1 do
    array[i] = extract max(array[1..i])
  end for
end function

1 个答案:

答案 0 :(得分:1)

如果你想要的是使用堆获取k个最大的元素,那么你可以使用最小堆而不是最大堆。
堆的大小为k,然后迭代列表并将下一个元素与堆顶部(min)进行比较。如果它更大,则提取min并插入元素 最后,您将拥有一个包含k个最大元素的最小堆。

function KlargestSort(array[1..N])
  min_heap = heapify(array[1..K])

  for i = K+1 to N do
    if (min_heap.top() < A[i])
      min_heap.extract_min()
      min_heap.insert(A[i])
  end for

  for i = 1 to K
    sorted[i] = min_heap.top()
    min_heap.extract_min()
  end for

end function

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