Análisis y Diseño de Algoritmos

Anuncio
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
Descargar