Title: CC3001 Algoritmos y Estructuras de Datos
1CC3001Algoritmos y Estructuras de Datos
- Diseño y Análisis de Algoritmos Casos de Estudio
2Casos de estudio
- Estudiaremos tres problemas
- Subsecuencia de suma máxima
- Subsecuencia común más larga
- Multiplicación de matrices
3Subsecuencia de suma máxima
- Subsecuencia de suma máxima
- Dados enteros A1, , An (posiblemente negativos),
encontrar el maximo valor de - Si todos los números son negativos, la
subsecuencia de suma máxima es 0
4Subsecuencia de suma máxima
- Ejemplo
- Secuencia -2,11,-4,13,-5,-2
- Respuesta 20
- Veremos cuatro soluciones distintas para este
problema - Primera solución (fuerza bruta)
- Calcular la suma de todas las subsecuencias
- Quedarse con la suma mayor
5Subsecuencia de suma máxima
- Solución 1 Fuerza bruta
- int maxSum 0
- for( i0 ilta.length i)
-
- for( ji jlta.length j)
-
- int thisSum 0
- for (ki kltj k)
- thisSum ak
- if (thisSum gt maxSum)
- maxSum thisSum
-
6Subsecuencia de suma máxima
7Subsecuencia de suma máxima
- Segunda solución (mejora fuerza bruta)
- Notar que
- Por lo tanto, el tercer ciclo for se puede
eliminar
8Subsecuencia de suma máxima
- Solución 2 Mejora a fuerza bruta
- int maxSum 0
- for( i0 ilta.length i)
-
- int thisSum 0
- for (ji jlta.length j)
-
- thisSum aj
- if (thisSum gt maxSum)
- maxSum thisSum
-
9Subsecuencia de suma máxima
- Tiempo O(n2)
- Solución 3 Usando dividir para reinar
- Idea dividir el problema en dos subproblemas del
mismo tamaño - Resolver recursivamente
- Mezclar las soluciones
- Obtener solución final
10Subsecuencia de suma máxima
- Dividiendo el problema
- Subsecuencia de suma máxima puede estar en tres
partes - Primera mitad
- Segunda mitad
- Cruza por el medio ambas mitades
11Subsecuencia de suma máxima
- Dividiendo el problema
- Ejemplo
Primera mitad Segunda mitad
4 -3 5 -2 -1 2 6 -2
12Subsecuencia de suma máxima
- Dividiendo el problema
- Ejemplo
- Suma máxima primera mitad 6
Primera mitad Segunda mitad
4 -3 5 -2 -1 2 6 -2
13Subsecuencia de suma máxima
- Dividiendo el problema
- Ejemplo
- Suma máxima segunda mitad 8
Primera mitad Segunda mitad
4 -3 5 -2 -1 2 6 -2
14Subsecuencia de suma máxima
- Dividiendo el problema
- Ejemplo
- Suma máxima incluyendo último primera mitad 4
- Idem primer elemento segunda mitad 7
- Total 11 (mayor que máximo en ambas mitades)
Primera mitad Segunda mitad
4 -3 5 -2 -1 2 6 -2
15Subsecuencia de suma máxima
- Algoritmo
- Dividir secuencia en dos (izquierda, derecha)
- Resolver recursivamente las mitades
- Caso base secuencia de largo 1
- Calcular suma máxima centro (borde izquierdo
borde derecho) - Retornar maxizquierda, derecha, centro
16Subsecuencia de suma máxima
- Complejidad del algoritmo
- Dos llamadas recursivas de tamaño n/2
- Suma máxima centro O(n)
- Ecuación de recurrencia
17Subsecuencia de suma máxima
- Tiempo O(n log(n))
- Solución 4 Algoritmo eficiente
- Observaciones
- No es necesario conocer donde esta la mejor
subsecuencia - La mejor subsecuencia no puede comenzar en un
número negativo - Cualquier subsecuencia negativa no puede ser
prefijo de la subsecuencia óptima
18Subsecuencia de suma máxima
- Solución 4 Algoritmo eficiente
- Inducción (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 lt 0 se puede
descartar, volver su valor a 0
19Subsecuencia de suma máxima
- Seudocódigo
- int maxSum 0, thisSum 0
- for( j0 jlta.length j)
-
- thisSum aj
- if (thisSum gt maxSum)
- maxSum thisSum
- else if (thisSum lt 0)
- thisSum 0
20Subsecuencia de suma máxima
- Tiempo de la solución eficiente O(n)
21Multiplicación de matrices
- Problema numérico fundamental
- A, B matrices de N x N
- Se desea calcular C A B
22Multiplicación de matrices
- Algoritmo simple
- // A, B matrices de N x N
- int Cnew intNN
- for( int i0 iltn i) // Inicializacion
- for (int j0 jltn j)
- Cij0
- for( int i0 iltn i)
- for (int j0 jltn j)
- for (int k0 kltn k)
- CijAikBkj
23Multiplicación de matrices
- Tiempo algoritmo simple O(N3)
- Por largo tiempo se supuso cota W(N3)
- En los 60, Strassen mostró como romper la
barrera W(N3) - Idea del algoritmo de Strassen
- Dividir cada matriz en cuatro cuadrantes
24Multiplicación de matrices
- Descomposición de ABC en cuatro cuadrantes
25Multiplicación de matrices
- Se realizan 8 multiplicaciones de matrices de N/2
x N/2
26Multiplicación de matrices
- Tiempo O(N3)
- Mejora disminuir número de subproblemas
- Estrategia de Strassen
27Multiplicación de matrices
28Multiplicación de matrices
- Complejidad ahora satisface la recurrencia
29Multiplicación de matrices
- Detalles a considerar
- N no es potencia de 2 (detalle menor)
- En la práctica, algoritmo de Strassen funciona
mejor que el algoritmo simple cuando N es
grande - Numéricamente inestable
- Sin embargo, representa un resultado interesante
desde el punto de vista teórico
30Subsecuencia común más larga
- Problema comparar dos secuencias de ADN
- ADN secuencia de moléculas llamadas bases
- Se puede representar como un string (A, C, G, T)
- Cómo determinar si dos secuencias son similares
- Una es substring de la otra
- Costo de transformar una en otra (distancia
edición) - Encontrar una tercera que se parezca a ambas
31Subsecuencia común más larga
- Definiciones
- Subsecuencia la secuencia con cero o más
elementos dejados fuera - Formalmente
- Z es subsecuencia de X si existe secuencia de
índices creciente de X tal que
32Subsecuencia común más larga
- Definiciones
- Z es subsecuencia común de X e Y si es
subsecuencia de X y de Y - Ejemplos
- Problema encontrar subsecuencia común más larga
(LCS) de X e Y
33Subsecuencia común más larga
- Solución por fuerza bruta
- Enumerar todas las subsecuencias de X
- Chequear cada una si es también subsecuencia de Y
- Guardar la subsecuencia común más larga
- X tiene 2m subsecuencias
- Tiempo O(2m)
34Subsecuencia común más larga
- Idea intentar dividir el problema
- Definición i-ésimo prefijo de X
- Subproblemas de LCS prefijos de X e Y
35Subsecuencia común más larga
- Teorema Subestructura óptima de una LCS
- X (m) e Y (n) secuencias, Z (k) una LCS de X e Y
36Subsecuencia común más larga
- Teorema implica revisar uno o dos subproblemas
- La solución del subproblema es parte de la
solución 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 mn
37Subsecuencia común más larga
- Solución Programación dinámica
- Definición Matriz C de m x n
- Algoritmo llenar tabla en forma bottom-up
38Subsecuencia común más larga
- Implementación
- mX.length-1 nY.length-1 // indices 1 a m,n
- for(i1 iltm i) ci,00
- for(j0 jltn j) c0,j0
- for(i1 iltm i)
- for(j1 jltn j)
- if (XiYj)
- ci,jci-1,j-11 bi,j\
- else if (ci-1,jgtci,j-1)
- ci,jci-1,j bi,j
- else
- ci,jci-1,j bi,j-
- return c,b
39Subsecuencia común más larga
- Ejemplo
- Para imprimir LCS
- void LCS(b,X,i,j)
- if (i0 j0)
- return
- if (bi,j\)
- LCS(b,X,i-1,j-1)
- print(Xi)
- else if (bi,j)
- LCS(b,X,i-1,j)
- else \\ -
- LCS(b,X,i,j-1)
-
40Selección del k-ésimo
- Selección (k-ésimo)
- Problema dado un arreglo desordenado encontrar
el k-ésimo del conjunto - Determinar mínimo o máximo O(n) (cota mínima)
- Supongamos una especie de torneo entre elementos,
x es el primero (máximo) - El segundo puede ser cualquiera de los que
perdieron directamente con x
41Selección del k-ésimo
- Luego, para calcular segundo, tercero, , toman
tiempo - Segundo nlog2n
- Tercero n2log2n
-
- k n(k-1)log2n
- Esto está bien para k constante, pero para un k
genérico (como la mediana) - kn/2 O(n log n)
42Selección 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 más allá de la posición k, sólo
se ordena la parte izquierda - Si el pivote estaba en la posición k, lo
encontramos de inmediato
43Selección del k-ésimo
- Seudocódigo
- Quickselect(S,k)
-
- Sea p en S
- S1 x en S, x lt p
- S2 x en S, x gt p
- Si k lt S1 return Quickselect(S1,k)
- Si k S11 return p
- return Quickselect(S2, k-S1-1)
44Selección del k-ésimo
- Peor caso O(n2) (mala elección del pivote)
- Caso promedio O(n)
- En la práctica este algoritmo es muy rápido, pero
su peor caso es pésimo - Uno quisiera asegurar una garantía de orden
lineal para encontrar el k-ésimo - Idea buscar un pivote tal que deje fuera por lo
menos una fracción fija del total de elementos
45Selección del k-ésimo
- Método de selección lineal
- Dividir S en S/5 conjuntos (cada Si contiene 5
elementos) - Obtener las medianas m1, m2,
- Obtener pSelect(mi, (S/5)/2) (mediana de las
medianas)
46Selección del k-ésimo
- Características 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) - 3 elementos son menores que p
- De los grupos con medianas mayores
- 3 elementos son mayores que p
- Esto implica que 3/10 elementos son menores que p
y que 3/10 son mayores que p
47Selección del k-ésimo
- El pivote p sólo 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 - Cálculo de mi y particiones cálculo de mediana
de medianas recursión sobre (7/10)n restantes
48Selección del k-ésimo
49Selección del k-ésimo
- La elección de 5 elementos para los grupos Si se
debe a que - Este número 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 números muy grandes de elementos calcular
las medianas toma tiempo mayor