递归算法的运行时间

时间:2015-04-08 17:35:28

标签: performance recursion big-o

我遇到了一个问题,询问以下递归算法的运行时间是什么。

  int func(int A[], unsigned int len)
  {      if(len==1) return A[0];

         unsigned int mid=len/2;
         int a=func(A,mid); //first half
         int b=func(A+mid,len-mid);//second half

         if(a<b) return b;
         else return a;
  }

此代码只返回给定数组的最大值。

答案是O(N),但我不知道如何证明它......(我的第一个猜测是O(logN)......但似乎它是不正确的......)< / p>

1 个答案:

答案 0 :(得分:2)

这是写出递归关系的好地方。每个递归调用都会进行一定量的工作,比较值并计算数组的中间点,然后进行两次递归调用,每次调用的次数都是原始函数的一半。把它写成递归关系,我们得到

  

T(n)= 2T(n / 2)+ O(1)

然后你可以使用主定理来解决这个问题,它解决了O(n)。或者,您可以考虑此递归树的形状。每个级别使递归调用的数量加倍,并且级别数将为O(log n),因为您反复将n减半。这意味着第一层中总呼叫数为1,第二层为2,第三层为4,第四层为8,等等。总结得出

  

1 + 2 + 4 + 8 + 16 + ... + n

     

= 2 0 + 2 1 + 2 2 + ... + 2 log n

     

= 2 (log n + 1) - 1

     

= 2n - 1

     

= O(n)

希望这有帮助!