algoritmo

Anuncio
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
Descargar