我对这个问题中提出的想法进行了编码:merging sorted arrays,如下所示:Big-O complexity calculation for a merge and sort function。
可以看出,这种方法的复杂性超过了所希望的程度。有没有更好的方法(除了使用LINQ)?这种方法的根本缺陷是什么,如果有的话?
发布于 2014-03-14 18:31:24
我们可以使用最小堆在O(nk*Logk)时间内合并数组。
n
=数组的最大大小,k
=数组的数量。
n*k
的输出数组(您也可以打印它们)。k
的最小堆,并将所有数组中的第一个元素插入到堆中n*k
次。a)从堆中获取minimum元素(minimum始终位于根),并将其存储在输出数组中(或打印它)。
b)用从其中提取元素的数组中的下一个元素替换堆根。如果数组没有更多的元素,则将root替换为infinite。在替换了根之后,堆积树。
Time Complexity:主要步骤是3rd
步骤,循环运行n*k
次。在循环的每一次迭代中,我们调用heapify,这会占用O(Logk)
时间。
因此,时间复杂度是O(nk*Logk)
。
EDIT1:Heapify确保你总是有最小堆,如果最小的子节点小于父节点,它会将最小的子节点与父节点交换。
这确保了INFINITY
元素将保留在堆的底部,而所有k
数组中的最小元素将保留在堆的顶部(根)。
https://stackoverflow.com/questions/22412694
复制相似问题