Un enfoque de programación dinámica puede simplificar un proceso con muchos subprocesos reduciendo el tiempo de codificación. Para los profesionales del análisis de datos, la programación y el desarrollo de software, la programación dinámica se utiliza con frecuencia para reducir el tiempo y simplificar los procesos de codificación. Si estás entrando en una carrera que requiere habilidades de codificación y programación, deberías familiarizarte con el uso de la programación dinámica en tus proyectos.
En este artículo, exploramos qué es la programación dinámica, cuáles son las características de la programación dinámica y qué métodos utilizar cuando se computan problemas de codificación recursiva con programación dinámica.
¿Qué es la programación dinámica?
La programación dinámica es un proceso algorítmico que los informáticos y programadores emplean para abordar las dificultades de optimización. Cuando la programación dinámica se incorpora a una empresa de producción de software, el algoritmo utilizado para abordar problemas de codificación difíciles los descompone en subproblemas. Una solución optimizada para cada subcuestión puede entonces aplicarse a todo el escenario, dependiendo del tipo de solución que obtengan de cada subcuestión del código.
Además, la programación dinámica optimiza la recursividad simple con las soluciones recursivas que los programadores obtienen mediante los cálculos de los subproblemas del problema. Este proceso de optimización ayuda a eliminar la necesidad de volver a calcular los datos de entrada más adelante, cuando sea necesario para implementar un nuevo código en el proyecto.
Relacionado: ¿Es la programación informática una buena carrera? Definición y consejos
Características de la programación dinámica
La programación dinámica adquiere dos características importantes, que la convierten en una herramienta viable y eficaz para reducir el tiempo de programación y potenciar la funcionalidad y la eficacia del programa:
Los subproblemas se superponen
Los subproblemas son simplemente variaciones más pequeñas de un problema original más grande. Por ejemplo, en la secuencia de Fibonacci, cada número de la serie es la suma de sus dos números anteriores (0, 1, 1, 2, 3, 5, 8 y así sucesivamente). Si quiere calcular el enésimo valor de Fibonacci en la secuencia, puede dividir todo el problema en subproblemas más pequeños. Estos subproblemas se solapan entre sí, ya que se encuentran soluciones resolviendo el mismo subproblema repetidamente. El solapamiento de los subproblemas se produce con cualquier problema, lo que le permite aplicar la programación dinámica para dividir las tareas de programación complejas en partes más pequeñas.
La subestructura tiene una propiedad óptima
Si puedes llegar a una solución óptima, que construyes a partir de todas las soluciones óptimas que encuentras al resolver cada subproblema, entonces el problema completo demuestra la propiedad de subestructura óptima. Esto significa que al resolver cada subproblema, la solución que calculas a partir de cada superposición debe aplicarse al problema global para que funcione y optimice la recursividad en su programación. En el ejemplo de la secuencia de Fibonacci, cada subproblema contiene una solución que puedes aplicar a cada subproblema sucesivo para encontrar el siguiente número de la serie, haciendo que todo el problema muestre la propiedad de subestructura óptima.
Relacionado: Las 45 mejores preguntas para una entrevista de programación (con ejemplos de respuestas)
Métodos de programación dinámica
Al aplicar la programación dinámica a sus proyectos, puede poner en práctica dos métodos:
Método descendente
En el método descendente de la programación dinámica, se resuelve el problema global antes de desglosarlo en subproblemas. Este proceso es la memoización y funciona para resolver problemas más grandes encontrando la solución a los subproblemas de forma recursiva, almacenando en caché cada resultado. Este proceso de memoización ayuda a evitar resolver el problema repetidamente en el caso de que necesites llamarlo más de una vez. Con el método descendente, puedes simplemente devolver el resultado que guardas mientras resuelves el problema global, almacenando así los resultados de los problemas que ya has resuelto.
Método ascendente
En el método ascendente (o método de tabulación), en lugar de aplicar la recursión, se resuelven primero todos los subproblemas relacionados. Como la tabulación ascendente requiere múltiples soluciones, la programación dinámica utiliza una tabla dimensional, o una tabla n-dimensional, donde n representa un valor de cero o mayor. A medida que se resuelve cada subproblema dentro de la tabla, se pueden utilizar los resultados para calcular el problema original.
Relacionado: Las mejores habilidades de codificación informática para tu currículum
Ejemplos de programación dinámica
Para entender cómo puede aplicar ambos métodos para utilizar la programación dinámica, utilice el siguiente ejemplo para aplicar el proceso a la secuencia de Fibonacci:
Ejemplo descendente
Aplique la secuencia de Fibonacci, en la que cada número de la serie representa la suma de los dos primeros números anteriores:
{0, 1, 1, 2, 3, 5, 8,…}
Entender que la suma de los dos primeros valores anteriores será el siguiente número de la serie puede ayudarte a resolver todo el problema cuando quieras calcular el nth Número de Fibonacci. Como se conoce el patrón para calcular los valores futuros de la serie, se puede aplicar una fórmula para determinar la solución óptima sin tener que descomponer el problema en subproblemas más pequeños. Utilizando la fórmula apropiada cuando n > 1, se puede calcular una solución óptima con el método descendente cuando se resuelve un Enésimo valor de 13:
Fib(n) = Fib(n – 1) + Fib(n – 2) =
Fib(13) = Fib(13 – 1) + Fib(13 – 2) =
Fib(n) = Fib(12) + Fib(11) = 23
Utilizando el enfoque descendente y aplicando la memoización, puede almacenar en caché el resultado de 23 en la base de datos en caso de que necesite introducir y llamar a su cadena de código para tareas adicionales.
Relacionado: Relacionado: 5 preguntas habituales en las entrevistas sobre algoritmos y estructuras de datos y cómo responderlas
Ejemplo de abajo a arriba
En este ejemplo, aplique la secuencia de Fibonacci como anteriormente para desglosar todo el cómputo cuando quiera calcular el nth valor en la serie. Con la misma secuencia de números {0, 1, 1, 2, 3, 5, 8,…} En el caso de que el valor de la serie sea 13, se puede ver que el siguiente valor de la serie da como resultado 13, ya que cinco y ocho dan una suma de 13. Utilizar el método ascendente para desglosar todo el problema Fib(n) , aplique la ecuación de la secuencia [Fib(n – 1) + Fib(n – 2), cuando n > 1 Para cada subproblema para el que quiera encontrar una solución óptima. Supongamos que quiere calcular el siguiente enésimo valores cuando n = 23:
Fib(n) = Fib(n – 1) + Fib(n – 2) =
Fib(23) = Fib(23 – 1) + Fib(23 – 2) =
Fib(23) = Fib(22) + Fib(21) = Fib(43)
El resultado Fib(43) se aplica entonces al cálculo de los siguientes valores de la serie cuando n = 43:
Fib(n) = Fib(n – 1) + Fib(n – 2) =
Fib(43) = Fib(43 – 1) + Fib(43 – 2) =
Fib(n) = Fib(42) + Fib(41) = Fib(83) entonces
Fib(83) = Fib(83 – 1) + Fib(83 – 2) =
Fib(83) = Fib(82) + Fib(81) = Fib(163)
Puede seguir utilizando esta solución óptima para cada subproblema para calcular los siguientes valores dentro de la secuencia de Fibonacci, lo que le permite descomponer el problema inicial de Fib(n) = Fib(n – 1) + Fib(n – 2), cuando n > 1.