Complejidad del algoritmo recursivo de Fibonacci

13

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?

bufón
fuente
Estaba buscando lo mismo, y me topé con este video de MyCodeSchool . Recomiendo ver esto.
snbk97

Respuestas:

23

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(norte)=T(norte-1)+T(norte-2)+Θ(1)T(norte)=Θ(ϕnorte)ϕ es la proporción áurea ( ϕ=(1+5 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 .

ees_cu
fuente
0

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

vzn
fuente
1) El trazado de ninguna manera reemplaza el análisis formal. Se engaña fácilmente. 2) Creo que está falsificando la fuente que cita. Mencionan la trama, pero no como una forma de determinar la "complejidad". 3) FWIW, no estoy de acuerdo con el enfoque y su uso como lo presenta Ullman, pero eso no es tu culpa.
Raphael
1
la respuesta comienza esencialmente con su descargo de responsabilidad, diciendo que el trazado no es un sustituto del análisis matemático . el trazado es un método científico y decir / observar que a veces se deja engañar es aprender / evocar aspectos estadísticos de los datos, que es otro aspecto principal del análisis científico . pensar que se puede "engañar fácilmente" es bastante dramático, hay casos "patológicos" en los que falla, pero generalmente están "inventados" ... la pregunta era examinar la complejidad del algoritmo y el análisis empírico es un aspecto clave / ángulo sobre eso, y obviamente no es el único ángulo, etc ...
vzn
0

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.

gnasher729
fuente
"al menos O (fib (n))", eso no tiene ningún sentido. Quieres usarΩ.
Raphael
Siéntase libre de editar la respuesta si se siente fuertemente al respecto.
gnasher729
0

Un límite inferior es intuitivo: T(norte)=T(norte-1)+T(norte-2) T(norte)>2T(norte-2) ya que T(norte-1)>T(norte-2) Por lo tanto T(norte)=Ω(Cnorte)

wabbit
fuente