所以问题是使用最小堆将k个排序列表(假设它们按升序排序)合并为1个n个元素列表。现在我找到了一个解决方案,但我不确定它是否可以有nlogk的运行时间。这是我的伪代码,你们觉得怎么样?
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并将其放入生成的数组中。基本上,kWayMerge中的外循环将迭代n次,因为从给定的k个排序列表中删除了所有元素。
答案 0 :(得分:2)
你提出的算法被称为Ideal Merge technique for k-way merge,并且确实在 O(n log(k))中运行,假设min-heap是用对数数据结构实现的(例如,binary heap。
访问堆Θ(n)次,因为每个项目只插入并提取一次。
堆中每个点最多包含 k 元素(请注意,某些列表可能会在其他列表之前“耗尽”)。
所有其他操作都是每个元素的常量时间。
因此,如果每次访问堆都是 O(log(k')),那么 k'是堆中元素的数量,那么总数海岸是 O(n log(k))。
答案 1 :(得分:0)
Min也有运行时间,这里是O(k)
所以它的O(nk logk)