Herramientas de usuario

Herramientas del sitio


algoritmos-oia:programacion-dinamica

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
algoritmos-oia:programacion-dinamica [2017/12/23 02:00]
brianbok [Complejidad en Top-Down]
algoritmos-oia:programacion-dinamica [2017/12/23 14:05] (actual)
brianbok [**Costo total = #Subproblemas $\times$ Costo por subproblema **]
Línea 239: Línea 239:
  
 ===== Problemas Relacionados ===== ===== Problemas Relacionados =====
-Al-Garin 
  
 +[[http://​juez.oia.unsam.edu.ar/#/​task/​algarin/​statement|Al-Garin]]
 ====== Complejidad en dinámica ====== ====== Complejidad en dinámica ======
 ===== Complejidad en Bottom-Up ===== ===== Complejidad en Bottom-Up =====
Línea 249: Línea 249:
 El motivo de la dificultad radica es no poder precisar el orden de ejecución, por la memoization. El motivo de la dificultad radica es no poder precisar el orden de ejecución, por la memoization.
 No sabemos "en qué momento"​ se hace por primera vez un cálculo, solo sabemos que se hace y solo una vez. No sabemos "en qué momento"​ se hace por primera vez un cálculo, solo sabemos que se hace y solo una vez.
 +
 +Tenemos dos tipos de llamadas a la funciones memoizadas:
 +  A) La primer llamada a ese subproblema (la primer llamada con esos parámetros)
 +  B) La segunda llamada o posteriores
 +
 +Cuando tomamos el costo de una llamada de tipo A), no contamos la recursión como parte del costo, tomamos cada llamada recursiva como $O(1)$ ya que las vamos a tomar como costo de otro subproblema,​ o de B)
 +
 +Para medir la complejidad total sumamos todos los costos de resolver cada subproblema.
 +De forma simplificada,​ solo contamos el costo de las llamadas de tipo A) obtieniendo
 +
 +Costo total = #​Subproblemas $\times$ Costo A)
 +
 +==== Explicación ====
 +
 +¿Donde esta el costo de las llamadas de tipo B)?
 +Cada llamada B) la hizo algún A) mientras estaba computando
 +Luego, el costo de hacer esa llamada se lo podemos cobrar dentro del costo de resolver A)
 +El costo total será 
 +$Subproblemas \times ( Costo(A) + llamadas recursivas \times Costo(B)) $
 +
 +Asumiendo que todas las llamadas recursivas son de tipo B) para acotar peor caso
 +Por ejemplo, en el problema de camino en la matriz queda:
 +
 +$O(n^2) \times ( O(1) + O(1) \times O(1)) $
 +
 +Podemos ver que la cantidad de llamadas recursivas siempre va a estar contenida en la complejidad de A). No podría ser que tengamos que hacer $O(n)$ llamadas pero costo(A) = $O(log n)$ operaciones,​ ya que las llamadas recursivas son parte del costo(A). Además Costo(B) suele ser O(1), por lo cual podemos simplificar y queda
 +$Subproblemas \times ( Costo(A))$
 +==== Resumen: importante ====
 +
 +En general lo que llamamos Costo(A) se denota como Costo por subproblema,​ y podemos confiar *casi ciegamente* en la fórmula:
 +
 +**Costo total = #​Subproblemas $\times$ Costo por subproblema ​ **
 +
 ====== Material extra ====== ====== Material extra ======
  
Línea 257: Línea 290:
  
 ===== Fácil ===== ===== Fácil =====
-[[http://​juez.oia.unsam.edu.ar/#/​task/​algarin/​statement|Al-Garin]] 
 ===== Medio ===== ===== Medio =====
  
 ===== Difícil ===== ===== Difícil =====
 [[http://​juez.oia.unsam.edu.ar/#/​task/​zapallos/​statement| Zapallos]] [[http://​juez.oia.unsam.edu.ar/#/​task/​zapallos/​statement| Zapallos]]
algoritmos-oia/programacion-dinamica.1513994445.txt.gz · Última modificación: 2017/12/23 02:00 por brianbok