Usando el siguiente algoritmo recursivo de Fibonacci:
def fib(n):
if n==0:
return 0
elif n==1
return 1
return (fib(n-1)+fib(n-2))
Si ingreso el número 5 para encontrar fib (5), sé que esto generará 5, pero ¿cómo examino la complejidad de este algoritmo? ¿Cómo calculo los pasos involucrados?
Respuestas:
La mayoría de las veces, puede representar los algoritmos recursivos utilizando ecuaciones recursivas. En este caso, la ecuación recursiva para este algoritmo es . Luego puede encontrar la forma cerrada de la ecuación utilizando el método de sustitución o el método de expansión (o cualquier otro método utilizado para resolver las recurrencias). En este caso, obtienes T ( n ) = Θ ( ϕ n ) , donde ϕT( n ) = T( n - 1 ) + T( n - 2 ) + Θ ( 1 ) T( n ) = Θ ( ϕnorte) ϕ es la proporción áurea ( ϕ = ( 1 + 5√)2 )
Si desea obtener más información sobre cómo resolver las recurrencias, le recomiendo que lea el capítulo 4 de Introducción a los algoritmos .
fuente
Como alternativa a las relaciones de recurrencia / análisis matemático (pero no un sustituto ), un ejercicio empírico simple, aparentemente no enseñado muy a menudo en las clases pero muy informativo, es contar el número de ejecuciones de la función y luego graficar el recuento para un rango de pequeño n entradas , y luego la curva se ajusta al resultado. los resultados generalmente coincidirán estrechamente con el enfoque matemático teórico.
Puede encontrar un buen material de apoyo para este ejercicio en el capítulo 3 en línea gratuito, tiempo de ejecución de algoritmos / Fundamentos de Ciencias de la Computación , Ullman
fuente
El resultado de fib (n) es la suma de todas las llamadas recursivas que devolvieron 1. Por lo tanto, hay exactamente llamadas recursivas fib (n) que evalúan fib (1). Entonces el tiempo de ejecución es Ω (fib (n)); deberías demostrar que las llamadas que devuelven 0 y las otras llamadas recursivas no se suman significativamente.
El mismo razonamiento se aplicaría a cualquier función definida recursivamente que devuelva 1 o 0, o el resultado de otra llamada recursiva.
fuente
Un límite inferior es intuitivo:T( n ) = T( n - 1 ) + T( n - 2 )
T( n ) > 2 T( n - 2 ) ya que T( n - 1 ) > T( n - 2 )
Por lo tanto T( n ) = Ω ( cnorte)
fuente