我正在研究双向合并排序算法,并且正在考虑如果通过减少合并通过,我们可以在时间上获得更好的收益。
例如,在双向合并中,我们有以下重复:
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比较?将元素移动到结果的成本怎么样,每次传递都保持不变?
答案 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:通过运行时间我的意思是比较次数。