#algorithm #recursion #recurrence
#алгоритм #рекурсия #повторение
Вопрос:
Добрый вечер. На прошлой неделе для моего курса я изучал, как вычислять время выполнения, а также определять рекуррентные соотношения для заданных алгоритмов. Меня устраивают итеративные алгоритмы, но не рекурсивные алгоритмы. Особенно, когда есть два рекурсивных вызова, которые выполняются один за другим.
Например:
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}
}
Если кто-нибудь может помочь мне определить рекуррентное отношение для этой функции / функции, подобной ей, и проведет меня через шаги по определению отношения, я поцелую ваши сапоги (не совсем, но ваша помощь будет очень признательна).
Ответ №1:
Ваша рекурсия описывается простой зависимостью, потому что вы делите задачу на две равные подзадачи и выполняете постоянное количество операций:
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))
(благодаря дополнению Абхишека Бансала)
Комментарии:
1. Было бы неплохо добавить в качестве отступа, что сложность пространства равна O (logn).