我正在阅读Cormen的算法简介
我无法理解为什么将n/k
数组与k
元素合并在一起,其复杂度为O(n*log(n/k))
。
我在这里缺少的是我们有n/k
个数组。因此,我们必须以n/(k-1)
上限执行合并O(n)
次
但是我们有一个对数,所以我想我在理解Merge复杂性时遗漏了一些东西。
欢迎任何帮助。
答案 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)
的堆,并让它保留每个尚未耗尽的数组中的最小数字,并且在迭代时 - 获取堆中最小的元素到结果数组。