大O递归方法

时间:2018-03-03 20:18:48

标签: big-o asymptotic-complexity

我有一个名为二进制和的方法

Algorithm BinarySum(A, i, n):
Input: An array A and integers i and n
Output: The sum of the n integers in A starting at index i
if n = 1 then
    return A[i]
return BinarySum(A, i, n/ 2) + BinarySum(A, i + n/ 2, n/ 2)

忽略使一个简单的问题变得复杂的事实我被要求找到Big O.这是我的思考过程。对于大小为N的数组,我将进行1 + 2 + 4 .. + N个递归调用。这接近于1到N之和的一半所以我会说它是N(N + 1)/ 4。在进行了这么多次调用后,我需要将它们加在一起。所以我需要再次执行N(N + 1)/ 4次加法。将它们加在一起我们留下N ^ 2作为主导术语。 那么这个算法的大O是O(N ^ 2)吗?或者我做错了什么。有二进制递归并且在最终答案中没有2 ^ n或log n感觉很奇怪

1 个答案:

答案 0 :(得分:2)

在最终结果中, 实际上是2^nlog n条款......排序。

对于每个长度为n的子数组的调用,对这个数组的两半进行两次递归调用,加上一定量的工作(if语句,加法,推送到调用堆栈等) )。因此,递归关系由下式给出:

enter image description here

此时我们可以只使用 Master定理直接得出最终结果 - O(n)。但是,让我们通过反复扩展来推导它:

enter image description here

停止条件n = 1给出m的最大值(忽略舍入):

enter image description here

在步骤(*)中,我们使用了几何系列的标准公式。因此,从某种意义上说,答案确实涉及log n2^n条款,但它们会取消"取消" out给出一个简单的线性项,与简单的循环相同。