Analizando las funciones recursivas (o incluso evaluación de las mismas) es una tarea trivial. a (en mi opinión) buena introducción se puede encontrar en Don Knuths Concrete Mathematics.
Sin embargo, analicemos ahora estos ejemplos:
Definimos una función que nos da el tiempo que necesita una función. Digamos que t(n)
denota el tiempo necesario por pow(x,n)
, es decir, una función de n
.
Entonces podemos concluir, que t(0)=c
, porque si llamamos pow(x,0)
, tenemos que comprobar si (n==0
), y luego regresar 1, que se puede realizar en un tiempo constante (de ahí la constante c
).
Ahora consideramos el otro caso: n>0
. Aquí obtenemos t(n) = d + t(n-1)
. Esto se debe a que tenemos que verificar nuevamente n==1
, calcular , por lo tanto (t(n-1)
), y multiplicar el resultado por x
.La verificación y la multiplicación se pueden realizar en tiempo constante (constante d
), el cálculo recursivo de pow
necesita .
Ahora podemos "ampliar" el término t(n)
:
t(n) =
d + t(n-1) =
d + (d + t(n-2)) =
d + d + t(n-2) =
d + d + d + t(n-3) =
... =
d + d + d + ... + t(1) =
d + d + d + ... + c
Así que, ¿cuánto tiempo se tarda hasta llegar a t(1)
? Como comenzamos en t(n)
y restamos 1 en cada paso, lleva n-1
pasos para llegar al t(n-(n-1)) = t(1)
. Eso, por otro lado, significa que obtenemos n-1
veces la constante d
, y t(1)
se evalúa a c
.
Así obtenemos:
t(n) =
...
d + d + d + ... + c =
(n-1) * d + c
por lo que tenemos que t(n)=(n-1) * d + c
elemento que es de O (n).
pow2
se puede hacer usando Masters theorem. Como podemos suponer que las funciones de tiempo para los algoritmos son monótonamente crecientes. Así que ahora tenemos el tiempo t(n)
necesaria para el cálculo de pow2(x,n)
:
t(0) = c (since constant time needed for computation of pow(x,0))
para n>0
obtenemos
/t((n-1)/2) + d if n is odd (d is constant cost)
t(n) = <
\ t(n/2) + d if n is even (d is constant cost)
Lo anterior puede ser "simplificado" a:
t(n) = floor(t(n/2)) + d <= t(n/2) + d (since t is monotonically increasing)
Por lo tanto, obtenga t(n) <= t(n/2) + d
, que se puede resolver usando el teorema de maestros a t(n) = O(log n)
(consulte la sección Aplicación a Popul ar Algoritmos en el enlace de wikipedia, ejemplo "Búsqueda binaria").
* La complejidad de ambas funciones es O (1) * - ¿Qué? – kennytm
O (1) ignora la llamada recursiva pero podría expresarse de manera diferente. El punto es que la complejidad total depende únicamente de la profundidad de recursión. – fgb