Algoritmos y Estructura de Datos III Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires 03 de Abril de 2013
Repaso Aplica a problemas de optimización donde obtenemos una solución utilizando una serie de decisiones.
Repaso Aplica a problemas de optimización donde obtenemos una solución utilizando una serie de decisiones. A medida que tomamos decisiones, subproblemas con la misma forma van surgiendo
Repaso Aplica a problemas de optimización donde obtenemos una solución utilizando una serie de decisiones. A medida que tomamos decisiones, subproblemas con la misma forma van surgiendo La clave es guardar el resultado de cada subproblema, en caso de que reaparezca
Repaso Aplica a problemas de optimización donde obtenemos una solución utilizando una serie de decisiones. A medida que tomamos decisiones, subproblemas con la misma forma van surgiendo La clave es guardar el resultado de cada subproblema, en caso de que reaparezca Es una combinación entre algoritmos golosos y algoritmos de fuerza-bruta
Repaso Al igual que Dividir y Conquistar, resuelve un problema combinando la solución óptima de varios subproblemas
Repaso Al igual que Dividir y Conquistar, resuelve un problema combinando la solución óptima de varios subproblemas Los subproblemas tienen un solapamiento.
Repaso Al igual que Dividir y Conquistar, resuelve un problema combinando la solución óptima de varios subproblemas Los subproblemas tienen un solapamiento. Cada subproblema es independiente. Solo interesan los resultados.
Repaso Al igual que Dividir y Conquistar, resuelve un problema combinando la solución óptima de varios subproblemas Los subproblemas tienen un solapamiento. Cada subproblema es independiente. Solo interesan los resultados. Optimalidad: Una solución óptima esta conformada por subsoluciones óptimas.
Cambio mínimo Problema Dados los valores de las monedas V =< v 1, v 2,..., v k > y el monto a devolver, N. Quiero saber la mínima cantidad de monedas necesarias para devolver el cambio de manera exacta.
Cambio mínimo Problema Dados los valores de las monedas V =< v 1, v 2,..., v k > y el monto a devolver, N. Quiero saber la mínima cantidad de monedas necesarias para devolver el cambio de manera exacta. Ejemplo V =< 3, 4, 5, 7 > N = 10 S =< 7, 3 > S =< 5, 5 >
Caracterizar una solución Probar cualquier combinación de monedas.
Caracterizar una solución Probar cualquier combinación de monedas. Hasta cuantas veces uso cada moneda? Cuál sería la complejidad final?
Caracterizar una solución Probar cualquier combinación de monedas. Hasta cuantas veces uso cada moneda? Cuál sería la complejidad final? O(2... ). Feo de implementar, y costoso.
Pensar recursivamente Definamos la función Cambio(N, V )
Pensar recursivamente Definamos la función Cambio(N, V ) El V es estático, nunca cambia, lo podemos olvidar por un momento...
Pensar recursivamente Definamos la función Cambio(N, V ) El V es estático, nunca cambia, lo podemos olvidar por un momento... Ahora pensemos si se puede resolver Cambio(N) usando soluciones a instancias más chicas.
Pensar recursivamente Definamos la función Cambio(N, V ) El V es estático, nunca cambia, lo podemos olvidar por un momento... Ahora pensemos si se puede resolver Cambio(N) usando soluciones a instancias más chicas. Puedo resolver Cambio(N) sabiendo Cambio(i), i < N?
Pensar recursivamente Definamos la función Cambio(N, V ) El V es estático, nunca cambia, lo podemos olvidar por un momento... Ahora pensemos si se puede resolver Cambio(N) usando soluciones a instancias más chicas. Puedo resolver Cambio(N) sabiendo Cambio(i), i < N? La cantidad minima de monedas para devolver i esta relacionada con la cantidad minima para devolver i + 3?
Pensar recursivamente Definamos la función Cambio(N, V ) El V es estático, nunca cambia, lo podemos olvidar por un momento... Ahora pensemos si se puede resolver Cambio(N) usando soluciones a instancias más chicas. Puedo resolver Cambio(N) sabiendo Cambio(i), i < N? La cantidad minima de monedas para devolver i esta relacionada con la cantidad minima para devolver i + 3? Qué valores podría tener la última moneda usada?
Pensar recursivamente Teorema Sea S =< s 1,..., s m > el cambio mínimo para N. Luego, S i =< s 1,..., s i > es óptimo.
Pensar recursivamente Teorema Sea S =< s 1,..., s m > el cambio mínimo para N. Luego, S i =< s 1,..., s i > es óptimo. Prueba Supongamos que hay otra solución S mejor que S i : S = S i S < S i.
Pensar recursivamente Teorema Sea S =< s 1,..., s m > el cambio mínimo para N. Luego, S i =< s 1,..., s i > es óptimo. Prueba Supongamos que hay otra solución S mejor que S i : S = S i S < S i. Definimos S = S < s i+1,..., s m > (reemplazar S i por S ).
Pensar recursivamente Teorema Sea S =< s 1,..., s m > el cambio mínimo para N. Luego, S i =< s 1,..., s i > es óptimo. Prueba Supongamos que hay otra solución S mejor que S i : S = S i S < S i. Definimos S = S < s i+1,..., s m > (reemplazar S i por S ). S = S + < s i+1,..., s m >= S i + < s i+1,..., s m >= N
Pensar recursivamente Teorema Sea S =< s 1,..., s m > el cambio mínimo para N. Luego, S i =< s 1,..., s i > es óptimo. Prueba Supongamos que hay otra solución S mejor que S i : S = S i S < S i. Definimos S = S < s i+1,..., s m > (reemplazar S i por S ). S = S + < s i+1,..., s m >= S i + < s i+1,..., s m >= N S = S + < s i+1,..., s m > < S i + < s i+1,..., s m > = S
Pensar recursivamente Teorema Sea S =< s 1,..., s m > el cambio mínimo para N. Luego, S i =< s 1,..., s i > es óptimo. Prueba Supongamos que hay otra solución S mejor que S i : S = S i S < S i. Definimos S = S < s i+1,..., s m > (reemplazar S i por S ). S = S + < s i+1,..., s m >= S i + < s i+1,..., s m >= N S = S + < s i+1,..., s m > < S i + < s i+1,..., s m > = S Absurdo, pues S es mínimo por hipótesis.
Ejemplo 3 10 4 5 7 7 6 5 3 3 7 3 5 3 5 3 4 5 4 4 4 3 2 3 4 3 0 3 2 1 2 1 0 0 3 1 0 0 0
Ejemplo 3 10 4 5 7 7 6 5 3 3 7 3 5 3 5 3 4 5 4 4 4 3 2 3 4 3 0 3 2 1 2 1 0 0 3 1 0 0 0
Algoritmo-CambioMinimo (top-down) Algorithm 1: CambioMinimo Data: V =< v 1,..., v k >,N Result: S if N == 0 then return 0 if res[n] ya calculada then return res[n] res[n] = for i 1 to k do if N v i then res[n] = MIN(res[N], 1 + CambioMinimo(N v i )) ; return res[n]
Algoritmo-CambioMinimo (bottom-up) Algorithm 2: CambioMinimo Data: V =< v 1,..., v k >,N Result: S for i 1 to N do res[i] = ; res[0] = 0; for i 1 to N do for j 1 to k do res[i] = MIN(res[i], res[i v j ] + 1) return res[n]
Conclusiones Primero entender el problema, y pensar en la solución (aunque sea con algoritmos de fuerza-bruta)
Conclusiones Primero entender el problema, y pensar en la solución (aunque sea con algoritmos de fuerza-bruta) Pensar en funciones recursivas, y que parametros necesitarian.
Conclusiones Primero entender el problema, y pensar en la solución (aunque sea con algoritmos de fuerza-bruta) Pensar en funciones recursivas, y que parametros necesitarian. Demostrar correctitud del algoritmo.
Conclusiones Primero entender el problema, y pensar en la solución (aunque sea con algoritmos de fuerza-bruta) Pensar en funciones recursivas, y que parametros necesitarian. Demostrar correctitud del algoritmo. Hacer muchos ejercicios.