Mergesort - 递归调用的最大数量

时间:2017-10-16 16:43:38

标签: algorithm recursion mergesort

this SO answer中,有一个例子计算长度为32(最差情况)的数组的mergesort递归调用次数:1 + 2 + 4 + 8 + 16 + 32 = 63.

想象为什么会出现这种情况是非常微不足道的 - 在树的每个级别上我们都有2个幂的节点,而且我们总是进入下一个级别,直到最后一个级别。

我想知道如何计算任意长度n的数组的这个数字(最大递归调用次数)?在实践中,数字似乎是2*n-1,但我无法理解为什么。有人可以解释它背后的逻辑吗?

1 个答案:

答案 0 :(得分:2)

让我们看看模式。

如果n = 1只有一个电话(没有任何关系)。

如果n属实,那么对于2n,我们的第一个电话会将其分为nn,我们会在2n-1个电话中对其进行排序,4n-2更多。所以我们需要1 + 4n-2 = 4n - 1 = 2*(2n)-1并且结果成立。

如果nn+1属实,那么2n+1我们的第一次通话会将其分为nn+1。我们会对其他2n-12(n+1)-1 = 2n+1电话进行排序。进行1 + 2n-1 + 2n+1 = 4n + 1 = 2*(2n+1) - 1来电。

因为它对于1是正确的,所以对于2是正确的。因为它对于1和2都是正确的,因为它对于2是正确的,因此对于4是正确的。因为它对于2和3对于5.依旧如此。

你可以很容易地转过来,通过强烈的归纳使其成为正式的证明。