Documentos de Académico
Documentos de Profesional
Documentos de Cultura
31 de Agosto 2011
Problema: di
El comando di di es un comando de Linux que muestra las diferencias en el contenido de dos textos (equivalente a fc.exe de Windows/DOS) C uando se usa? Se usa, entre otras cosas, para comparar ediciones (versiones) de un mismo archivo C omo compara? El criterio por defecto es buscar l neas comunes a ambos archivos.
Problema: di - Ejemplo
Nueva versi on
/** * main class of diff program */ */ class Diff { /* calculate common lines */ int commonLines(File a, File b) { String contentA = read(a); //fixed String contentB = read(b); ParsedText pA = parse(contentA); ParsedText pB = parse(contentB); int result = LCS.calculate(pA, pB); return result; } }
Versi on original
class Diff { int commonLines(File a, File b) { String contentA = read(b); String contentB = read(b); String[] pA = split(contentA); String[] pB = split(contentB); int result = LCS.calculate(pA, pB); return result; } }
Problema: di
Operaciones de mociaci on Sin operaci on : las l neas comunes Inserci on : las l neas no comunes del nuevo Borrado : las l neas no comunes del original Cu al es el problema? Para hacer una buena comparaci on de archivos, hay que tener un algoritmo que encuentre la mayor cantidad de l neas comunes entre as, las l neas comunes tienen que aparecer con el ambos. Adem m smo orden en ambos archivos.
Problema: di
Generalizaci on A este problema se lo conoce como encontrar la sub-secuencia com un de mayor longitud (o Longest Common Subsequence) Longest Common Subsequence Entrada: dos sequencias (vectores, arreglos) A y B Salida: la longitud de la sub-secuencia com un a A y a B mas larga posible LCS : (T [], T []) int Ejemplos LCS ([X AABBDZ ], [AX AC BDY ]) = 4 LCS ([], [XXYY ]) = 0 LCS ([123456], [123456]) = 6 LCS ([], []) = 3
Problemas, algoritmos y programaci on Programaci on din amica
M as problemas Se calculan las LCS de todos los prejos de A contra todos los prejos de B Entre estos resultados est a la LCS de A y B Si n y m son el tama no de A y B, la cantidad de LCS que se van a calcular son (n + 1)(m + 1) Cada prejo de A se puede identicar con su longitud, que es un n umero del 0 al n. De la misma forma, cada prejo de B se identica con los n umeros del 0 al m. LCS2 : (int , int , T [], T []) int
Prejo 5
class Diff { int commonLines(File a, File b) { String contentA = read(b); String contentB = read(b); String[] pA = split(contentA);
Algunos valores de LCS2 LCS2 (8, 5, nuevo , original ) = 3 LCS2 (4, 1, nuevo , original ) = 1 LCS2 (5, 0, nuevo , original ) = 0 LCS2 (5, 1, nuevo , original ) = 1 LCS2 (6, 2, nuevo , original ) = 2
Problemas, algoritmos y programaci on Programaci on din amica
Caso 1/3 - Base Alguno de los dos prejos tiene longitud 0, entonces la LCS es 0 LCS2 (0, , , ) = 0 LCS2 ( , 0, , ) = 0
Prejo 2
class Diff { int commonLines(File a, File b) {
Prejo 3
class Diff { int commonLines(File a, File b) { String contentA = read(b);
LCS2 (i , j , A, B ) =
Primeras consideraciones Si se dispone de la funci on LCS2 , la funci on LCS se programa muy simplemente La funci on LCS2 se puede programar recursivamente Los argumentos A y B de LCS2 son siempre los mismos Entonces LCS2 se puede programar como una funci on recursiva de dos variables (los prejos i y j ). Los arreglos A y B se pueden considerar como variables globales El caso base de la recursi on es cuando i = 0 o j = 0
i 2, j 1 i 1, j 2
i 1, j 1
Observaci on Este programa calcula todos los valores de la funci on LCS2 en la matriz mem
Problemas, algoritmos y programaci on Programaci on din amica
1, 0
1, 1
1, 2
1, 3
1, 4
1, 5
1, 6
1, m
2, 0 . . . n, 0
2, 1 . . . n, 1
2, 2 . . . n, 2
2, 3 . . . n, 3
2, 4 . . . n, 4
2, 5 . . . n, 5
2, 6 . . . n, 6
. ..
2, m . . . n, m
Recursi on (dependencia) i 1, j 1 i 1, j
C alculo de mem 0, 0 0, m
i, j 1
i, j
n, 0
Programaci on din amica
n, m
Introducci on Programaci on Din amica es una t ecnica para resolver cierto tipo de problemas (como LCS)
Problema Encontrar la menor cantidad de ediciones para llegar de una palabra a otra. Operaciones de edici on Eliminaci on de una letra Inserci on de una letra Substituci on de una letra Ejemplo: gato blanco gato (g b) bato (+ n) banto (+ l) blanto (t c) blanco La distancia de edici on es 4
Edit distance Entrada: dos cadenas A y B Salida: la distancia de Levenshtein entre A y a B LEV : (String , String ) int Una soluci on con programaci on din amica Enfoque similar al usado en LCS Se calculan las distancias de todos los prejos de A a todos los prejos de B LEV2 : (int , int , String , String ) int
i =0j =0 A[i 1] = B [j 1]
A[i 1] = B [j 1]
Observaciones El orden de llenado satisface las dependencias Complejidad temporal: O (n.m), espacial: O (n.m) Se puede lograr complejidad espacial O (n + m)
Problemas, algoritmos y programaci on Programaci on din amica
Observaciones Complejidad temporal: O (n.log (n)) Complejidad espacial: O (n) Se puede aplicar sobre cualquier conjunto con orden total
Problemas, algoritmos y programaci on Programaci on din amica
i , n 1, d )
Observaciones Hay sub-problemas superpuestos d es siempre el mismo Complejidad temporal: O (s .n.d ) y espacial: O (s .n)
Problemas, algoritmos y programaci on Programaci on din amica
Nueva denici on recursiva de C2 C2 (int , int [][], int , int ) int C2 ( , , 2t , t ) = 0 C2 (n, c , m, t ) = minm&2i =2i i =t {c [i ][t ] + C2 (n, c , m 2t , i )} Dependencias de C2 El valor de C2 (n, c , m(S ), t ) depende de los valores de C2 para todos los sub-conjuntos de S Los sub-conjuntos de S se representan con un n umero menor a m(S ) C2 se puede calcular en orden creciente de m(S )
Observaciones Complejidad temporal: O (2n .n2 ), espacial: O (2n .n) Es mejor que la fuerza bruta O (n!), para n = 25 es 1015 veces m as r apido y necesita 1G de memoria.
Problemas, algoritmos y programaci on Programaci on din amica