我只想确认我走在正确的方向上。我想通过递归地拆分数组并找到每个单独数组的最大值来找到数组的最大值。因为我正在拆分它,所以复杂度是2*T(n/2)。并且因为我必须在结束时比较这两个数组,所以有T(1)。那么我的递归关系应该像这样:
T = { 2*T(n/2) + 1, 当 n>=2 ; T(1), 当 n=1;
因此,我的时间复杂度为Theta(nlgn)。
T = { 2*T(n/2) + 1, 当 n>=2 ; T(1), 当 n=1;
因此,我的时间复杂度为Theta(nlgn)。
T = 2*T(n/2) + 1 = 2*(2*T(n/4) + 1) + 1 = ...
对于第 i 次迭代,您将获得以下内容:
Ti(n) = 2^i*T(n/2^i) + i
现在你想知道哪个i使得n/2^i等于1(或者其他常数,如果你喜欢),以便到达n=1的终止条件。 这将是n/2^I = 1的解答-> I = Log2(n)。把它放进Ti的公式中,你将得到:
TI(n) = 2^log2(n)*T(n/2^log2(n)) + log2(n) = n*1+log2(n) = n + log2(n)
当你得到T(n) = O(n + log2(n))时(就像@bdares所说的那样),你可以得到T(n) = O(n)(就像@bdares所说的那样)。
不,你每次递归都需要O(1)时间。
有多少个叶子节点?
有N个叶子节点,所以至少需要O(N)的时间。
要找到绝对最大值,需要比较多少个叶子节点?这是O(log(N))的。
将它们加在一起,不要相乘。你的时间复杂度是O(N+log(N))。