我想编写一个时间O(n * lgk)的算法,用于将k个排序数组合并到一个排序数组中,其中n是所有输入数组的元素总数。
你能否给我一个暗示我们如何做到这一点?
编辑:我写了以下算法:
Algorithm(L) // L=[L1, L2, L3, ...., Lk]
list=LNEW;
for (i=1; i<=k; i++){
H[i]=L[i][1];
}
BUILD-HEAP(H);
j=1;
while (j<n){
LNEW[j]=H[1];
yes=0;
m=1;
while (m<=k and L[m][j]!=NULL and L[m][j+1]!=NULL and yes!=1){
if (H[1]==L[m][j]){
H[1]=L[m][j+1];
yes=1;
Heapify(H);
}
j=j+1;
}
你能告诉我它是否正确吗?
答案 0 :(得分:0)
我们可以维护一个k元素firstFree数组,其中firstFree [i]是第i个数组中第一个未使用的元素。另外,我们可以有一个最多包含k个元素的堆(每个元素都是一对(value,包含该值的数组的索引))。最初,我们应该将所有给定数组的第一个元素放入此堆中。之后,我们应该重复以下过程,直到堆为空:
弹出堆的顶部元素。将其添加到输出数组。
增加包含此元素的数组的firstFree值。如果它不超过此数组的大小,请将下一个元素添加到堆中。
该算法执行n次插入和弹出操作,因此其时间复杂度为O(n log k)。