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

Algorithm 合并排序中合并操作的复杂性,algorithm,sorting,merge,mergesort,array-merge,Algorithm,Sorting,Merge,Mergesort,Array Merge,我正在读科曼的算法简介。 我不明白为什么将n/k数组与k元素合并在一起会有O(n*log(n/k)) 这里我缺少的是我们有n/k数组。因此,我们必须执行合并n/(k-1)次,每次合并O(n)上限。 但是我们有一个对数,所以我想我在理解合并复杂性时遗漏了一些东西 欢迎提供任何帮助。假设您只能使用merge(a,b)合并两个数组,那么您可以构建一个“合并树”: a b c d ab cd abcd 现在,使用此操作确实是在进行n/k-1

我正在读科曼的算法简介。
我不明白为什么将
n/k
数组与
k
元素合并在一起会有
O(n*log(n/k))

这里我缺少的是我们有
n/k
数组。因此,我们必须执行合并
n/(k-1)
次,每次合并
O(n)
上限。
但是我们有一个对数,所以我想我在理解合并复杂性时遗漏了一些东西


欢迎提供任何帮助。

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

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

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

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



另一方面,进行k-way合并的另一种方法是持有一个大小为n/k的堆,让它持有每个数组中尚未用尽的最小数,并在迭代时将堆中最小的元素放入结果数组。

我刚刚意识到了这一点。谢谢。但是如果我们使用heap,常量不是会更高一点吗?因为插入时可能会有几个交换?@LongSmith heap数据结构具有良好的引用属性局部性,这意味着它非常适合缓存。它将取决于机器和特定场景,但我相信对于大多数实现来说,它会有更好的常量,因为它。