TRABAJO FINAL ALGORITMOS II: Algoritmos de String Matching Integrantes: Barragán, Ariel Giorda, Mauro Docente: 1 Favre, Liliana SUMARIO Como esta organizada nuestra charla: Introducción a String Matching Objetivos del proyecto y de la aplicación Componentes de la aplicación Herramientas del programa Algoritmos implementados Detalles de diseño Ejemplos utilizando el programa 2 INTRODUCCION String matching es el problema de la búsqueda de ocurrencias de un patrón dentro de una cadena de texto. Su utilidad comprende tanto editores de texto como complejas secuencias de ADN. Un tipo de clasificación posible es: Preprocesamiento Algoritmos Ninguno Patrón Texto Fuerza Bruta Rabin-Karp Autómata Finito Knuth-Morris-Pratt Boyer-Moore Index. Longitud Index. Letra 3 OBJETIVOS 4 COMPONENTES DE LA APLICACIÓN Seguimiento del algoritmo Fuerza Bruta Rabin-Karp Lista de operaciones Visor de estado Esquema de autómata Autómata Finito Información de resultados Knuth-Morris-Pratt Boyer-Moore Index. Longitud Index. Letra Cantidad de ocurrencias Tiempo de procesamiento Comparaciones carácter a carácter 5 HERRAMIENTAS DEL PROGRAMA Herramienta de búsqueda Lista de operaciones Resultados obtenidos Visor de estado Esquema de Autómata 6 ALGORITMO: FUERZA BRUTA MEJORADO Características Pre-procesamiento: ninguno Complejidad: O(n.m) Desplazamiento: siempre uno a la derecha PseudoCodigo Código Pseudo FUERZA-BRUTA(T,P){ n = longitud(T); m= longitud(P); for (s=0; s <= n-m; s++){ j = s; k= 1; while( P[k] == T[j]) if (k == j) cout<< “ocurrencia”<<s; else j++; k++; } 7 } ALGORITMO: RABIN-KARP Características Pre-procesamiento: patrón en O(m) Complejidad: O(n.m) Desplazamiento: siempre uno a la derecha Usa una funcion de Hashing (Rolling hash) Eficiente para patrones múltiples Pseudo Código Pseudo Codigo RABIN-KARP(T,P,d,q){ n = longitud(T); m= longitud(P); p = Hash(P,d,q); t0 = Hash(T[1..m],d,q); for (s=0; s <= n-m; s++){ if (p == ts) if (P[1..m] == T[s..s+m] cout<< “ocurrencia”<< s; ts+1= RollingHash(T[s+1], d,q) } 8 } ALGORITMO: AUTÓMATA FINITO Características Pre-procesamiento: patrón en O(m3|Σ|) Complejidad: O(n) Desplazamiento: siempre uno a derecha Lee cada carácter del texto solo una vez Genera un AF determínistico Pseudo Código Pseudo Codigo A-FINITO-MATCHER(T,P){ n = longitud(T); m = longitud(P); q = 0; for (s=0; s <= n; s++){ q = d(q,T[s]); if (q == m) cout<< “ocurrencia”<< s; } } 9 ALGORITMO: KNUTH-MORRIS-PRATT Características Pre-procesamiento: patrón en O(m) Complejidad: O(n+m) Desplazamiento: siempre uno a derecha Genera una tabla con la función prefijo Reconstruye en la tabla cualquier transición Pseudo Código Pseudo Codigo KNUTH-MORRIS-PRATT(T,P){ n = longitud(T); m = longitud(P); F = FuncionPrefijo(P); q=0; for (i=1;i<=n; i++){ while (q >0 and P[q+1] <> T[i] q = P[q]; if (P[q+1] == T[i]) q=q+1; if (q=m) {cout <<“ocurrencia”<< i-m; q = P[q]; } } 10 } ALGORITMO: BOYER-MOORE Características Pre-procesamiento: patrón en O(m) Complejidad: O(n) en el peor caso y O(n/m) en el mejor Desplazamiento: variable Compara de atrás hacia delante del patrón Utiliza dos funciones para el pre procesado, BadCharacter y GoodSuffix Pseudo Código Pseudo Codigo BOYER-MOORE(T,P, Σ){ n = longitud(T); m = longitud(P); BC[ ] = BadCharacter(P,m,Σ); GS[ ] = GoodSuffix(P,m); q=0; while (q <= n – m){ j = m; while (q >0 and P[q] == T[q + j] q = q – 1; if (j == 0) cout << “ocurrencia”; q = q + GS [0]; else q = q + max ( GS [ j ], j – BC [ T [q+j] ] ); } 11 } Bad-Character. Luego del mismatch con „b‟, se detecta una „b‟ más a la izquierda en el patrón e indica ese desplazamiento. 12 Good-Suffix. Luego del mismatch con „b‟, se encuentra el sufijo „u‟ más a la izquierda en el patrón precedido por „c‟ e indica ese desplazamiento. ALGORITMO: INDEXACIÓN POR LONG. DE PALABRA Características Pre-procesamiento: texto en O(n). Complejidad: según el método elegido para las comparaciones. Desplazamiento: variable Alta eficiencia en textos estáticos Indexa el texto según longitud de las palabras Pseudo Código Pseudo Codigo INDEX-LONGITUD(T,P){ n = longitud(T); m = longitud(P); if(I[] == null) I[] = tablaIndexLONG(T); L[] = I[m]; q = 0; while ( L[q] <= n-m ){ algBusq(T[ L[q]..L[q] + m],P); q++; } 13 } ALGORITMO: INDEXACIÓN POR LETRA Características Pre-procesamiento: texto en O(n) Complejidad: según el método elegido para las comparaciones. Desplazamiento: variable Implementa una variante en el método de indexación Indexa el texto según la posición de cada letra Pseudo Código Pseudo Codigo INDEX-LETRA(T,P){ n = longitud(T); m = longitud(P); if(I[][] == null) I[][] = tablaIndexLETRA(T); L[] = I[ P[1] ]; q = 0; while ( L[q] <= n-m ){ algBusq(T[ L[q]..L[q] + m],P); q++; 14 } DETALLES DE DISEÑO 15 DETALLES DE DISEÑO – CONT. 16