运行 递归算法的时间
Running time of a recursive algorithm
我遇到一个问题,询问以下递归算法的 运行 时间是多少。
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;
}
这段代码只是 returns 给定数组的最大值。
答案是 O(N),但我不知道如何证明它..(我的第一个猜测是 O(logN)...但它似乎不正确...)
这是写出递归关系的好地方。每个递归调用都会进行恒定量的比较值和计算数组的中间点的工作,然后进行两次递归调用,每次调用都是原始大小的一半。将其写成递归关系,我们得到
T(n) = 2T(n / 2) + O(1)
然后您可以使用主定理来解决这个问题,其求解时间复杂度为 O(n)。或者,您可以考虑此递归树的形状。每个级别都会使递归调用的次数加倍,并且级别的数量将为 O(log n),因为您重复将 n 减半。这意味着第一层的总调用次数为 1,第二层为 2,第三层为 4,第四层为 8,等等。求和得到
1 + 2 + 4 + 8 + 16 + ... + n
= 20 + 21 + 22 + ... + 2log n
= 2(log n + 1) - 1
= 2n - 1
= O(n)
希望对您有所帮助!
我遇到一个问题,询问以下递归算法的 运行 时间是多少。
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;
}
这段代码只是 returns 给定数组的最大值。
答案是 O(N),但我不知道如何证明它..(我的第一个猜测是 O(logN)...但它似乎不正确...)
这是写出递归关系的好地方。每个递归调用都会进行恒定量的比较值和计算数组的中间点的工作,然后进行两次递归调用,每次调用都是原始大小的一半。将其写成递归关系,我们得到
T(n) = 2T(n / 2) + O(1)
然后您可以使用主定理来解决这个问题,其求解时间复杂度为 O(n)。或者,您可以考虑此递归树的形状。每个级别都会使递归调用的次数加倍,并且级别的数量将为 O(log n),因为您重复将 n 减半。这意味着第一层的总调用次数为 1,第二层为 2,第三层为 4,第四层为 8,等等。求和得到
1 + 2 + 4 + 8 + 16 + ... + n
= 20 + 21 + 22 + ... + 2log n
= 2(log n + 1) - 1
= 2n - 1
= O(n)
希望对您有所帮助!