好,数学(在某种程度上)我得到这样的:
T(n) = 2T(n/2) + c
T(1) = 1
归纳公式:
T(n) = 2^k * T(n/2^k) + (2^k - 1) * c
T(1) = 1
n/2^k == 1
时k == logN
这样:
T(n) = 2^logN * T(1) + (2^logN - 1) * c
因为T(1) = 1
并应用对数性质
T(n) = n * 1 + (n-1) * c
T(n) = n + n * c
T(n) = n * (1+c)
T(n) = O(n)
一个线索,这不是O(n*logn)
是你不必把两个子问题结合起来。与mergesort
不同,您必须将两个子数组组合在一起,此算法不必对递归结果做任何处理,因此其时间可表示为常量c
。
更新:背后
该算法直觉应该是为O(n),因为您访问的每个元素的数组中只有一次。这似乎并不重要,因为递归永远不会。
例如,您将问题分为两个子问题的一半大小,然后每个子问题也会被分成一半大小,并且会一直继续下去,直到每个子问题的大小为1. 完成后,您将拥有大小为1的子问题,即n*O(1) = O(n)
。
从第一个问题开始到第一个问题的大小为1的对数为对数,因为在每一步中你都细分为两个。但是在每一步中,您对结果都不做任何处理,因此这不会增加解决方案的时间复杂性。
希望这有助于
你知道如何'MergeSort'工作,和'O(N * LOGN)'复杂的证明吗? –