我遇到了一个问题,询问以下递归算法的运行时间是什么。
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>
答案 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)
希望这有帮助!