最有可能在问过这个问题。来自CLRS(第二版)问题6.5-8-
给出一个时间算法,将k个排序列表合并为一个排序列表,其中n是所有输入列表中元素的总数。(提示:请使用最小堆进行k向合并。)
由于有排序的列表且总共有n个值,所以我们假设每个列表包含n个数字,而且每个列表都严格按升序排序,结果也将按升序存储。
我的伪代码看起来像这样-
list[k] ; k sorted lists
heap[k] ; an auxiliary array to hold the min-heap
result[n] ; array to store the sorted list
for i := 1 to k ; O(k)
do
heap[i] := GET-MIN(list[i]) ; pick the first element
; and keeps track of the current index - O(1)
done
BUILD-MIN-HEAP(heap) ; build the min-heap - O(k)
for i := 1 to n
do
array[i] := EXTRACT-MIN(heap) ; store the min - O(logk)
nextMin := GET-MIN(list[1]) ; get the next element from the list 1 - O(1)
; find the minimum value from the top of k lists - O(k)
for j := 2 to k
do
if GET-MIN(list[j]) < nextMin
nextMin := GET-MIN(list[j])
done
; insert the next minimum into the heap - O(logk)
MIN-HEAP-INSERT(heap, nextMin)
done
我的整体复杂度变。我找不到任何办法避免Ô (ķ )内部循环Ø (ñ )循环查找k个列表中的下一个最小元素。还有其他办法吗?如何获得算法?