我想在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
答案 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)