合并排序中合并操作的复杂性

时间:2016-11-20 13:11:19

标签: algorithm sorting merge mergesort array-merge

我正在阅读Cormen的算法简介 我无法理解为什么将n/k数组与k元素合并在一起,其复杂度为O(n*log(n/k))。 我在这里缺少的是我们有n/k个数组。因此,我们必须以n/(k-1)上限执行合并O(n)次 但是我们有一个对数,所以我想我在理解Merge复杂性时遗漏了一些东西。

欢迎任何帮助。

1 个答案:

答案 0 :(得分:2)

假设您只能使用merge(a,b)合并两个数组,那么您可以构建合并的“树”:

sshpass

现在,确实使用此操作确实会a b c d ab cd abcd 合并 - 但请注意,其中大多数都是使用少量元素完成的,每个数组的元素明显少于n/k - 1

如果你仔细计算,你会得到:

n

如果你做代数,你会注意到这确实是2*(n/k)/2 * k + 2*(n/k)/4 * 2k + .... + 1*n

另一方面,k-way合并的另一种方法是保存一个大小为n*log(n/k)的堆,并让它保留每个尚未耗尽的数组中的最小数字,并且在迭代时 - 获取堆中最小的元素到结果数组。