¿Cuál es la diferencia entre memorización y programación dinámica? Creo que la programación dinámica es un subconjunto de la memorización. ¿Es correcto?
dynamic-programming
terminology
difference
memoization
Sanghyun Lee
fuente
fuente
Respuestas:
Artículo relevante sobre programación. Guía : programación dinámica vs memorización vs tabulación
Memoization es un término que describe una técnica de optimización en la que almacena en caché los resultados calculados previamente y devuelve el resultado almacenado en caché cuando se necesita nuevamente el mismo cálculo.
La programación dinámica es una técnica para resolver problemas de naturaleza recursiva, de forma iterativa, y es aplicable cuando los cálculos de los subproblemas se superponen.
La programación dinámica generalmente se implementa mediante tabulación, pero también se puede implementar mediante la memorización. Como puede ver, ninguno de los dos es un "subconjunto" del otro.
Una pregunta de seguimiento razonable es: ¿Cuál es la diferencia entre la tabulación (la técnica de programación dinámica típica) y la memorización?
Cuando resuelve un problema de programación dinámica utilizando la tabulación, resuelve el problema "de abajo hacia arriba ", es decir, resolviendo primero todos los subproblemas relacionados, normalmente llenando una tabla n- dimensional. Según los resultados de la tabla, se calcula la solución del problema "superior" / original.
Si usa la memorización para resolver el problema, hágalo manteniendo un mapa de subproblemas ya resueltos. Lo haces "de arriba hacia abajo " en el sentido de que primero resuelves el problema de "arriba" (que generalmente recurre para resolver los subproblemas).
Una buena diapositiva desde
aquí(el enlace ahora está muerto, aunque la diapositiva sigue siendo buena):Recursos adicionales:
fuente
http://www.geeksforgeeks.org/dynamic-programming-set-1/
La memorización es un método fácil para rastrear soluciones previamente resueltas (a menudo implementadas como un par de valores de clave hash, a diferencia de la tabulación que a menudo se basa en matrices) para que no se vuelvan a calcular cuando se encuentren nuevamente. Se puede usar en ambos métodos, de abajo hacia arriba o de arriba hacia abajo.
Vea esta discusión sobre memorización vs tabulación.
Por lo tanto, la programación dinámica es un método para resolver ciertas clases de problemas mediante la resolución de las relaciones de recurrencia / recursividad y el almacenamiento de soluciones encontradas previamente mediante tabulación o memorización. La memorización es un método para realizar un seguimiento de las soluciones a problemas resueltos previamente y se puede usar con cualquier función que tenga soluciones deterministas únicas para un conjunto dado de entradas.
fuente
¡La programación dinámica a menudo se llama memorización!
La memorización es la técnica de arriba hacia abajo (comienza a resolver el problema dado desglosándolo) y la programación dinámica es una técnica de abajo hacia arriba (comienza a resolver desde el subproblema trivial, hacia el problema dado)
DP encuentra la solución comenzando desde el (los) caso (s) base (s) y avanza hacia arriba. DP resuelve todos los subproblemas porque lo hace de abajo hacia arriba
DP tiene el potencial de transformar soluciones de fuerza bruta de tiempo exponencial en algoritmos de tiempo polinomial.
DP puede ser mucho más eficiente porque es iterativo
Para ser más simple, Memoization utiliza el enfoque de arriba hacia abajo para resolver el problema, es decir, comienza con el problema central (principal), luego lo divide en subproblemas y resuelve estos subproblemas de manera similar. En este enfoque, el mismo subproblema puede ocurrir varias veces y consumir más ciclos de CPU, por lo tanto, aumentar la complejidad del tiempo. Mientras que en la programación dinámica, el mismo subproblema no se resolverá varias veces, pero el resultado anterior se utilizará para optimizar la solución.
fuente
(1) Memoization y DP, conceptualmente , es realmente lo mismo. Porque: considere la definición de DP: "subproblemas superpuestos" y "subestructura óptima". Memoization posee completamente estos 2.
(2) La memorización es DP con el riesgo de desbordamiento de pila si la recursividad es profunda. DP de abajo hacia arriba no tiene este riesgo.
(3) Memoization necesita una tabla hash. Por lo tanto, espacio adicional y algo de tiempo de búsqueda.
Entonces para responder la pregunta:
- Conceptualmente , (1) significa que son lo mismo.
-Tomando en cuenta (2), si realmente quieres, la memorización es un subconjunto de DP, en el sentido de que un problema solucionable por la memorización será solucionado por DP, pero un problema solucionable por DP podría no ser solucionable por la memorización (porque podría apilarse desbordamiento).
-Tomando en cuenta (3), tienen diferencias menores en el rendimiento.
fuente
De wikipedia:
Memorización
Programación dinámica
Al dividir un problema en subproblemas más pequeños / simples, a menudo nos encontramos con el mismo subproblema más de una vez, por lo que usamos Memoization para guardar los resultados de cálculos anteriores para que no necesitemos repetirlos.
La programación dinámica a menudo encuentra situaciones en las que tiene sentido usar la memorización, pero puede usar cualquiera de las técnicas sin necesariamente usar la otra.
fuente
Tanto la memorización como la programación dinámica resuelven subproblemas individuales solo una vez.
La memorización utiliza la recursividad y funciona de arriba hacia abajo, mientras que la programación dinámica se mueve en la dirección opuesta resolviendo el problema de abajo hacia arriba.
A continuación hay una analogía interesante:
De arriba hacia abajo : primero dices que me haré cargo del mundo. ¿Cómo lo harás? Dices que primero me haré cargo de Asia. ¿Cómo lo harás? Tomaré la India primero. Me convertiré en el Ministro Principal de Delhi, etc., etc.
De abajo hacia arriba : dices que me convertiré en el CM de Delhi. Luego tomaré el control de la India, luego todos los demás países de Asia y finalmente tomaré el control del mundo.
fuente
Me gustaría ir con un ejemplo ;
Problema:
Recursión con la memorización
De esta manera, estamos podando (la eliminación del exceso de material de un árbol o arbusto) el árbol de recursión con la ayuda de una matriz de notas y reduciendo el tamaño del árbol de recursión hasta ahora.
Programación dinámica
Como podemos ver, este problema se puede dividir en subproblemas, y contiene la propiedad de subestructura óptima, es decir, su solución óptima se puede construir de manera eficiente a partir de soluciones óptimas de sus subproblemas, podemos utilizar la programación dinámica para resolver este problema.
Ejemplos tomados de https://leetcode.com/problems/climbing-stairs/
fuente
Solo piensa en dos formas,
En Memoization vamos con (1.) donde guardamos cada llamada de función en un caché y llamamos desde allí. Es un poco caro ya que implica llamadas recursivas.
En la programación dinámica vamos con (2.) donde mantenemos una tabla, de abajo hacia arriba resolviendo subproblemas utilizando los datos guardados en la tabla, comúnmente conocida como la tabla dp.
Nota:
Ambos son aplicables a problemas con subproblemas superpuestos.
Memoization realiza comparativamente pobre para DP debido a los gastos generales involucrados durante las llamadas a funciones recursivas.
fuente
En programación dinámica ,
En memorización ,
fuente