Performance 递归算法的运行时间

Performance 递归算法的运行时间,performance,recursion,big-o,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;

我遇到一个问题,问下面递归算法的运行时间是多少

  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;
  }
int func(int A[],无符号int len)
{if(len==1)返回[0];
无符号整数mid=len/2;
int a=func(a,mid);//前半部分
int b=func(A+mid,len-mid);//后半部分

如果(a这是一个写出递归关系的好地方。每个递归调用都会做一个常量的工作,比较值并计算数组的中点,然后进行两个递归调用,每个递归调用的大小都是原来的一半。将其作为递归关系写出,我们得到

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

然后你可以使用主定理来解决这个问题,它可以解出O(n)。或者,你可以考虑这个递归树的形状。每一层都会使递归调用的数量加倍,层的数量将是O(logn)因为你不断地把n减半,这意味着第一层的呼叫总数是1,第二层是2,第三层是4,第四层是8,以此类推

1+2+4+8+16+…+n

=20+21+22+…+2对数n

=2(对数n+1)-1

=2n-1

=O(n)


希望这有帮助!

O(N)看起来是正确的,因为它是按顺序通过一个数组,然后通过同一数组的第二部分。所以本质上是O(2N),本质上是O(N)。你应该能够使用归纳证明来确定运行时间。非常感谢!我还没有学习主定理,但树的形状是有意义的。我错把树的级别当作运行时间了