【发布时间】:2016-02-03 22:23:50
【问题描述】:
在这个问题中,我们在 k 个排序数组中有 n 个元素,我们希望将它们合并为 1 个大小为 n 的排序数组。
该问题的最佳解决方案是在 O(nlogk) 时间内使用最小堆。 但是假设我们只想使用合并算法并将它们全部合并,直到我们得到输出数组,那么时间复杂度是多少? 数组是相同大小还是不同大小有关系吗?
感谢您的回答。
【问题讨论】:
标签: arrays algorithm merge time-complexity
在这个问题中,我们在 k 个排序数组中有 n 个元素,我们希望将它们合并为 1 个大小为 n 的排序数组。
该问题的最佳解决方案是在 O(nlogk) 时间内使用最小堆。 但是假设我们只想使用合并算法并将它们全部合并,直到我们得到输出数组,那么时间复杂度是多少? 数组是相同大小还是不同大小有关系吗?
感谢您的回答。
【问题讨论】:
标签: arrays algorithm merge time-complexity
似乎尺寸确实很重要,如果我错了,请告诉我。如果数组的大小为 1,2,4,8,16...(一棵树,其中每个级别都是一个排序数组,k=logn),它可以在 O(n) 时间内完成: -将最小的数组(根)与下一个更大的数组(1+2)合并 - 将结果与下一个更大的数组 (1+2+4) 合并,依此类推...
在最后的合并中,我们将进行 1+2+4+8+...+n/2 次比较。 请注意,我们比较每个元素的次数等于它在树中的高度。(假设我们从叶子计算高度=1)例如,根将被比较 logn 次但叶子只会被比较一次,我们知道它可以在 O(n) 内完成:
【讨论】:
Does it matter if the arrays are all the same size or different sizes?
不,它没有。
在每个阶段,您执行 O(N) 操作(大约 3/2*N,包括 N/2 比较和 N 移动 - 每个元素都参与比较,并被复制)。并且有 Log(K) 这样的阶段。总体复杂度 O(N*Log(K))
【讨论】: