算法 K-Way 合并。这个解决方案是 O(n log k) 吗?
Algorithm K-Way Merge. Would this solution be O(n log k)?
所以问题是使用最小堆将 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并将其放入结果数组中。基本上,由于从给定的 k 个排序列表中删除所有元素,kWayMerge 中的外循环将迭代 n 次。
您提出的算法称为 Ideal Merge technique for k-way merge, and indeed runs in O(n log(k)), assuming the min-heap is implemented with a logarithmic data structure (e.g., a binary heap。
堆被访问Θ(n)次,因为每一项恰好被插入和提取一次。
堆在每个点最多包含 k 个元素(请注意,某些列表可能 "depleted" 在其他列表之前)。
所有其他操作都是每个元素的常数时间。
所以,如果每次访问堆是O(log(k')),其中k'是访问的次数堆中的元素,则总海岸为 O(n log(k)).
Min 也有 运行 时间,这里是 O(k)
所以它的 O(nk logk)
所以问题是使用最小堆将 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并将其放入结果数组中。基本上,由于从给定的 k 个排序列表中删除所有元素,kWayMerge 中的外循环将迭代 n 次。
您提出的算法称为 Ideal Merge technique for k-way merge, and indeed runs in O(n log(k)), assuming the min-heap is implemented with a logarithmic data structure (e.g., a binary heap。
堆被访问Θ(n)次,因为每一项恰好被插入和提取一次。
堆在每个点最多包含 k 个元素(请注意,某些列表可能 "depleted" 在其他列表之前)。
所有其他操作都是每个元素的常数时间。
所以,如果每次访问堆是O(log(k')),其中k'是访问的次数堆中的元素,则总海岸为 O(n log(k)).
Min 也有 运行 时间,这里是 O(k)
所以它的 O(nk logk)