09 programación dinámica - edgardo a....

54
Tema 08: Programación dinámica 1 Análisis de algoritmos M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com [email protected] @edfrancom edgardoadrianfrancom

Upload: others

Post on 23-Mar-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

Tema 08: Programación dinámica

1

Análisis de algoritmos

M. en C. Edgardo Adrián Franco Martínez http://[email protected]

@edfrancom edgardoadrianfrancom

Page 2: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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

Page 3: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 4: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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.

Page 5: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 6: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 7: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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.

Page 8: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

𝚶(𝒄𝒏)

Page 9: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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))

Page 10: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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).

Page 11: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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.

Page 12: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 13: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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.

Page 14: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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)

Page 15: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 16: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 17: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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)

𝚶(𝒏)

Page 18: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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)

𝚶(𝒏)

Page 19: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 20: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

“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

Page 21: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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

Page 22: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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.

Page 23: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 24: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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 𝑛𝑘

=𝑛!

𝑘! 𝑛−𝑘 !

Page 25: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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

}

Page 26: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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)

Page 27: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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

Page 28: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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)

Page 29: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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

Page 30: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 31: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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

Page 32: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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

Page 33: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 34: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 35: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

● 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

Page 36: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 37: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

• 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

Page 38: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 39: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 40: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

● 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

Page 41: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 42: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 43: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 44: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 45: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 46: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 47: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 48: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 49: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 50: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 51: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 52: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 53: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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

Page 54: 09 Programación dinámica - Edgardo A. Francoeafranco.com/docencia/analisisdealgoritmos/files/08/Tema08.pdf7 oritmos a z •En general, se pueden resolver problemas con subestructuras

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