在this SO answer中,有一个例子计算长度为32(最差情况)的数组的mergesort递归调用次数:1 + 2 + 4 + 8 + 16 + 32 = 63.
想象为什么会出现这种情况是非常微不足道的 - 在树的每个级别上我们都有2个幂的节点,而且我们总是进入下一个级别,直到最后一个级别。
我想知道如何计算任意长度n
的数组的这个数字(最大递归调用次数)?在实践中,数字似乎是2*n-1
,但我无法理解为什么。有人可以解释它背后的逻辑吗?
答案 0 :(得分:2)
让我们看看模式。
如果n = 1
只有一个电话(没有任何关系)。
如果n
属实,那么对于2n
,我们的第一个电话会将其分为n
和n
,我们会在2n-1
个电话中对其进行排序,4n-2
更多。所以我们需要1 + 4n-2 = 4n - 1 = 2*(2n)-1
并且结果成立。
如果n
和n+1
属实,那么2n+1
我们的第一次通话会将其分为n
和n+1
。我们会对其他2n-1
和2(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.依旧如此。
你可以很容易地转过来,通过强烈的归纳使其成为正式的证明。