所以問題是將k個已排序列表(假設它們按升序排序)合併爲一個使用min堆的n個元素列表。現在我找到了一個解決方案,但我不確定它是否可以有nlogk的運行時間。這是我的僞代碼,你們怎麼看?算法K-Way合併。這個解決方案是O(n log k)嗎?
Algorithm kWayMerge(S)
t ← 0
Result ← ∅
while t ≤ n do
choosenHeap ← min(S1[1], … Sk[1])
t ← t + 1
Result[t] ← DeleteMin(choosenHeap)
end loop
end
Function DeleteMin(H)
Min ← A[1]
A[1] ← A[size[H]]
size[H] ← size[H] - 1
DownHeap(H, 1)
return Min
end
Function DownHeap(A, t)
c ← 2*t
if c > size[A] then
return
if c+1 > size[A] && A[c] > A[c + 1] then
c ← c + 1
temp ← A[t]
A[t] ← A[c]
A[c] ← temp
DownHeap(A, c)
end
基本上我的解決方案是搜索k列表並找到具有最小根值的Min Heap並將其放入結果數組中。基本上,由於從給定的k個排序列表中移除所有元素,因此kWayMerge中的外部循環將迭代n次。
你未定義功能'min'。如果它以線性時間運行,那麼代碼將以_O(k n)_運行。 – kgeorgiy