使用N way Merge的时间复杂度

时间:2012-05-02 19:31:15

标签: algorithm complexity-theory

我正在研究双向合并排序算法,并且正在考虑如果通过减少合并通过,我们可以在时间上获得更好的收益。

例如,在双向合并中,我们有以下重复:

T(n)= 2T(n / 2)+ O(n)

,其时间复杂度为N.log-base2(N)

如果我将问题除以4并合并4个子数组,我将得到

T(n)= 4T(n / 4)+ O(n)

这应该具有N.log-base4(N)

的时间复杂度

因为合并传递的数量减少了,在实现合并排序时应该考虑这个问题吗?

例如,对于64个元素的数组,第一种方法将有6次传递,使用第二种方法将有3次传递。

编辑:

好的,所以2T(n / 2)我们每次进行N次比较,4T(n / 4)我们最终每次进行3 * N比较?将元素移动到结果的成本怎么样,每次传递都保持不变?

3 个答案:

答案 0 :(得分:2)

请注意,数字的base-4日志恰好是数字的base-2 log的一半;因此,你只是引入了恒定因子加速。除非你没有,因为你在实际合并的成本中引入了类似的常数因子SLOWDOWN(双向合并需要每个项目1个比较,4路可能需要最多3个)。因此,虽然传球次数较少,但传球的成本更高。所以你的代码很复杂,而且好处也很有问题。

答案 1 :(得分:0)

这听起来很合理,但事实并非如此,因为在这种情况下,您必须至少进行5次比较才能对每4个元素进行排序。这样你就可以进行5 * N * log4(N)比较,这比N * log2(N)要大5 * log(2)/ log(4)

答案 2 :(得分:0)

分解树的高度为log 4 n,但运行时间不是n log 4 n。

在第一步中,您有四个大小为n / 4的列表,它们的合并需要n / 4 + n / 4 + n / 2比较。但是在正常情况下需要进行n / 2比较,所以你将树的高度减半,但是你将每个合并乘以2,所以总运行时间并不比分为2部分好。 (你可以证明树的其他深度,你应该至少有两次比较树与两个分支相比)。


P.S:通过运行时间我的意思是比较次数。