Optimización de Algoritmos con Programación Dinámica en Python
Clase 3 de 24 • Curso de Estadística Computacional con Python
Resumen
¿Qué es la Programación Dinámica?
La programación dinámica es una metodología de optimización que ahorra tiempo al intercambiar espacio. Utiliza la memorización para evitar cálculos repetidos al guardar los resultados de subproblemas que se pueden reutilizar. Esto es esencial en problemas donde hay muchas subestructuras comunes, como es el caso de la secuencia de Fibonacci.
¿Cómo se implementa la secuencia de Fibonacci de forma recursiva?
A pesar de ser sencilla de implementar, la solución recursiva a la secuencia de Fibonacci es ineficiente debido al cálculo repetido de los mismos subproblemas. El algoritmo recursivo es el siguiente:
def fibonacci_recursivo(n):
if n == 0 or n == 1:
return 1
else:
return fibonacci_recursivo(n-1) + fibonacci_recursivo(n-2)
En este enfoque, calcular el Fibonacci de un número grande, como 50, puede ser extremadamente lento. Esto se debe al número exponencial de subproblemas solapados que requieren cálculo.
¿Cómo optimizar la secuencia de Fibonacci usando memorización?
Para optimizar el algoritmo, introducimos la técnica de memorización con un diccionario que almacena los resultados ya calculados:
def fibonacci_dinamico(n, memo = {}):
if n == 0 or n == 1:
return 1
if n in memo:
return memo[n]
memo[n] = fibonacci_dinamico(n-1, memo) + fibonacci_dinamico(n-2, memo)
return memo[n]
Esta solución es significativamente más rápida, porque una vez que un valor de Fibonacci está calculado, no se recalcula.
¿Cómo empezar a usar la función optimizada?
Podemos probar este enfoque en nuestra terminal después de implementar el código:
if __name__ == '__main__':
n = int(input("Escoge un número: "))
print(f"Fibonacci de {n} es {fibonacci_dinamico(n)}")
Al correr este script, se podrá calcular rápidamente Fibonacci para números tan grandes como 10,000, siempre que se ajuste la recursión máxima de Python, como se muestra a continuación:
import sys
sys.setrecursionlimit(10002)
Esto asegura que nuestra función pueda manejar la profundidad de llamada necesaria para valores grandes.
Reflexiones sobre el uso de programación dinámica
La programación dinámica es increíblemente poderosa para problemas donde hay solapamiento de subproblemas. Sin embargo, su aplicación debe ser cuidadosa, ya que en problemas sin solapamiento este enfoque no resultaría en optimización alguna; solamente se crearían diccionarios infinitamente grandes sin beneficios perceptibles.
¡Exploren, experimenten y compartan sus hallazgos en cómo la programación dinámica puede aplicarse a otros problemas! Vuestros aportes pueden enriquecer la comunidad de aprendizaje.