Post on 23-Mar-2020
transcript
Tema 08: Programación dinámica
1
Análisis de algoritmos
M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.comedfrancom@ipn.mx
@edfrancom edgardoadrianfrancom
• Introducción
• Programación dinámica
• Enfoques de la programación dinámica
• Principio de optimalidad
• Diseño de un algoritmo de programación dinámica
• Ejemplos
• Fibonacci
• Cálculo del coeficiente binomial
• Subsecuencia común mas larga (“Longest CommonSubsequence” LCS)
Contenido
2
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Introducción• La técnica divide y vencerás señala que es posible
dividir un problema en subproblemas y combinar lassoluciones para resolver el problema original.
• En ocasiones resolver subproblemas nos lleva aconsiderar subproblemas idénticos.
• Si aprovechamos la duplicación, resolviendo cadaproblema una sola vez, guardando la solución parasu uso posterior entonces tendremos un algoritmomás eficiente.
3
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
4
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• La idea de la programación dinámica es evitarrepetición de cálculos.
• La base de la programación dinámica es elrazonamiento inductivo:• ¿Como resolver un problema combinando soluciones para
problemas más pequeños?
• Se resuelven primero los subproblemas más pequeños y portanto más simples. Combinando las soluciones se obtienenlas soluciones de ejemplares sucesivamente más grandeshasta llegar al ejemplar original.
Programación dinámica• La programación dinámica es un método para
reducir el tiempo de ejecución de un algoritmomediante la utilización de subproblemassuperpuestos y subestructuras óptimas.
• Una subestructura óptima significa que se puedenusar soluciones óptimas de subproblemas paraencontrar la solución óptima del problema en suconjunto.
• Un problema tiene subproblemas superpuestos si seusa un mismo subproblema para resolver diferentesproblemas mayores.
5
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
6
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Los algoritmos divide y vencerás están dentro de losmétodos descendentes.• Empezar con el problema original y descomponerlo en
pasos sucesivos en problemas de menor tamaño.
• La programación dinámica por el contrario, es unmétodo ascendente:• Resolver primero los problemas pequeños (guardando
las soluciones) y después combinarlas para resolverproblemas más grandes.
• La programación dinámica hace uso de:• Subproblemas superpuestos
• Subestructuras óptimas
• Memoizacion
7
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• En general, se pueden resolver problemas consubestructuras óptimas siguiendo estos tres pasos:1. Dividir el problema en subproblemas más pequeños.
2. Resolver estos problemas de manera óptima usando esteproceso de tres pasos recursivamente.
3. Usar estas soluciones óptimas para construir una soluciónóptima al problema original.
• Los subproblemas se resuelven a su vez dividiéndolos ensubproblemas más pequeños hasta que se alcance elcaso fácil, donde la solución al problema es trivial.
Ejemplo: Fibonacci
8
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
𝚶(𝒄𝒏)
9
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Si se llama a fib(5), se produce un árbol de llamadas que contendráfunciones con los mismos parámetros varias veces:
1. fib(5)
2. fib(4) + fib(3)
3. (fib(3) + fib(2)) + (fib(2) + fib(1))
4. ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
5. (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
10
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Cuando se llega en el árbol a los casos base (señalados en la imagen)evidentemente las llamadas a la función se detienen. Pero tambiénpodemos notar que existen varios casos en donde se llama recursivamentea números que ya fueron calculados, por ejemplo el 3.
• Entonces para subsecuentes llamadas la cantidad de operaciones a calcular sevolverían exponenciales y la complejidad aproximada sería 𝑂(𝑐𝑛) lo cuál para
un n=20 ya es mucho que calcular (𝑂(1+ 5
2)𝑛≈ 15,127 llamadas a la función).
11
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Originalmente, el término de programación dinámica serefería a la resolución de ciertos problemas yoperaciones fuera del ámbito de la IngenieríaInformática, al igual que hacía la programación lineal.Aquel contexto no tiene relación con la programación enabsoluto; el nombre es una coincidencia. El términotambién lo usó en los años 40 Richard Bellman, unmatemático norteamericano, para describir el procesode resolución de problemas donde hace falta calcular lamejor solución consecutivamente.
• Algunos lenguajes de programación funcionales, sobretodo Haskell, pueden usar la memorizaciónautomáticamente sobre funciones con un conjuntoconcreto de argumentos, para acelerar su proceso deevaluación. Esto sólo es posible en funciones que notengan efectos secundarios.
12
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Los subproblemas superpuestos provocan resolvervarias veces el mismo problema, ya que la solución de unsubproblema requiere calcular soluciones que otrosubproblema también tenga que calcular.
• Perder tiempo calculando varias veces la solución almismo subproblema se puede evitar guardando lassoluciones que ya hemos calculado. Entonces, sinecesitamos resolver el mismo problema más tarde,podemos obtener la solución de la lista de solucionescalculadas y reutilizarla. Este acercamiento al problemase llama memoización (Memoization en inglés) omemorización se diferencia de 'memorización'puesto que el término ya era usado enmatemáticas).
Memoizacion
13
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Se puede resolver el problema, utilizando el enfoque de memorización(guardar los valores que ya han sido calculados para utilizarlosposteriormente).
• Así, rellenaríamos una tabla con los resultados de los distintos subproblemas,para reutilizarlos cuando haga falta en lugar de volver a calcularlos. La tablaresultante sería una tabla unidimensional con los resultados desde 0 hasta n.
14
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• En programación dinámica comúnmente se utilizantablas de resultados conocidos que se va generando amedida que se resuelven los subcasos.
f(4)
f(3)
f(2) f(1)
f(2)
f(1) f(0)
f(1) f(0)
Function Fibonacci (n:int): int;
if (n=0) return 0;
else if (n=1)
return 1;
else if (Fib[n]!=NONE)
return Fib[n];
else
Fib[n]=Fibonacci(n-1)+fibonacci(n-2);
return Fib[n];
f(4) f(3) f(2) f(1) f(0)
15
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Donde tiene mayor aplicación la Programación Dinámicaes en la resolución de problemas de optimización. Eneste tipo de problemas se pueden presentar distintassoluciones, cada una con un valor, y lo que se desea esencontrar la solución de valor óptimo (máximo omínimo).
• La solución de problemas mediante esta técnica se basaen el llamado principio de óptimo enunciado porBellman en 1957 y que dice:
“En una secuencia de decisiones óptima toda subsecuencia ha de ser también óptima”.
Subestructuras óptimas
16
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Top-down: El problema se divide en subproblemas, yestos se resuelven recordando las soluciones por sifueran necesarias nuevamente. Es una combinación dememoización y recursión.
• Bottom-up: Todos los problemas que puedan sernecesarios se resuelven de antemano y después se usanpara resolver las soluciones a problemas mayores. Esteenfoque es ligeramente mejor en consumo de espacio yllamadas a funciones, pero a veces resulta poco intuitivoencontrar todos los subproblemas necesarios pararesolver un problema dado.
Enfoques de la programación dinámica
int tabla[n]; // tabla {-1,-1,…,-1}
int fibonacci(int n){
if (n<2)return n;
if(tabla[n-1] == -1)tabla[n-1] = fibonacci(n-1);
if(tabla[n-2] == -1)tabla[n-2] = fibonacci(n-2);
tabla[n] = tabla[n-1] + tabla[n-2];
return tabla[n];}
17
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Fibonacci utilizando (Programación dinámica -Top-down)
𝚶(𝒏)
int fibonacci(int n){
int i;if (n<2){
return n;}else{
tabla[0] = 0;tabla[1] = 1;for(i = 2; i < n; i++)tabla[i] = tabla[i-1] + tabla[i-2];
}return tabla[n];
}
18
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Fibonacci utilizando (Programación dinámica - Buttom-up)
𝚶(𝒏)
Principio de optimalidad• Cuando hablamos de optimizar nos referimos a buscar
alguna de las mejores soluciones (solución optima) deentre muchas alternativas posibles. Dicho proceso deoptimización puede ser visto como una secuencia dedecisiones que nos proporcionan la solución optima.
• En este caso sigue siendo posible el ir tomandodecisiones elementales, en la confianza de que lacombinación de ellas seguirá siendo óptima, pero seráentonces necesario explorar muchas secuencias dedecisiones para dar con la correcta, siendo aquí dondeinterviene la programación dinámica. 19
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
“En una secuencia de decisiones óptima toda subsecuencia ha de ser también óptima”
• Contemplar un problema como una secuencia dedecisiones equivale a dividirlo en problemas máspequeños y por lo tanto más fáciles de resolver comohacemos en Divide y Vencerás. La programacióndinámica se aplica cuando la subdivisión de un problemaconduce a:
• Una enorme cantidad de problemas.
• Problemas cuyas soluciones parciales se solapan.
• Grupos de problemas de muy distinta complejidad.20
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Para que un problema pueda ser abordadopor esta técnica ha de cumplir doscondiciones:
1. La solución al problema ha de ser alcanzada através de una secuencia de decisiones, una encada etapa.
2. Dicha secuencia de decisiones ha de cumplirel principio de optimalizad.
21
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Diseño de un algoritmo de programación dinámica
22
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• El diseño de un algoritmo de ProgramaciónDinámica consta de los siguientes pasos:
1. Planteamiento de la solución como una sucesión dedecisiones y verificación de que ésta cumple elprincipio de óptimo.
2. Definición recursiva* o iterativa de la solución.
3. Cálculo del valor de la solución óptima medianteuna estructura de datos en donde se almacenansoluciones a problemas parciales para reutilizar loscálculos.
4. Construcción de la solución óptima haciendo uso dela información contenida en la estructura de datos.
Cálculo del coeficiente binomial• Los coeficientes binomiales o números combinatorios son
una serie de números estudiados en combinatoria queindican el número de formas en que se pueden extraersubconjuntos a partir de un conjunto dado.
• P.g. Se tiene un conjunto con 6 objetos diferentes{A,B,C,D,E,F}, de los cuales se desea escoger 2 (sin importarel orden de elección). ¿Cuántas formas de elección existen?
23
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
A,B A,C A,D A,E A,F
B,C B,D B,E B,F
C,D C,E C,F
D,E D,F
E,F
A B C D E F
• El número de formas de escoger k elementos a partir de unconjunto de n, puede denotarse de varias formas:
𝐶 𝑛, 𝑘 , 𝑛 𝐶 𝑘,𝑛
𝑘
𝐶 6,2 = 6 𝐶 2 =6
2= 15
• Los números C(n,k) se conocen como “coeficientes binomiales”,pero es frecuente referirse a ellos como “combinaciones de n enk”, o simplemente “n en k”.
24
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
El coeficiente binomial 𝑛𝑘
es el número de subconjuntos
de k elementos escogidos de un conjunto con n elementos
El coeficiente binomial 𝑛𝑘
está dado por la fórmula 𝑛𝑘
=𝑛!
𝑘! 𝑛−𝑘 !
• Forma recursiva del coeficiente binomial
• Si se desea calcular C(5,3), ¿Cuáles son los casos que se repiten?
25
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
𝑛
𝑘=
1𝑛 − 1
𝑘 − 1+
𝑛 − 1
𝑘
0
𝑠𝑖 𝑘 = 0 𝑜 𝑘 = 𝑛
𝑠𝑖 0 < 𝑘 < 𝑛
𝑒𝑛 𝑐𝑎𝑠𝑜 𝑐𝑜𝑛𝑡𝑟𝑎𝑟𝑖𝑜
funcion C(n,k){
Si k = 0 o k = n entonces devolver 1
sino si 0 < k< ndevolver C(n-1,k-1) + C(n-1,k)
sinodevolver 0
}
int tabla[n] [n]; // tabla[][] {-1,-1,…,-1}
int coef_bino (int n){
if (k==0||k==n)return 1;
else if(k>0&&k<n){
if(tabla[n-1][k-1]==-1)tabla[n-1][k-1]=coef_bino(n-1,k-1);
if(tabla[n-1][k]==-1)tabla[n-1][k]=coef_bino(n-1,k);
return tabla[n-1][k-1]+tabla[n-1][k];}else
return 0;} 26
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Coeficiente binomial (Top-down)
• El algoritmo recursivo que los calcula resulta ser de complejidadexponencial por la repetición de los cálculos que realiza. Noobstante, es posible diseñar un algoritmo con un tiempo deejecución de orden O(nk) basado en la idea del Triángulo dePascal. Para ello es necesario la creación de una tablabidimensional en la que ir almacenando los valores intermediosque se utilizan posteriormente.
27
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Se ira construyendo la tabla por filas de arriba hacia abajo y deizquierda a derecha mediante el siguiente algoritmo decomplejidad polinómica (Bottom-up).
28
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
int coef_bino(int n, int k)
{
int i, j;
for(i = 0; i <= n; i++)
tabla[i][0] = 1;
for(i = 1; i<= n; i++)
tabla[i][1] = i;
for(i = 2; i<= k; i++)
tabla[i][i] = 1;
for(i = 3; i <= n; i++)
for(j = 2; j <= i-1; j++)
if(j <= k)
tabla[i][j] = tabla[i-1][j-1] + tabla[i-1][j];
return tabla[n][k];
}
Coeficiente binomial (Bottom-up)
• Resultado Triangulo de Pascal
29
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Curiosidades del Triangulo de Pascal• Coloca la primera fila, el 1, y luego coloca el resto de filas
desplazadas una posición hacia la derecha respecto de la fila
justo anterior. Si ahora sumamos las columnas que nos quedan,obtenemos los números de la sucesión de Fibonacci
30
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Si creamos una tabla en la que colocamos los enteros mayores o
iguales que cero en la primera fila y en la primera columna, y
dentro colocamos las filas del triángulo de Pascal de manera que la
fila n comience en la columna 2n. Es decir, la fila 0 comenzará en la
fila 2·0=0, la fila 1 en la columna 2·1=2, la fila 2 en la columna
2·2=4, y así sucesivamente. Las 8 primeras filas quedarían de lasiguiente forma:
31
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Un número de la fila superior es primo si cada uno de loselementos de su columna es divisible por su correspondientenúmero de fila.
32
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Es una de las operaciones de comparación másimportantes sobre las secuencias y su aplicación esdiversa en muchas áreas, especialmente en labioinformática.
33
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Cálculo de la subsecuencia común más larga
Secuencia. Cadena finita donde todos suselementos pertenecen a un alfabeto.
Por ejemplo:
Una secuencia de ADN está formada por loscaracteres pertenecientes al alfabeto
{A,C,G,T}.
34
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
● Subsecuencia común más larga:
Longest Common Subsequence (LCS)
Sucesión de caracteres de forma ordenada (nonecesariamente contiguos) de mayor longitud.
● Subcadena más larga:
Sucesión de caracteres consecutivos de mayorlongitud.
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
35
Diferencia entre subcadena y subsecuencia más larga
Subcadena más larga: Subsecuencia más larga:
36
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• La LCS entre la secuencia “BIOLOGÍA” y algunas otras secuencias son:
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
M
artí
nez
37
Fuerza brutaComparar cualquier subsecuencia de X con los símbolos de Y.
X:
Y:
|X| = 7 → m|Y| = 6 → n
La LCS entre X y Y es: 38
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
LCS Algoritmo con Programación DinámicaUsando programación dinámica para encontrar el LCS, elalgoritmo construye una matriz L[0..m][0..n] donde L(i,j)representa el LCS para x...i y y...j. Cada valor en la matriz secalcula basándose en los valores de las posiciones vecinasanteriores: izquierda, superior y diagonal superior izquierda.
Así la matriz de programación dinámica se obtiene L(x,y)correspondiente a L(m,n).
X
39
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
● 1er CASO: i=0 o j=0 (Caso Base)La LCS de la cadena vacía y cualquier otra cadena es vacía.
L(0, j) = L(i,0) = 0Ejemplo:X = “” → i=0Y = “A” → j=0,1
∴ LCS = 0
● 2do CASO x[i]=y[j]:Se empareja un símbolo más en X e Y, entonces:
L(i,j) = L(i-1,j-1) +1Ejemplo:X = “A” Si i=1Y = “A” Si j=1
L(i,j) = L(i-1,j-1) +1= L(0,0) +1= 0 +1
∴ LCS = 1● 3er CASO x[i] != y[j]:
Como no se emparejan los símbolos, la LCS no mejora y es la mejor entre:L(i,j) = max [L(i-1,j), L(i,j-1)]
40
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
LCS - Longitud(X,Y)
m = lenght(X)
n = lenght(Y)
para i = 0 hasta m L[i,0] = 0 //Caso especial Y0
para i = 0 hasta n L[0,j] = 0 //Caso especial X0
para i = 1 hasta m
para j = 1 hasta n
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
return c
41
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Longest common subsequence LCS
Ejemplo LCSSupongamos dos cadenas X = ABCD y Y = BDCAB con longitud m = 4 y n = 5, lasubsecuencia común más larga sería:
LCS(X,Y) = BCBX = ABCBY = BDCAB
Para obtener la tabla se realiza lo siguiente:
X = ABCB; m = |X| = 4Y = BDCAB; n = |Y| = 5 42
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
1. Se empieza a llenar la tabla cuando i = 0 o j = 0
para i = 0 hasta m c[i,0] = 0 //Caso especial
Y0
para i = 0 hasta n c[0,j] = 0 //Caso especial
X0
43
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
X = ABCB
Y =BDCAB
44
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
X = ABCB
Y =BDCAB
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
45
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
X = ABCB
Y =BDCAB
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
46
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
X = ABCB
Y =BDCAB
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
47
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
X = ABCB
Y =BDCAB
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
48
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
X = ABCB
Y =BDCAB
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
49
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
X = ABCB
Y =BDCAB
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
50
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
X = ABCB
Y =BDCAB
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
51
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
X = ABCB
Y =BDCAB
if(X[i] == Y[j])
L[i,j] = L[i-1,j-1] + 1
else
L[i,j] = max( L[i-1,j] L[i,j-1]]
52
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Cómo encontrar la LCS
Cada c[i,j] depende de c[i-1,j] y c[i,j-1] o bien de c[i-1,j-1].Por lo tanto, a partir del valor c[i,j] se podrá averiguar como se determinó.
● Se comienza en L(m,n).● Si L[i,j] = L[i-1,j-1] + 1 y x[i] = y[j], se guarda x[i] (pertenece LCS).● En otro caso se continúa por max(L[i,j-1], L[i-1,j]).● Si i=0 o j=0 se llegó al principio, se devuelven los caracteres en orden inverso.
53
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
54
An
ális
is d
e al
gori
tmo
s0
8 P
rogr
amac
ión
din
ámic
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez