Sie sind auf Seite 1von 49

CC3001

Algoritmos y Estructuras
de Datos
Diseo y Anlisis de Algoritmos: Casos de
Estudio

Casos de estudio

Estudiaremos tres problemas

Subsecuencia de suma mxima


Subsecuencia comn ms larga
Multiplicacin de matrices

Subsecuencia de suma
mxima

Subsecuencia de suma mxima

Dados enteros A1, , An (posiblemente


negativos), encontrar el maximo valor de

A
k i

Si todos los nmeros son negativos, la


subsecuencia de suma mxima es 0
3

Subsecuencia de suma
mxima

Ejemplo:

Secuencia: -2,11,-4,13,-5,-2
Respuesta: 20

Veremos cuatro soluciones distintas para


este problema
Primera solucin (fuerza bruta):

Calcular la suma de todas las subsecuencias


Quedarse con la suma mayor

Subsecuencia de suma
mxima

Solucin 1: Fuerza bruta


int maxSum = 0;
for( i=0; i<a.length; i++)
{
for( j=i; j<a.length; j++)
{
int thisSum = 0;
for (k=i; k<=j; k++)
thisSum += a[k];
if (thisSum > maxSum)
maxSum = thisSum;
}
}

Subsecuencia de suma
mxima

Tiempo: O(n3)

n 3n 2n
1

6
i 0 j i k i
n 1 n 1

Subsecuencia de suma
mxima

Segunda solucin (mejora fuerza bruta)

Notar que

Por lo tanto, el tercer ciclo for se puede eliminar

Subsecuencia de suma
mxima

Solucin 2: Mejora a fuerza bruta


int maxSum = 0;
for( i=0; i<a.length; i++)
{
int thisSum = 0;
for (j=i; j<=a.length; j++)
{
thisSum += a[j];
if (thisSum > maxSum)
maxSum = thisSum;
}
}

Subsecuencia de suma
mxima

Tiempo: O(n2)
Solucin 3: Usando dividir para reinar

Idea: dividir el problema en dos subproblemas


del mismo tamao
Resolver recursivamente
Mezclar las soluciones
Obtener solucin final

Subsecuencia de suma
mxima

Dividiendo el problema

Subsecuencia de suma mxima puede estar en


tres partes:

Primera mitad
Segunda mitad
Cruza por el medio ambas mitades

10

Subsecuencia de suma
mxima

Dividiendo el problema

Ejemplo:
Primera mitad

Segunda mitad

4 -3 5 -2

-1 2 6 -2

11

Subsecuencia de suma
mxima

Dividiendo el problema

Ejemplo:
Primera mitad

Segunda mitad

4 -3 5 -2

-1 2 6 -2

Suma mxima primera mitad: 6

12

Subsecuencia de suma
mxima

Dividiendo el problema

Ejemplo:
Primera mitad

Segunda mitad

4 -3 5 -2

-1 2 6 -2

Suma mxima segunda mitad: 8

13

Subsecuencia de suma
mxima

Dividiendo el problema

Ejemplo:
Primera mitad

Segunda mitad

4 -3 5 -2

-1 2 6 -2

Suma mxima incluyendo ltimo primera mitad: 4


Idem primer elemento segunda mitad: 7
Total: 11 (mayor que mximo en ambas mitades)
14

Subsecuencia de suma
mxima

Algoritmo:

Dividir secuencia en dos (izquierda, derecha)


Resolver recursivamente las mitades

Caso base: secuencia de largo 1

Calcular suma mxima centro (borde izquierdo +


borde derecho)
Retornar max{izquierda, derecha, centro}

15

Subsecuencia de suma
mxima

Complejidad del algoritmo:

Dos llamadas recursivas de tamao n/2


Suma mxima centro: O(n)
Ecuacin de recurrencia:

16

Subsecuencia de suma
mxima

Tiempo: O(n log(n))


Solucin 4: Algoritmo eficiente

Observaciones:

No es necesario conocer donde esta la mejor


subsecuencia
La mejor subsecuencia no puede comenzar en un
nmero negativo

Cualquier subsecuencia negativa no puede ser prefijo de


la subsecuencia ptima

17

Subsecuencia de suma
mxima

Solucin 4: Algoritmo eficiente

Induccin (reforzada)

Se conoce la mejor subsecuencia entre 1 y j


Se conoce la mejor subsecuencia que termina en j

Algoritmo

Se almacenan ambos valores (inicialmente 0)


Se incrementa j en 1
Se actualiza mejor subsecuencia si es necesario
Si subsecuencia que termina en j es < 0 se puede
descartar, volver su valor a 0
18

Subsecuencia de suma
mxima

Seudocdigo
int maxSum = 0, thisSum = 0;
for( j=0; j<a.length; j++)
{
thisSum += a[j];
if (thisSum > maxSum)
maxSum = thisSum;
else if (thisSum < 0)
thisSum = 0;
}

19

Subsecuencia de suma
mxima

Tiempo de la solucin eficiente: O(n)

20

Multiplicacin de matrices

Problema numrico fundamental


A, B matrices de N x N
Se desea calcular C = A * B

21

Multiplicacin de matrices

Algoritmo simple:
// A, B: matrices de N x N
int[][] C=new int[N][N];
for( int i=0; i<n; i++) // Inicializacion
for (int j=0; j<n; j++)
C[i][j]=0;
for( int i=0; i<n; i++)
for (int j=0; j<n; j++)
for (int k=0; k<n; k++)

C[i][j]+=A[i][k]*B[k][j];
22

Multiplicacin de matrices

Tiempo algoritmo simple: O(N3)


Por largo tiempo se supuso cota (N3)
En los 60, Strassen mostr como romper la
barrera (N3)
Idea del algoritmo de Strassen:

Dividir cada matriz en cuatro cuadrantes

23

Multiplicacin de matrices

Descomposicin de AB=C en cuatro


cuadrantes

24

Multiplicacin de matrices

Se realizan 8 multiplicaciones de matrices de


N/2 x N/2

25

Multiplicacin de matrices

Tiempo: O(N3)
Mejora: disminuir nmero de subproblemas
Estrategia de Strassen:

26

Multiplicacin de matrices

Respuesta final:

27

Multiplicacin de matrices

Complejidad ahora satisface la recurrencia

28

Multiplicacin de matrices

Detalles a considerar:

N no es potencia de 2 (detalle menor)


En la prctica, algoritmo de Strassen funciona
mejor que el algoritmo simple cuando N es
grande
Numricamente inestable

Sin embargo, representa un resultado


interesante desde el punto de vista terico

29

Subsecuencia comn ms
larga

Problema: comparar dos secuencias de ADN

ADN: secuencia de molculas llamadas bases


Se puede representar como un string (A, C, G, T)

Cmo determinar si dos secuencias son


similares

Una es substring de la otra


Costo de transformar una en otra (distancia
edicin)
Encontrar una tercera que se parezca a ambas
30

Subsecuencia comn ms
larga

Definiciones

Subsecuencia: la secuencia con cero o ms


elementos dejados fuera
Formalmente:

Z es subsecuencia de X si existe secuencia de


ndices creciente de X tal que

31

Subsecuencia comn ms
larga

Definiciones

Z es subsecuencia comn de X e Y si es
subsecuencia de X y de Y
Ejemplos:

Problema: encontrar subsecuencia comn


ms larga (LCS) de X e Y
32

Subsecuencia comn ms
larga

Solucin por fuerza bruta:

Enumerar todas las subsecuencias de X


Chequear cada una si es tambin subsecuencia
de Y
Guardar la subsecuencia comn ms larga

X tiene 2m subsecuencias
Tiempo: O(2m)

33

Subsecuencia comn ms
larga

Idea: intentar dividir el problema


Definicin: i-simo prefijo de X

Subproblemas de LCS: prefijos de X e Y

34

Subsecuencia comn ms
larga

Teorema: Subestructura ptima de una LCS

X (m) e Y (n) secuencias, Z (k) una LCS de X e Y

35

Subsecuencia comn ms
larga

Teorema implica revisar uno o dos


subproblemas
La solucin del subproblema es parte de la
solucin final (ptima)
Nota: Encontrar LCS de casos (2) y (3) del
Teorema implica calcular LCS de Xm-1 e Yn-1

Muchos subproblemas comparten otros


subproblemas
Total subproblemas distintos: m*n
36

Subsecuencia comn ms
larga

Solucin: Programacin dinmica


Definicin: Matriz C de m x n

Algoritmo: llenar tabla en forma bottom-up

37

Subsecuencia comn ms
larga

Implementacin:
m=X.length-1; n=Y.length-1; // indices 1 a m,n
for(i=1; i<=m; i++) c[i,0]=0;
for(j=0; j<=n; j++) c[0,j]=0;
for(i=1; i<=m; i++)

for(j=1; j<=n; j++)


if (X[i]==Y[j]){
c[i,j]=c[i-1,j-1]+1; b[i,j]=\;}
else if (c[i-1,j]>=c[i,j-1]){
c[i,j]=c[i-1,j]; b[i,j]=|}
else{
c[i,j]=c[i-1,j]; b[i,j]=-}

return {c,b};
38

Subsecuencia comn ms
larga

Ejemplo:

Para imprimir LCS

void LCS(b,X,i,j){
if (i==0 || j==0)
return;
if (b[i,j]==\){
LCS(b,X,i-1,j-1);
print(X[i]);}
else if (b[i,j]==|)
LCS(b,X,i-1,j);
else \\ -
LCS(b,X,i,j-1);
}

39

Seleccin del k-simo

Seleccin (k-simo)

Problema: dado un arreglo desordenado


encontrar el k-simo del conjunto

Determinar mnimo o mximo: O(n) (cota


mnima)
Supongamos una especie de torneo entre
elementos, x es el primero (mximo)
El segundo puede ser cualquiera de los que
perdieron directamente con x
40

Seleccin del k-simo

Luego, para calcular segundo, tercero, ,


toman tiempo:

Segundo: n+log2n

Tercero: n+2log2n

k: n+(k-1)log2n

Esto est bien para k constante, pero para un


k genrico (como la mediana)

k=n/2: O(n log n)


41

Seleccin del k-simo

Quickselect

Se basa en el tipo de operaciones de quicksort


Se escoge pivote al azar
Se particiona el arreglo de acuerdo al pivote
escogido
Si el pivote cae ms all de la posicin k, slo se
ordena la parte izquierda
Si el pivote estaba en la posicin k, lo
encontramos de inmediato
42

Seleccin del k-simo

Seudocdigo
Quickselect(S,k)
{
Sea p en S
S1 = {x en S, x < p}
S2 = {x en S, x > p}
Si k <= |S1| return Quickselect(S1,k)
Si k = |S1|+1 return p
return Quickselect(S2, k-|S1|-1)
}
43

Seleccin del k-simo

Peor caso: O(n2) (mala eleccin del pivote)


Caso promedio: O(n)
En la prctica este algoritmo es muy rpido,
pero su peor caso es psimo
Uno quisiera asegurar una garanta de orden
lineal para encontrar el k-simo
Idea: buscar un pivote tal que deje fuera por
lo menos una fraccin fija del total de
elementos
44

Seleccin del k-simo

Mtodo de seleccin lineal

Dividir S en |S/5| conjuntos (cada Si contiene 5


elementos)
Obtener las medianas m1, m2,
Obtener p=Select({mi}, (|S|/5)/2) (mediana de las
medianas)

45

Seleccin del k-simo

Caractersticas de p

Mayor que la mitad de las medianas


Menor que la otra mitad de las medianas
De los grupos con medianas menores (que fueron
obtenidas de entre 5 elementos)

De los grupos con medianas mayores

3 elementos son menores que p


3 elementos son mayores que p

Esto implica que 3/10 elementos son menores


que p y que 3/10 son mayores que p
46

Seleccin del k-simo

El pivote p slo puede ser mayor que el 3/10


menor y menor que el 3/10 mayor de S

En el peor caso habr que buscar recursivamente


en un grupo con 7/10 de los elementos

n
7
T n n T T
n
5
10

Clculo de mi y particiones + clculo de mediana


de medianas + recursin sobre (7/10)n restantes
47

Seleccin del k-simo

Suponiendo solucin O(n)

dn 7
T n dn T n n
dn dn
5 10

d 10 T n O n
48

Seleccin del k-simo

La eleccin de 5 elementos para los grupos


Si se debe a que:

Este nmero debe ser impar para obtener


mediana exacta
Debe ser mayor o igual a 5 para asegurar
linealidad del algoritmo

Se escoge 5 porque:

Mediana de medianas queda muy a la mitad


Para nmeros muy grandes de elementos
calcular las medianas toma tiempo mayor
49

Das könnte Ihnen auch gefallen