晚上好。在我上课的过去一周,我一直在学习如何计算运行时间以及确定给定算法的递归关系。我对迭代算法感到满意,但不是递归算法。特别是当有两个递归调用一个接一个地发生时。
例如:
FindMin(int A[], int front, int last)
if (last-front <= 1)
return A[front]
else {
midpoint = (front+last)/2
int minFront = FindMin(A, front, midpoint)
minLast = FindMin(A, midpoint+1, last)
return min{minFront, minLast}
}
如果有人可以帮我确定这个功能的复发关系/类似的功能,并指导我完成确定关系的步骤,我会亲吻你的靴子(不是真的,但你的帮助将非常感激)。
答案 0 :(得分:2)
您的递归由简单依赖描述,因为您将任务除以两个相等的子任务并执行常量操作:
T(n) = 2 * T(n/2) + C
T(n) = 2 * (2 * T(n/4) + C) + C = 4 * T(n/4) + 3*C
T(n) = 4 * (2 * T(n/8) + C) + 3*C = 8 * T(n/8) + 7*C
...
T(n) = n * T(1) + (n-1)*C = n * C = O(n)
请注意,此递归的堆栈深度为log(N),因此空间复杂度为O(log(N))
(感谢Abhishek Bansal补充)