我对此问题中提出的想法进行了编码:merging sorted arrays,如下所示:Big-O complexity calculation for a merge and sort function。
可以看出,这种方法的复杂性超出了预期的范围。有没有更好的方法(除了使用LINQ)?如果有的话,这种方法的根本缺陷是什么?
答案 0 :(得分:0)
我们可以使用Min Heap在O(nk * Logk)时间内合并数组。
n
=数组的最大大小,k
=数组的数量。
n*k
的输出数组(您也可以只打印它们)。k
的最小堆,并将所有数组中的第一个元素插入到堆n*k
次
a)从堆中获取最小元素(最小值始终为root)并将其存储在输出数组中(或打印它)
b)将堆根替换为从中提取元素的数组中的下一个元素。如果数组没有任何其他元素,则用无限替换root。替换root后,堆化树。 时间复杂度:主要步骤为3rd
步骤,循环运行n*k
次。在循环的每次迭代中,我们调用heapify,花费O(Logk)
时间
因此,时间复杂度为O(nk*Logk)
。
EDIT1 : Heapify确保您始终拥有 min-heap ,如果最小值小于父节点,它会将最少的子节点与父节点交换。
这可确保INFINITY
元素保留在底部,并且所有k
数组中的最小元素保留在堆的顶部(根)。