Análisis y Diseño de Algoritmos es nuestro y de todos nostros, defenderlo es un deber Dr. Ivo H. Pineda Torres Facultad de Ciencias de la Computación Benemérita Universidad Autónoma de Puebla 18 de Marzo 1938 Conjuntos Dinámicos Finitos Conjuntos Dinámicos: Definición Pieza importante para los computólogos, que son manipulados por los algoritmos, pueden crecer, encogerse y cambiar a lo largo del tiempo. 2 of 11 /IMAGENES/EscudoNegro / Operaciones en conjuntos • Inserción de lementos. • Borrado de elementos. • Prueba de membresía.entre otras más. Por lo tanto el conjunto de datos que sporte estas operaciones se llamará: DICCIONARIO. La mejor forma de implementar un conjunto dinámico dependerá de las operaciones que debe soportar. Motivo por el que se debe analizar el orden de estas estructuras. 3 of 11 /IMAGENES/EscudoNegro / Elementos de los conjuntos dinámicos En una implementación típica de un conjunto dinámico se tiene: • Los objeto cuyo campos pueden ser manipulados y examinados • Los objetos pueden ser accesados por una llave (k). el objeto puede ser una conjunto de llaves. • El objeto puede contener datos satélites los cuales serán campos asociados a la definción del objeto. 4 of 11 /IMAGENES/EscudoNegro / Precisión de las Operaciones en Conjuntos Dinámicos Tipos de operaciones: Consulta QUERY y Operaciones de modificación Modifying • Search(s,k): Consulta que dado un conjunto dinámico y un valor de la llave k regresa el apuntador x a un elemento en S tal que key[x]=k o NIL, si el elmento x no pertenece a S. • Insertar(S,x) Una operación que modifica aumentando el tamaño de S con el elemento apuntado por x. • Delete(S,x): • Mínimo(S): • Máximo(S): • Sucesor(S,x): • Predecesor(S,x): • Tarea: Definir el resto 5 of 11 /IMAGENES/EscudoNegro / Pilas y colas Conjuntos dinámicos en el cual los elmentos son removidos del conjunto usando la operación Delete(S,x). STACK LIFO QUEUES[kius] FIFO Dadas las siguientes operaciones en una pila: PUSH y POP. Y las operaciones en una cola INSERT y DEQUEUE(desencolar) . TAREA: Determine para cada operación el orden de estas operaciones. 6 of 11 /IMAGENES/EscudoNegro / Listas ligadas En esta estructura los objetos son arreglados de manera que se encuentran en un orden lineal, el orden está deterinado por el apuntador en cada objeto. TAREA::Tema 10.4, ejercicio 10.4-1 Operaciones permitidas: Búsqueda, inserción, borrado. TAREA: Determine para cada operación el orden de estas operaciones. A manera de resumen llene la tabla del ejercicio 10-1 pag. 217(papel) capítulo 10. 7 of 11 /IMAGENES/EscudoNegro / Tablas Hash Muchas aplicaciones requieren de conjuntos dinámicos que soporten solamente las operaciones de un diccionario:Insert,Delete,Search. Compiladores mantienen una tabla de símbolos, en la que las llaves de los elementos son cadenas de caracteres que corresponden a un identificador en un lenguaje particular. Las tablas HASH son una estructura de datos efectiva para implementar diccionarios. 8 of 11 /IMAGENES/EscudoNegro / Definición:Tablas Hash Definición Una Tabla Hash consiste de un arreglo en el cual los datos son accesados através de un índice especial llamado llave (key). La operación principal que soporta de manera eficiente es la búsqueda: permite el acceso a los elementos (teléfono y dirección, por ejemplo) almacenados a partir de una clave generada (usando el nombre o número de cuenta, por ejemplo). Funciona transformando la clave con una función hash en un hash, un número que la tabla hash utiliza para localizar el valor deseado. 9 of 11 /IMAGENES/EscudoNegro / Así 10 of 11 /IMAGENES/EscudoNegro / Tablas de direcciones directo Cuando se tienen diccionarios con un universo de llaves pequeños. Esto es que la dimensión de U es pequeña y hace dependiente tomar otra decisión. 11 of 11 /IMAGENES/EscudoNegro / Tablas de direcciones directo http://www.cs.auckland.ac.nz/~jmor159/PLDS210/hash_ tables.html. ver animación y sacar conclusión sobre colisiones, orden de las operaciones. 12 of 11 /IMAGENES/EscudoNegro / Programación Dinámica. Capítulo XV Programación Dinámica, similar a Divide y Vencerás resuelve problemas por medio de la combinación de las soluciones asociadas a los subproblemas. Generalidades de la programación Dinámica : • Como la técnica Dividir y Vencerás, la programación dinámica es una técnica para resolver problemas, a partir de la solución a subproblemas y la combinación de esas soluciones. 13 of 11 /IMAGENES/EscudoNegro / Programación Dinámica. Capítulo XV Programación Dinámica, similar a Divide y Vencerás resuelve problemas por medio de la combinación de las soluciones asociadas a los subproblemas. Generalidades de la programación Dinámica : • Como la técnica Dividir y Vencerás, la programación dinámica es una técnica para resolver problemas, a partir de la solución a subproblemas y la combinación de esas soluciones. • A diferencia de la técnica Dividir y Vencerás, la Programación Dinámica es aplicable cuando los subproblemas no son independientes (en cuyo caso Dividir y Vencerás hace mucho trabajo repetido). 13 of 11 /IMAGENES/EscudoNegro / Programación Dinámica. cont. • Un algoritmo que sigue esta técnica resuelve cada subproblema una sola vez y guarda su respuesta en una tabla, evitando así volver a calcular la respuesta cada vez que el subproblema aparezca. • Esta técnica es típicamente aplicada para resolver problemas de optimización: ◦ Problemas con muchas soluciones. ◦ Cada solución tiene asociado un valor ◦ Se busca una solución con un valor óptimo (máximo o mínimo), entre las muchas soluciones con valor óptimo que pueden existir. 14 of 11 /IMAGENES/EscudoNegro / Programación Dinámica. cont. • El desarrollo de un algoritmo usando la técnica de programación dinámica puede ser dividido en los siguientes pasos: 15 of 11 /IMAGENES/EscudoNegro / Programación Dinámica. cont. • El desarrollo de un algoritmo usando la técnica de programación dinámica puede ser dividido en los siguientes pasos: 1. Caracterizar la estructura de una solución óptima. 15 of 11 /IMAGENES/EscudoNegro / Programación Dinámica. cont. • El desarrollo de un algoritmo usando la técnica de programación dinámica puede ser dividido en los siguientes pasos: 1. Caracterizar la estructura de una solución óptima. 2. Definir recursivamente el valor de una solución óptima. 15 of 11 /IMAGENES/EscudoNegro / Programación Dinámica. cont. • El desarrollo de un algoritmo usando la técnica de programación dinámica puede ser dividido en los siguientes pasos: 1. Caracterizar la estructura de una solución óptima. 2. Definir recursivamente el valor de una solución óptima. 3. Calcular el Valor de una solución óptima de abajo hacia arriba (bottom-up). 15 of 11 /IMAGENES/EscudoNegro / Programación Dinámica. cont. • El desarrollo de un algoritmo usando la técnica de programación dinámica puede ser dividido en los siguientes pasos: 1. Caracterizar la estructura de una solución óptima. 2. Definir recursivamente el valor de una solución óptima. 3. Calcular el Valor de una solución óptima de abajo hacia arriba (bottom-up). 4. Construir una solución óptima a partir de la información calculada. 15 of 11 /IMAGENES/EscudoNegro / donde aplicar la Programación Dinámica Utilizando proramación dinámica se solucionan problemas de optimización como: • El problema de planificación en una fabrica de automóviles. • Multiplicación de una sucesión de matrices. • Construir un árbol de búsqueda binaria que sea óptimo. • Otros ejemplos: la subcadena más larga, triangulación de polígonos convexos, etc,etc,etc 16 of 11 /IMAGENES/EscudoNegro / Fábrica de Automóviles como la de Puebla La fábrica VOCHICHO produce coches y tiene dos líneas de ensamble como se muestra a continuación: 17 of 11 Planear como ensamblar un Vochicho El chasís del automóvil entra en cada línea de ensamble, se adicionan al chasís las parte necesarias en cada estado del proceso, que nos lleva a construir finalmente el automóvil : • Cada línea de ensamble tiene n estados, numeradas j = 1, 2, ..., n. • Un estado es representado por el j-íesima estado de la línea i, donde i es 1 o 2. • El j-íesimo estado de la línea 1 (S1,j ) realiza la misma función que el j-íesimo estado de la línea 2 (S2,j ). • Cada estado ejecuta su labor a diferentes horas y con diferentes tecnologías además el tiempo requerido por cada estado varia, incluso entre los estados de una misma línea de ensamble. 18 of 11 Planear como ensamblar un Vochicho, cont. • El tiempo requerido por un estado Si,j en el ensamble se representa por ai,j . • Normalmente, una vez que un chasis entra a una línea de ensamble, pasa unicamente a través de esa línea de ensamble. • El tiempo para transferir un chasís de una línea de ensamble i a un estado Si,j es denotado por ti,j , donde i = 1, 2 y j = 1, 2, ..., n − 1. En general, el problema es : Determinar qué estados elegir de la línea 1 y qué estados elegir de la línea 2 en orden, tal que se minimize el tiempo total que toma la construcción de un automóvil. 19 of 11 Fábrica de Automóviles Ponemos tiempos al problema, para elegir la mejor secuencia de estados: 20 of 11 Para el algortimo de fabricar como está el orden Análisis de orden: Para mala suerte tenemos que en cada punto , estación o nodo existe la posibilidad de ir a dos lados y siendo n nodos, cual sería el orden de esto: • Tenemos que en cada estación de ensamble:2n 21 of 11 Para el algortimo de fabricar como está el orden Análisis de orden: Para mala suerte tenemos que en cada punto , estación o nodo existe la posibilidad de ir a dos lados y siendo n nodos, cual sería el orden de esto: • Tenemos que en cada estación de ensamble:2n • La mínima ruta tendrá: Ω(2n ) 21 of 11 ¿Cómo solucionar el problema en la fábrica de automóviles? Etapa 1: Búsqueda de soluciones al problema La primera etapa del paradigma de programación dinámica es la obtención de una caracterízación de la estructura de la solución óptima. Se inicia el problema de la línea de ensamble en el estado S1,j : 22 of 11 ¿Cómo solucionar el problema en la fábrica de automóviles?continuación • Si j = 1, solo hay un ruta posible para el chasís y tendría que seguir en S1,j . • Mientras que para j = 2, 3, ..., n existen dos opciones, las cuales son: 1. Viniendo de la estación S1,j−1 y procediendo directamente a Si,j 2. Alternativamente el chasis podría venir de S2,j−1 y ser transferido a S1,j con un tiempo de transferencia de t2,j−1 3. Supongamos que la ruta más corta al estado S1,j es a través del estado S1,j−1 . 4. Supongamos que la ruta más corta al estado S1,j es a través del estado S2,j−1 . 23 of 11 ¿Cómo solucionar el problema en la fábrica de automóviles?Cont. Podemos decir entonces que para la planificación de una línea de ensamble, una solución óptima a un problema (encontrar una buena ruta a través de los estados Si,j ) contiene dentro de ella una solución óptima a los subproblemas (encontrar una buena ruta a través de S1,j−1 o S2,j−1 ). La propiedad de las subestructuras óptimas es unos de las más importantes en la aplicabilidad de la programación dinámica. Utilizamos las subestructuras óptimas para demostrar que podemos construir una solución óptima a un problema a través de las soluciones óptimas de los subproblemas. 24 of 11 ¿Cómo solucionar el problema en la fábrica de automóviles?Conclusión. Podemos concluir que un ruta corta para llegar al estado S1,j es a través del estado j − 1 de la línea 1 o 2: • Buscar la ruta más corta al estado S1,j−1 y entonces ir directamente al estado S1,j , o • Buscar la ruta más corta al estado S2,j−1 y moverse de la línea 2 a la línea 1 y de esta forma llegar al estado S1, j. Utilizando razonamiento simétrico, la ruta más corta al estado S2,j es : • Buscar la ruta más corta al estado S2,j−1 y entonces ir directamente al estado S2,j , o • Buscar la ruta más corta al estado S1,j−1 y moverse de la línea 2 a la línea 1 y de esta forma llegar al estado S2,j . 25 of 11 ¿Cómo solucionar el problema en la fábrica de automóviles?Cont. Etapa 1: Búsqueda de solución al problema El segundo rquisito del paradigma de programación dinámica es definir recursivamente el valor de un solución óptima en términos de las soluciones óptimas de los subproblemas. fi [j] denota el tiempo que toma un chasís desde el punto inicial al estado Si,j . La meta es determinar la mejor ruta en la fabricación del automóvil, el cual se denota por f ∗ . La fórmula para la mejor ruta es la siguiente: f ∗ = min(f1 [n] + x1 , f2 [n] + x2 ) La solución sencilla es:f1 [1] y f2 [2] f1 [1] = e1 + a1,1 f2 [1] = e2 + a2,1 26 of 11 Recursión, por que no Etapa 2: Una solución recursiva Cálculos de fi [j] para j = 2, 3, ..., n con i = 1, 2 y obtenemos la ecuación recursiva: ( e1 + a1,1 min(f1 [j − 1] + a1,j , f2 [j − 1] + t2,j−1 + a1,j ) si j = 1 si j ≥ 2 ( e2 + a2,1 min(f2 [j − 1] + a2,j , f1 [j − 1] + t1,j−1 + a2,j ) si j = 1 si j ≥ 2 f1 [j] = f2 [j] = 1. fi [j] contiene los valores de la soluciones óptimas a los subproblemas. 2. En li [j] se guarda la ruta trazada (línea 1 o 2) desde un estado j − 1 para llegar al estado Si,j 3. l ∗ es la línea donde el estado n es utilizado en la fabricación del automóvil y se logra ser la más rápida. 27 of 11 Usando las ecuaciones • • • • • • Usamos l ∗ = 1, utilizamos con S1,6 , en la tabla tenemos l1 (6) = 2, Esto significa usamos S2,5 , Vemosl2 (5) = 2, usamos S2,4 , tomamos l2 (4) = 1, usamos S1,3 , l1 (3) = 2, usamos S2,2 y l2 (2) = 1, usamos S1,1 28 of 11 Time by Pink Floyd: dont waste time in dull day Etapa 3: Cálculo de tiempo A continuación mostraremos el algoritmo recursivo de las ecuaciones anteriormente mencionadas : Los datos de entrada al algoritmo son ai,j , ti,j , ei y n que es el número de estados en cada línea de ensamble. 29 of 11 Time by Pink Floyd Algorithm 1 RutaMasRapida(a, t, e, x , n) 1: f1 [1] = e1 + a1,1 2: f2 [1] = e2 + a2,1 3: for J = 2 to n do 4: if f1 [j − 1] + a1,j ≤ f2 [j − 1] + t2,j−1 + a1,j then 5: f1 [j] = f1 [j − 1] + a1,j 6: l1 [j] = 1 7: else 8: f1 [j] = f2 [j − 1] + t2,j−1 + a1,j 9: l1 [j] = 2 10: end if 11: end for 30 of 11 Algorithm 2 Cont 1: if f2 [j − 1] + a2,j ≤ f1 [j − 1] + t1,j−1 + a2,j then 2: f2 [j] = f2 [j − 1] + a2,j 3: l2 [j] = 1 4: else 5: if f1 [n] + x1 ≤ f2 [n] + x2 then 6: f ∗ = f1 [n] + x2 7: l∗ = 1 8: else 9: f ∗ = f2 [n] + x2 10: l∗ = 2 11: end if 12: end if 31 of 11 tomado de 3era edición libro texto Las Muño de Puebla, 11 Sur y 21 Oriente, se dedica a comprar barras de acero y las corta en pedazos más pequeños. La empresa no cobra por el corte. El administrador dela empresa quiere saber cual es la mejor manera de cortar las barras de acero. El problema es formulado como sigue Dado una barra de longitud n y una tabla de precios pi para i = 1, 2, 3, ...., n, se trata de obtener la máxima ganancia obtenible, rn por vender pedazos de la barra. Note que si el precio de una barra de longitud n es pn es lo suficientemente bueno, entonces no seria necesario tener que cortar la barra lográndose una solución óptima Considere una barra de longitud n = 4 con su tabla de precios longitud i precio pi 1 1 2 5 3 8 4 9 5 10 6 17 7 17 8 20 9 24 10 30 ¿Cuál es la estrategia óptima? ¿cuántas formas posibles se puede cortar una barra de longitud n? Considere una barra de longitud n = 4 con su tabla de precios longitud i precio pi 1 1 2 5 3 8 4 9 5 10 6 17 7 17 8 20 9 24 10 30 ¿Cuál es la estrategia óptima? ¿cuántas formas posibles se puede cortar una barra de longitud n? 2n−1 , conisderando que no se corte. Los cortes son a una distancia i de izquierda a derecha, i = 1, 2, 3, 4, ...., n − 1 buscando la solución La solución óptima de corte para la barra será en k pedazos y se cumple 1 ≤ k ≤ n, entonces la descomposición óptima será n = i1 + i2 + i3 + .... + ik , donde i1 , i2 , ..., ik son las piezas de determinada longitud y la máxima ganancia correspondiente será rn = pi1 + pi2 + .... + pik . buscando la solución La solución óptima de corte para la barra será en k pedazos y se cumple 1 ≤ k ≤ n, entonces la descomposición óptima será n = i1 + i2 + i3 + .... + ik , donde i1 , i2 , ..., ik son las piezas de determinada longitud y la máxima ganancia correspondiente será rn = pi1 + pi2 + .... + pik . De manera general debemos definir la función que permita obtener la máxima ganancia de corte: buscando la solución La solución óptima de corte para la barra será en k pedazos y se cumple 1 ≤ k ≤ n, entonces la descomposición óptima será n = i1 + i2 + i3 + .... + ik , donde i1 , i2 , ..., ik son las piezas de determinada longitud y la máxima ganancia correspondiente será rn = pi1 + pi2 + .... + pik . De manera general debemos definir la función que permita obtener la máxima ganancia de corte: rn = max (pn , r1 + rn−1 , r2 + rn−2 , ..., rn−1 + r1 ) El primer argumento,pn , corresponde a no realizar corte alguno y venderlo entero.,los restantes argumentos corresponden a la máxima ganancia al realizar el corte de la barra en dos pedazos de tamaño i y n − 1 correspondientemente, para cada i = 1, 2, 3, ...., n − 1, lo que sería ri y rn−1 . Por esta razón es que decimos que el problema del corte de la barra exhibe una sub-estructura óptima. Solución recursiva digamos que si cortamos al lado izquierdo la barra en un pedazo de longitud i y a la barra restante tendremos que tendrá una longitud n − i y solamente esta es la que se podrá ser dividida. Cualquier descomposición de longitud n se realizará: Corte una primera pieza y descomponga el resto; si la primera pieza tiene tamaño i = n y ganancia pn , el resto tendrá tamaño 0 y ganancia r0 . La ecuación que representa esto es: rn = max1≤i≤n (pi + rn−1 ) Algorithm 3 CorteBarra(p, n) 1: if n == 0 then 2: return 0 3: q = −∞ 4: for i = 1 to n do 5: q = max (q, p[i] + CorteBarra(p, n − i)) 6: end for 7: return q Análisis de la solución recursiva La ruta desde la raíz a una hoja tiene 2n−1 formas de corte, para una barra de longitud n. En general, el árbol de recursión tiene 2n nodos y 2n−1 hojas Análisis de la solución recursiva La ecuación asociada a este algoritmo: T (n) = 1 + n−1 j=0 T (j), donde T(j) cuenta el número de veces que se invoca a la función. A este problema regresaremos. P Veamos otro ejemplo, primero al pizarrón Te acuerdas de multiplicar matrices Matriz Una matriz n × m es un arreglo de dos dimensiones representado por A = a[i, j] de la forma: A= a1,1 a1,2 . . . a2,1 a2,2 . . . .. .. .. . . . an,1 an,2 . . . Con n filas y m columnas 40 of 11 a1,m−1 a1,m a2,m−1 a2,m .. .. . . an,m−1 an,m Te acuerdas de multiplicar matrices El producto C = AB donde A una matriz p × q y B una matriz q × r tiene una matriz resultante tipo p × r , el cual se puede expresar como: c[i, j] = q X k=1 Para 1 ≤ i ≤ p 1 ≤ j ≤ r 41 of 11 a[i, k]b[k, j] Te acuerdas de multiplicar matrices Consideramos entonces B= b11 b12 b13 b21 b22 b23 ! , A= a11 a12 a21 a22 ! . Al multiplicar B por una columna X = (x1 , x2 , x3 )t obtenemos BX = b11 b12 b13 b21 b22 b23 ! x1 x2 = x3 b11 x1 + b12 x2 + b13 x3 b21 x1 + b22 x2 + b23 x3 ! El producto de A por BX es A(BX ) = 42 of 11 a11 (b11 x1 + b12 x2 + b13 x3 ) + a12 (b21 x1 + b22 x2 + b23 x3 ) a21 (b11 x1 + b12 x2 + b13 x3 ) + a22 (b21 x1 + b22 x2 + b23 x3 ) ! Te acuerdas de multiplicar matrices Recordemos que si C es una matriz cualquiera, de dimensiones p × n, entonces el producto CEi es igual a la i-ésima columna de C . Apliquemos esta observación haciendo X = Ei , i = 1, 2, . . . , n, Obtenemos entonces n igualdades A(BEi ) = (AB)Ei , donde i varía entre 1 y n. Cada producto BEi es igual a Bi , la i-ésima columna de B, y cada producto (AB)Ei es igual a la i-ésima columna de AB, a la que llamaremos (AB)i . Obtenemos entonces A(Bi ) = (AB)i , 43 of 11 i = 1, 2, . . . , n. (1) Te acuerdas de multiplicar matrices 1. Si AB está definida entonces puede que BA no lo esté. 2. Es muy posible que no se cumpla AB 6= BA. 3. La multiplicación de matrices es asociativa A1 A2 A3 = (A1 A2 )A3 = A1 (A2 A3 ) Los parentesis no cambian resultado 4. La multiplicación puede definirse recursivamente de la siguiente manera: A1 A2 A3 . . . As−1 As = A1 (A2 (A3 . . . (As−1 As ))) 44 of 11 Multiplicación directa de matrices El producto C = AB donde A una matriz p × q y B una matriz q × r tiene una matriz resultante tipo p × r , el cual se puede expresar como: c[i, j] = q X a[i, k]b[k, j] k=1 Para 1 ≤ i ≤ p 1 ≤ j ≤ r complejidad de la multiplicación directa de matrices: El número de entradas de C es pr y esto toma Θ(q) tiempo de manera que el tiempo total toma Θ(pqr ) 45 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs • cuando p=5,q=4,r=6 y s=2 se tendrán 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs • cuando p=5,q=4,r=6 y s=2 se tendrán • mult[(AB)C ] = 180 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs • cuando p=5,q=4,r=6 y s=2 se tendrán • mult[(AB)C ] = 180 • mult[A(BC )] = 88 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs • cuando p=5,q=4,r=6 y s=2 se tendrán • mult[(AB)C ] = 180 • mult[A(BC )] = 88 • esto si es una diferencia 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs • cuando p=5,q=4,r=6 y s=2 se tendrán • mult[(AB)C ] = 180 • mult[A(BC )] = 88 • esto si es una diferencia • La cantidad de multiplicaciones si es una gran diferencia y es importasnte saber donde colocar los paréntesis. 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs • cuando p=5,q=4,r=6 y s=2 se tendrán • mult[(AB)C ] = 180 • mult[A(BC )] = 88 • esto si es una diferencia • La cantidad de multiplicaciones si es una gran diferencia y es importasnte saber donde colocar los paréntesis. • recuerda la multiplicación de matrices cumple con la propiedad: 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs • cuando p=5,q=4,r=6 y s=2 se tendrán • mult[(AB)C ] = 180 • mult[A(BC )] = 88 • esto si es una diferencia • La cantidad de multiplicaciones si es una gran diferencia y es importasnte saber donde colocar los paréntesis. • recuerda la multiplicación de matrices cumple con la propiedad: 46 of 11 Multiplicación directa de tres matrices ABC El producto ABC con A una matriz p × q , B una matriz q × r y C una matriz r × r se puede calcular en dos formas (AB)C o A(BC ) y se tiene que el número de multiplicaciones se necesitan serán: • mult[(AB)C ] = pqr + prs • mult[A(BC )] = qrs + pqs • cuando p=5,q=4,r=6 y s=2 se tendrán • mult[(AB)C ] = 180 • mult[A(BC )] = 88 • esto si es una diferencia • La cantidad de multiplicaciones si es una gran diferencia y es importasnte saber donde colocar los paréntesis. • recuerda la multiplicación de matrices cumple con la propiedad:ASOCIATIVA 46 of 11 Ejemplo 2: Multiplicación de Matrices Suponga que desea multiplicar 4 matrices: A1 , A2 , A3 , A4 . ¿De cuantas formas es posible realizarlo??? 1. (A1 (A2 (A3 A4 ))) 2. (A1 ((A2 A3 )A4 )) 3. (A1 (A2 )(A3 A4 )) 4. ((A1 (A2 A3 ))A4 ) 5. (((A1 A2 )A3 )A4 ) Si realizamos una búsqueda exhaustiva quien podrá salvarnos a resolver esto: 47 of 11 Ejemplo 2: Multiplicación de Matrices Suponga que desea multiplicar 4 matrices: A1 , A2 , A3 , A4 . ¿De cuantas formas es posible realizarlo??? 1. (A1 (A2 (A3 A4 ))) 2. (A1 ((A2 A3 )A4 )) 3. (A1 (A2 )(A3 A4 )) 4. ((A1 (A2 A3 ))A4 ) 5. (((A1 A2 )A3 )A4 ) Si realizamos una búsqueda exhaustiva quien podrá salvarnos a resolver esto: NADA QUE EL CHAPULIN COLORADO. 47 of 11 Multiplicación de Matrices Algorithm 4 multiplicarMatrices(A, B)) 1: if columnas[A] = filas[B] then 2: error = dimensionesincompatibles 3: for i = 1 to filas[A] do 4: for j = 1 to columnas[B] do 5: C [i, j] = 0 6: for k = 1 to columnas[A] do 7: C [i, j] = C [i, j] + A[i, k] ∗ B[k, j] 8: end for 9: end for 10: end for 11: end if 12: return C 48 of 11 Multiplicación de una sucesión de Matrices El problema de la multiplicación de una sucesión de matrices (MSM) es: X Enumerar todas las posibles maneras de multiplicar las n matrices, calculando su costo respectivo. X Escoger la de menor costo. 49 of 11 Multiplicación de una sucesión de Matrices El problema de la multiplicación de una sucesión de matrices (MSM) es: X Enumerar todas las posibles maneras de multiplicar las n matrices, calculando su costo respectivo. X Escoger la de menor costo. Esta solución es ingenua pues el número de posibles maneras de multiplicar las n matrices es: 1 X P(n) = n−1 P(k)P(n − k) k=1 P(n) = Ω(4n /n3/2 ) 49 of 11 si n=2 Si n > 2 Solución por medio de Programación Dinámica El problema de la multiplicación de una sucesión de matrices (MSM) es: X Entrada: Una sucesión < A1 , ..., An > de n matrices, donde la matriz Ai,1 ≤ i ≤ n, tiene dimensión pi−1 × pi X Salida: La manera óptima de multiplicar las matrices (óptima = mínimo número de multiplicaciones) Note que la salida se puede ver como una manera de poner paréntesis a la expresión A1 A2 ...An de tal suerte que indique en qué órden realizar las multiplicaciones. En el caso del ejemplo anterior, una solución óptima (la única en este caso) fue: (A1 A2 )A3 . 50 of 11 Solución :MSM, caso paréntesis Paso: 1 Determinar la estructura de una solución óptima Descomponer el problema en vairos subproblemas. Sea Ai..j la matriz que resulta de evaluar Ai . . . Aj . Una solución óptima para calcular A1..n , se divide en una solución óptima para calcular A1..k y una solución óptima para calcular Ak+1..n , para algún k, 1 ≤ k < n. Entonces el costo de una solución óptima es la suma de: X Costo de una solución óptima para A1..k X Costo de una solución óptima para Ak+1..n X Costo de multiplicar A1..k por Ak+1..n 51 of 11 Solución:Multiplicación de una sucesión de Matrices. cont. Mira esto: La solución para el problema A1..k la cual es parte del problema (A1..k ). Digamos que si no fuera la solución para A1..n que se afirma como óptima no lo sería. 52 of 11 Solución:Multiplicación de una sucesión de Matrices. cont. Mira esto: La solución para el problema A1..k la cual es parte del problema (A1..k ). Digamos que si no fuera la solución para A1..n que se afirma como óptima no lo sería. CONCLUSION: Toda solución óptima para el problema A1..n, contiene dentro de sí soluciones óptimas para los subproblemas encontrados. 52 of 11 Solución:Multiplicación de una sucesión de Matrices. cont. Mira esto: La solución para el problema A1..k la cual es parte del problema (A1..k ). Digamos que si no fuera la solución para A1..n que se afirma como óptima no lo sería. CONCLUSION: Toda solución óptima para el problema A1..n, contiene dentro de sí soluciones óptimas para los subproblemas encontrados. Propiedad de las subestructuras óptimas dentro de soluciones óptimas, es uno de los requisitos que se deben cumplir para que el problema sea resuelto por medio de Programación Dinámica. 52 of 11 Multiplicación de una sucesión de Matrices Etapa 2: Solución Recursiva Lo anteriomente descrito nos permite concluir que los subproblemas que se presentarán para calcular la solución óptima serán del estilo: Ai..j , 1 ≤ i < j ≤ n Sea m[i, j], el mínimo número de multiplicaciones necesarias para calcular Ai..j , entonces lo esencial es calcular m[1, n], para esto definamos m[i, j] recursivamente como : 53 of 11 Multiplicación de una sucesión de Matrices Etapa 2: Solución Recursiva ( m[i, j] = 0 mini≤k≤j = (m[i, k] + m[k + 1, j] + pi−1 pk pj ) si i = j si i < j Para ayudar a construir la solución óptima se define la matriz S como sigue: s[i, j] = k, si m[i, j] = m[i, k] + m[k + 1, j] + pi−1 pk pj 54 of 11 Multiplicación de una sucesión de Matrices Etapa 3: Cálculo de la solución óptima X solución fácil implentar el algoritmo recursivo basado en la expresión antrior, cuesta un RESTO de tiempo. 55 of 11 Multiplicación de una sucesión de Matrices Etapa 3: Cálculo de la solución óptima X solución fácil implentar el algoritmo recursivo basado en la expresión antrior, cuesta un RESTO de tiempo. X Pero si tenemos pocos subproblemas: 55 of 11 Multiplicación de una sucesión de Matrices Etapa 3: Cálculo de la solución óptima X solución fácil implentar el algoritmo recursivo basado en la expresión antrior, cuesta un RESTO de tiempo. X Pero si tenemos pocos subproblemas: X kAi : 1 ≤ i < j ≤ nk = 1 + 2 + ..... + (n − 1) = θ(n2 ) 55 of 11 Multiplicación de una sucesión de Matrices Etapa 3: Cálculo de la solución óptima X solución fácil implentar el algoritmo recursivo basado en la expresión antrior, cuesta un RESTO de tiempo. X Pero si tenemos pocos subproblemas: X kAi : 1 ≤ i < j ≤ nk = 1 + 2 + ..... + (n − 1) = θ(n2 ) X m[i, j] botton-up y no recursivamente. 55 of 11 Multiplicación de una sucesión de Matrices entonces el algortimo para calcular m[i, j] según la ecuación anterior será: 56 of 11 Multiplicación de una sucesión de Matrices . Ejemplo La complejidad de esta solución es trivial O(n3 ). Se puede demostrar que es Ω(n3 ), es decir Θ(n3 ). En espacio, se requiere Θ(n2 ) para almacenar m y s. Mucho más eficiente que las soluciones descritas anteriormente. Matriz A1 A2 A3 A4 A5 A6 57 of 11 Orden 30x35 35x15 15x5 5x10 10x20 20x25 Multiplicación de una sucesión de Matrices . Ejemplo 58 of 11 Para los que siguen En la página del curso: Libro-ADA-españa.zip 59 of 11 Chambas en el banco Dadas n funciones f1 , f2 , ..., fn y un entero positivo M, deseamos maximizar la función f1 (x1 ) + f2 (x2 ) + ... + fn (xn ) sujeta a la restricción x1 + x2 + ... + xn = M. Donde fi (0) = 0(i = 1, .., n), xi son números naturales, y todas las funciones son monótonas crecientes, es decir, x ≥ y ⇒ fi (x ) > fi (y ). Supóngase que los valores de cada función se almacenan en un vector. Este problema tiene una aplicación real muy interesante, en donde fi representa la función de interés que proporciona el banco i, y lo que deseamos es maximizar el interés total al invertir una cantidad determinada de dinero M. Los valores xi van a representar la cantidad a invertir en cada uno de los n bancos. 60 of 11 Chambas en el banco. solución Sea fi un vector que almacena el interés del banco i(1 ≤ i ≤ n) para una inversión de 1, 2, 3, ..., M pesos. Esto es, fi (j) indicará el interés que ofrece el banco i para jpesos, con 0 < i ≤ n, 0 < j ≤ M. Para poder plantear el problema como una sucesión de decisiones, llamaremos In (M) al interés máximo al invertir M pesos en n bancos, In (M) = f1 (x1 ) + f2 (x2 ) + ... + fn (xn ) que es la función a maximizar, sujeta a la restricción x 1 + x 2 + ... + xn = M. 61 of 11 Chambas en el banco. cont Veamos cómo aplicar el principio de óptimo. Si In (M) es el resultado de una secuencia de decisiones y resulta ser óptima para el problema de invertir una cantidad M en n bancos, cualquiera de sus subsecuencias de decisiones ha de ser también óptima y así la cantidad: In−1 (M) = f1 (x1 ) + f2 (x2 ) + ... + fn−1 (xn−1 ) será también óptima para el subproblema de invertir (M − xn ) pesos en n − 1 bancos. Y por tanto el principio de óptimo nos lleva a plantear la siguiente relación en recurrencia: 62 of 11 Chambas en el banco. cont In (x ) = f1 (x ) m« ax {In−1 (x − t) + fn (t)} 0≤t≤x si n = 1 en otro caso Como parte de una solución de Progranación Dinámica es resolver y calcular In (M), se debe utilizar una matriz I de dimensión nxM en donde iremos almacenando los resultados parciales y así eliminar la repetición de los cálculos. 63 of 11 Chambas en el banco. cont El valor de I[i, j] va a representar el interés de j pesos cuando se dispone de i bancos, por tanto la solución buscada se encontrará en I[n, M]. Para guardar los datos iniciales del problema vamos a utilizar otra matriz F , de la misma dimensión, y donde F [i, j] representa el interés del banco i para j pesos. En consecuencia, para calcular el valor pedido de I[n, M] rellenaremos la tabla por filas, empezando por los valores iniciales de la ecuación en recurrencia. 64 of 11 Viaje más barato.Si así fuera no habría ilegales Sobre el río Bravo hay n embarcaderos. En cada uno de ellos se puede alquilar un bote que permite ir a cualquier otro embarcadero río abajo (es imposible ir río arriba). Existe una tabla de tarifas que indica el costo del viaje del embarcadero i al j para cualquier embarcadero de partida i y cualquier embarcadero de llegada j más abajo en el río (i < j). Puede suceder que un viaje de i a j sea más caro que una sucesión de viajes más cortos, en cuyo caso se tomaría un primer bote hasta un embarcadero k y un segundo bote para continuar a partir de k. No hay costo adicional por cambiar de bote. Nuestro problema consiste en diseñar un algoritmo eficiente que determine el costo mínimo para cada par de puntos i, j(i < j) y determinar, en función de n, el tiempo empleado por el algoritmo. 65 of 11 Viaje más barato.Solución Llamaremos T [i, j] a la tarifa para ir del embarcadero i al j (directo). Estos valores se almacenarán en una matriz triangular superior de orden n, siendo n el número de embarcaderos. El problema puede resolverse mediante Programación Dinámica ya que para calcular el costo óptimo para ir del embarcadero i al j podemos hacerlo de forma recurrente, suponiendo que la primera parada la realizamos en un embarcadero intermedio k(i < k ≤ j): C (i, j) = T (i, k) + C (k, j) En esta ecuación se contempla el viaje directo, que corresponde al caso en el que k coincide con j. Esta ecuación verifica también que la solución buscada C (i, j) satisface el principio del óptimo, pues el costo C (k, j), que forma parte de la solución, ha de ser, a su vez, óptimo. 66 of 11 /IMAGENES/EscudoNegro / Viaje más barato.Solución Podemos plantear entonces la siguiente expresión de la solución: ( C (i, j) = 0 Si i = j mini<k≤j {T (i, k) + C (k, j)} Si i < j Observe que siempre existe un brinquito óptimo. Para resolver esto se necesita una estructura intermedia para almacenar resultados asociados y evitar la repetición de los cálculos.La complejidad de este método es (n3 ) (Se recomienda revisar el código) 67 of 11 /IMAGENES/EscudoNegro / Problemas asociados a la Programación Dinámica ¿Cuando es posible aplicar Programación Dinámica?: That’s the question, folks!!!!! Ingredientes que a fuerzas deben tener un problema de optimización que se va a resolver por este paradigma. • Subestructura óptima: Un problema muestra una subestructura óptima SI la solución óptima está formada por subproblemas cuyas soluciones son óptimas tambien. Patrones que sugieren la PD los cuales pueden ser: 1. Cuando la solución a un problema está basado en tener que seleccionar, como es el caso de la armadora de Vochichos, entonces la elección nos deja uno o más subproblemas a resolver. 2. Suponga que para un problema dado , a Usted se le brinada una opción que nos dirija a una solución óptima. 68 of 11 Problemas asociados a la Programación Dinámica. Cont 1. La sugerencia anterior nos lleva a que entonces se debe caracterizar el espacio de subproblemas lo cual lleva implícito que se determine como está el espacio de problemas a considerar. 69 of 11 Problemas asociados a la Programación Dinámica. Cont 1. La sugerencia anterior nos lleva a que entonces se debe caracterizar el espacio de subproblemas lo cual lleva implícito que se determine como está el espacio de problemas a considerar. 2. Trate de mantener el espacio de subproblemas tan simple como Usted pueda y expandirlo solo si es necesario. (caso gato, robot, montaña) 69 of 11 Problemas asociados a la Programación Dinámica. Cont El otro ingrediente que se debe considerar es el referente al Solapamiento de Problemas. el espacio de subproblemas debe ser pequeño en el sentido que un algoritmo recursivo dado que la solución a un problema se resuevle a partir de la solución de otros problemas y si esto se viola: "MEMORY CORE DEFAULT "FALLA 70 of 11 Memoization 71 of 11 como funciona esto de Memoization • LA IDEA ES MANTENER UNA TABLA con las soluciones a los subproblemas 72 of 11 /IMAGENES/EscudoNegro / como funciona esto de Memoization • LA IDEA ES MANTENER UNA TABLA con las soluciones a los subproblemas • La tabla es llenada por la estructura de control asociada a la recursión. 72 of 11 /IMAGENES/EscudoNegro / como funciona esto de Memoization • LA IDEA ES MANTENER UNA TABLA con las soluciones a los subproblemas • La tabla es llenada por la estructura de control asociada a la recursión. • Cuando se encuentra el primer sub-problema durante la ejecución del algoritmo recursivo. 72 of 11 /IMAGENES/EscudoNegro / como funciona esto de Memoization • LA IDEA ES MANTENER UNA TABLA con las soluciones a los subproblemas • La tabla es llenada por la estructura de control asociada a la recursión. • Cuando se encuentra el primer sub-problema durante la ejecución del algoritmo recursivo. • La solución se calcula y almacenada en la tabla 72 of 11 /IMAGENES/EscudoNegro / Veamos otro caso: LCS Una subsecuencia de una cadena S, es un conjunto de caracteres que aparecen de izquierda a derecha, pero no necesariamente consecutivamente. Por ejemplo ACTTGCG es una cadena. Y serán subsecuencias las siguientes: • ACT 73 of 11 /IMAGENES/EscudoNegro / Veamos otro caso: LCS Una subsecuencia de una cadena S, es un conjunto de caracteres que aparecen de izquierda a derecha, pero no necesariamente consecutivamente. Por ejemplo ACTTGCG es una cadena. Y serán subsecuencias las siguientes: • ACT • ATTC 73 of 11 /IMAGENES/EscudoNegro / Veamos otro caso: LCS Una subsecuencia de una cadena S, es un conjunto de caracteres que aparecen de izquierda a derecha, pero no necesariamente consecutivamente. Por ejemplo ACTTGCG es una cadena. Y serán subsecuencias las siguientes: • ACT • ATTC • T 73 of 11 /IMAGENES/EscudoNegro / Veamos otro caso: LCS Una subsecuencia de una cadena S, es un conjunto de caracteres que aparecen de izquierda a derecha, pero no necesariamente consecutivamente. Por ejemplo ACTTGCG es una cadena. Y serán subsecuencias las siguientes: • ACT • ATTC • T • ACTTGC 73 of 11 /IMAGENES/EscudoNegro / Veamos otro caso: LCS Una subsecuencia de una cadena S, es un conjunto de caracteres que aparecen de izquierda a derecha, pero no necesariamente consecutivamente. Por ejemplo ACTTGCG es una cadena. Y serán subsecuencias las siguientes: • ACT • ATTC • T • ACTTGC • ¿Lo será:? 73 of 11 /IMAGENES/EscudoNegro / Veamos otro caso: LCS Una subsecuencia de una cadena S, es un conjunto de caracteres que aparecen de izquierda a derecha, pero no necesariamente consecutivamente. Por ejemplo ACTTGCG es una cadena. Y serán subsecuencias las siguientes: • ACT • ATTC • T • ACTTGC • ¿Lo será:? • TTA 73 of 11 /IMAGENES/EscudoNegro / Veamos otro caso: LCS Definición La cadena común más larga de las cadenas S1 y S2 es aquella secuencia común que contenga mayor cantidad de caracteres de ambas cadenas. Cadena común más larga (LCS). Ejemplo: S1 A A T G G C C A T A con longitud n=10 La solución no es única para todos los pares de cadenas. Considere la cadena: ATTA y ATAT, la solución es ATT y ATA. Esto sugiere múltiples soluciones. 74 of 11 Veamos otro caso: LCS Definición La cadena común más larga de las cadenas S1 y S2 es aquella secuencia común que contenga mayor cantidad de caracteres de ambas cadenas. Cadena común más larga (LCS). Ejemplo: S1 A A T G G C C A T A con longitud n=10 S2 A T A T A A T T C T A T con longitud m=12 La solución no es única para todos los pares de cadenas. Considere la cadena: ATTA y ATAT, la solución es ATT y ATA. Esto sugiere múltiples soluciones. 74 of 11 Veamos otro caso: LCS Definición La cadena común más larga de las cadenas S1 y S2 es aquella secuencia común que contenga mayor cantidad de caracteres de ambas cadenas. Cadena común más larga (LCS). Ejemplo: S1 A A T G G C C A T A con longitud n=10 S2 A T A T A A T T C T A T con longitud m=12 LCS A A T C A T con longitud 6 La solución no es única para todos los pares de cadenas. Considere la cadena: ATTA y ATAT, la solución es ATT y ATA. Esto sugiere múltiples soluciones. 74 of 11 Cómo obtener una LCS • Usando la fuerza bruta se puede pensar en enumerar todas las subsecuencias de X y verificar si son subsecuencias de Y. 75 of 11 Cómo obtener una LCS • Usando la fuerza bruta se puede pensar en enumerar todas las subsecuencias de X y verificar si son subsecuencias de Y. • Cada subsecuencia de X corresponde a los subíndices < 1, 2, 3, ..., m > de x . Lo que equivale a: 75 of 11 Cómo obtener una LCS • Usando la fuerza bruta se puede pensar en enumerar todas las subsecuencias de X y verificar si son subsecuencias de Y. • Cada subsecuencia de X corresponde a los subíndices < 1, 2, 3, ..., m > de x . Lo que equivale a: • 2m subsecuencias de X es tiempo exponencial!!!!!!!! 75 of 11 Cómo obtener una LCS • Usando la fuerza bruta se puede pensar en enumerar todas las subsecuencias de X y verificar si son subsecuencias de Y. • Cada subsecuencia de X corresponde a los subíndices < 1, 2, 3, ..., m > de x . Lo que equivale a: • 2m subsecuencias de X es tiempo exponencial!!!!!!!! • Por aca no llegamos a ningún lado 75 of 11 Cómo obtener una LCS. Paso 1 Identifiquemos si el problema tiene una subestructura óptima: Teorema Sean las siguientes secuencias X =< x1 , x2 , x3 , x4 , ...., xm > y Y =< y1 , y2 , y3 , y4 , ...., yn > y la LCS deXyY como la secuencia Z =< z1 , z2 , z3 , z4 , ...., zk >. 1. Si xm = yn entonces zk = xm = yn y Zk−1 es una LCS de Xm−1 y Yn−1 2. Si xm 6= yn entonces zk 6= xm implica que Z es una LCS de Xm−1 y Y 3. Si xm 6= yn entonces zk 6= yn implica que Z es una LCS de X y Yn−1 76 of 11 Cómo obtener una LCS. Paso 2 Definir una solución recursiva y de acuerdo al teorema anterior sugiere que habrá que examinar dos subproblemas para obtener la LCS. • 1er Caso: Si xm = yn entonces zk = xm = yn y Zk−1 es una LCS de Xm−1 y Yn−1 77 of 11 Cómo obtener una LCS. Paso 2 Definir una solución recursiva y de acuerdo al teorema anterior sugiere que habrá que examinar dos subproblemas para obtener la LCS. • 1er Caso: Si xm = yn entonces zk = xm = yn y Zk−1 es una LCS de Xm−1 y Yn−1 • El primer caso del Teorema sugiere que dada la igualdad entonces solo hay que trabajar en problemas más pequeños. 77 of 11 Cómo obtener una LCS. Paso 2 Definir una solución recursiva y de acuerdo al teorema anterior sugiere que habrá que examinar dos subproblemas para obtener la LCS. • 1er Caso: Si xm = yn entonces zk = xm = yn y Zk−1 es una LCS de Xm−1 y Yn−1 • El primer caso del Teorema sugiere que dada la igualdad entonces solo hay que trabajar en problemas más pequeños. • 2do Caso: Si xm 6= yn entonces zk 6= xm implica que Z es una LCS de Xm−1 y Y 77 of 11 Cómo obtener una LCS. Paso 2 Definir una solución recursiva y de acuerdo al teorema anterior sugiere que habrá que examinar dos subproblemas para obtener la LCS. • 1er Caso: Si xm = yn entonces zk = xm = yn y Zk−1 es una LCS de Xm−1 y Yn−1 • El primer caso del Teorema sugiere que dada la igualdad entonces solo hay que trabajar en problemas más pequeños. • 2do Caso: Si xm 6= yn entonces zk 6= xm implica que Z es una LCS de Xm−1 y Y • El segundo y tercer caso caso sugiere que dado que son desiguales tenemos dos casos que resolver y en donde se encuentra, la LCS. 77 of 11 Cómo obtener una LCS. Paso 2 Definir una solución recursiva y de acuerdo al teorema anterior sugiere que habrá que examinar dos subproblemas para obtener la LCS. • 1er Caso: Si xm = yn entonces zk = xm = yn y Zk−1 es una LCS de Xm−1 y Yn−1 • El primer caso del Teorema sugiere que dada la igualdad entonces solo hay que trabajar en problemas más pequeños. • 2do Caso: Si xm 6= yn entonces zk 6= xm implica que Z es una LCS de Xm−1 y Y • El segundo y tercer caso caso sugiere que dado que son desiguales tenemos dos casos que resolver y en donde se encuentra, la LCS. • 3er Caso: Si xm 6= yn entonces zk 6= yn implica que Z es una LCS de X y Yn−1 . 77 of 11 Cómo obtener una LCS. Paso 2, cont. Observe un detalle de los casos dos y tres: como en el lugar donde se encuentra la solución hay una especie de solapamiento de subproblemas ya que cada subproblema tiene como subsubproblema encontrar la LCS de X y Y . c[i, j] = 0 si i = 0 ó j = 0 c[i − 1, j − 1] + 1 Si j > 0 y xi = yj m« ax(c[i, j − 1], c[i − 1, j]) Si i, j > 0 y xi 6= yj Esta formulación es recursiva y se restringe a las condiciones enunciadas en el teorema anterior. Favor de revisar el comando diff. 78 of 11 Cómo obtener una LCS. Paso 2, Algoritmo 79 of 11 Cómo obtener una LCS. Paso 2, Algoritmo • Supón que se invoca la función c[i, j] para obtener la LCS entre Xi y Yk 0 si i = 0 ó j = 0 c[i, j] = c[i − 1, j − 1] + 1 Si j > 0 y xi = yj m« ax(c[i, j − 1], c[i − 1, j]) Si i, j > 0 y xi 6= yj 80 of 11 Cómo obtener una LCS. Paso 2, Algoritmo • Supón que se invoca la función c[i, j] para obtener la LCS entre Xi y Yk • La expersión recursiva para c[i, j] es: 0 si i = 0 ó j = 0 c[i, j] = c[i − 1, j − 1] + 1 Si j > 0 y xi = yj m« ax(c[i, j − 1], c[i − 1, j]) Si i, j > 0 y xi 6= yj 80 of 11 Cómo obtener una LCS. Paso 2, Algoritmo • Supón que se invoca la función c[i, j] para obtener la LCS entre Xi y Yk • La expersión recursiva para c[i, j] es: 0 si i = 0 ó j = 0 c[i, j] = c[i − 1, j − 1] + 1 Si j > 0 y xi = yj m« ax(c[i, j − 1], c[i − 1, j]) Si i, j > 0 y xi 6= yj • La subsecuencia se define en b[i, j] con el siguiente significado: 80 of 11 Cómo obtener una LCS. Paso 2, Algoritmo • Supón que se invoca la función c[i, j] para obtener la LCS entre Xi y Yk • La expersión recursiva para c[i, j] es: 0 si i = 0 ó j = 0 c[i, j] = c[i − 1, j − 1] + 1 Si j > 0 y xi = yj m« ax(c[i, j − 1], c[i − 1, j]) Si i, j > 0 y xi 6= yj • La subsecuencia se define en b[i, j] con el siguiente significado: ◦ b[i, j] tiene valor 1 si la LCS de Xi y Xj contiene a xi (xi = xj ) 80 of 11 Cómo obtener una LCS. Paso 2, Algoritmo • Supón que se invoca la función c[i, j] para obtener la LCS entre Xi y Yk • La expersión recursiva para c[i, j] es: 0 si i = 0 ó j = 0 c[i, j] = c[i − 1, j − 1] + 1 Si j > 0 y xi = yj m« ax(c[i, j − 1], c[i − 1, j]) Si i, j > 0 y xi 6= yj • La subsecuencia se define en b[i, j] con el siguiente significado: ◦ b[i, j] tiene valor 1 si la LCS de Xi y Xj contiene a xi (xi = xj ) ◦ b[i, j] tiene valor ↑ si el último elemento de la LCS de Xi y Xj es igual al último elemento de la LCS de Xi−1 y Yj 80 of 11 Cómo obtener una LCS. Paso 2, Algoritmo • Supón que se invoca la función c[i, j] para obtener la LCS entre Xi y Yk • La expersión recursiva para c[i, j] es: 0 si i = 0 ó j = 0 c[i, j] = c[i − 1, j − 1] + 1 Si j > 0 y xi = yj m« ax(c[i, j − 1], c[i − 1, j]) Si i, j > 0 y xi 6= yj • La subsecuencia se define en b[i, j] con el siguiente significado: ◦ b[i, j] tiene valor 1 si la LCS de Xi y Xj contiene a xi (xi = xj ) ◦ b[i, j] tiene valor ↑ si el último elemento de la LCS de Xi y Xj es igual al último elemento de la LCS de Xi−1 y Yj ◦ b[i, j] tiene valor ↓ si el último elemento de la LCS de Xi y Xj es igual al último elemento de la LCS de Xi y Yj−1 80 of 11 Cómo obtener una LCS. Paso 2, Algoritmo • Supón que se invoca la función c[i, j] para obtener la LCS entre Xi y Yk • La expersión recursiva para c[i, j] es: 0 si i = 0 ó j = 0 c[i, j] = c[i − 1, j − 1] + 1 Si j > 0 y xi = yj m« ax(c[i, j − 1], c[i − 1, j]) Si i, j > 0 y xi 6= yj • La subsecuencia se define en b[i, j] con el siguiente significado: ◦ b[i, j] tiene valor 1 si la LCS de Xi y Xj contiene a xi (xi = xj ) ◦ b[i, j] tiene valor ↑ si el último elemento de la LCS de Xi y Xj es igual al último elemento de la LCS de Xi−1 y Yj ◦ b[i, j] tiene valor ↓ si el último elemento de la LCS de Xi y Xj es igual al último elemento de la LCS de Xi y Yj−1 • a partir de b[i, j] es muy sencillo construir la LCS. 80 of 11 Cómo obtener una LCS. Paso a paso el algoritmo Sean las cadenas X =< A, B, C , B, D, A, B > y Z =< B, D, C , A, B, A >: La cadena resultante es: X =< A, B, C , B,D, A, B > y Z81 =< B, D, C , A, B, A >: of 11 Construcción LCS. Paso • Seguimos las flechas empezando b[m, n] 82 of 11 Construcción LCS. Paso • Seguimos las flechas empezando b[m, n] • Donde quiera que encontremos una flecha - 82 of 11 Construcción LCS. Paso • Seguimos las flechas empezando b[m, n] • Donde quiera que encontremos una flecha • Significa que xi = yj es un elemento de LCS 82 of 11 Construcción LCS. Paso • Seguimos las flechas empezando b[m, n] • Donde quiera que encontremos una flecha • Significa que xi = yj es un elemento de LCS • Los elementos de LCS se encuentran en orden inverso. 82 of 11 Para los Dorados del la División del Norte Míralos bien como visten, con que pelearon y verás que la vida no vale nada ENTONCES........... 83 of 11 Reto para mis Dorados del la División del Norte Implementar • LA subsecuencia más larga y Determine la LCS de <1,0,0,1,0,1,0,1> y <1,0,1,1,0,1,1,0>, hacer con diferentes tipos de cadenas. • Del libro de España seleccione dos problema del capítulo de Programación dinámica. 84 of 11