Sunteți pe pagina 1din 4

Implementacion de strstr

Tambin un algoritmo muy famoso es buscar una cadena dentro de otra, la forma mas comn de hacerlo es simplemente comparar caracter por caracter hasta encontrar la cadena, sin embargo, se han desarrollado algoritmos ms eficientes, ya sea en velocidad o en tamao y otros que dependen del tipo de aplicacin que se realice, as que no es posible determinar si uno es mejor que otro (en trminos generales). una implementacin bsica de strstr aqu: Este algoritmo es el ms ineficiente, porque necesita comparar todos los caracteres de la subcadena por cada caracter de la cadena principal, por ejemplo al buscar "pajaro" en...

mas vale pajaro en mano pajaro pajaro pajaro pajaro pajaro pajaro pajaro pajaro pajaro pajaro

como pudimos ver, hicimos 10 llamadas a strcmp

Boyer-Moore
Este algoritmo se basa en construir una lista 'delta' para as saber cuantos caracteres desplazarse en la busqueda, as que si buscamos la cadena "cien" dentro de la otra cadena "Mas vale un ya que cien despues se hara", obtendremos los siguientes desplazamientos...
Mas vale un ya que cien despues se hara cien cien cien cien cien cien cien

la tabla delta se inicia de esta manera...

1. 2. 3. 4.
5.

const char *cadena = "cien"; size_t delta[UCHAR_MAX]; size_t lngcad = strlen(cadena); unsigned long int i; for (i = 0; i < UCHAR_MAX; i++) delta[i] = lngcad; /* todos por default */ for (i = 0; i < lngcad; i++) delta[cadena[i]] = lngcad - i - 1; /* sacamos los

6. 7.
8.

9. 10.

desplazamientos */

con esta tabla delta sabremos cuanto desplazarnos, para as hacer mas eficiente la busqueda, la tabla delta en sus valores ms significativos tendr (asumiendo ASCII)
delta[ 99] delta[105] delta[101] delta[110] = = = = 3 2 1 0 // // // // c i e n = = = = 99 105 101 110

as por ejemplo cuando llegamos a la comparacin


Mas vale un ya que cien despues se hara cien

la comparacion termin en un espacio (el espacio despues del "Mas"), como delta[' '] tiene un valor de 4 nos desplazamos 4 posiciones y comparamos de nuevo...
Mas vale un ya que cien despues se hara cien cien

aqu la comparacin termin en 'e' (la 'e' de "vale"), como delta['e'] tiene un valor de 1 nos desplazamos solo 1 caracter...
Mas vale un ya que cien despues se hara cien cien cien

y volvemos a comparar, de esta forma, nunca pasaremos de largo la cadena "cien" si esque se encuentra en la otra cadena, esto se explica cuando llegamos a...
Mas vale un ya que cien despues se hara cien cien cien

cien cien cien

como la comparacin termin en la 'i' y delta['i'] tiene un valor de 2, nos desplazamos 2 elementos y comparamos...
Mas vale un ya que cien despues se hara cien cien cien cien cien cien cien

y ya encontramos la cadena, como pudiste ver, es una forma de buscar ms rapido que comparar caracter por caracter, ya que solo necesitamos 7 comparaciones, ademas en esas 7 comparaciones podemos comparar nada ms 1 solo caracter para evitar tener que comparar toda la cadena. El programa completo esta en boyermoore.c, solo que la implementacin puede mejorarse para no usar una tabla, porque es posible que en un entorno un char tenga una longitud de 16 bits, por lo cual, estaremos usando una tabla de 65535 elementos de los cuales es muy probable que no usaremos ni el 50% de ellos, aqu la mejora xboyermoore.c

Knuth-Morris-Pratt
Este algoritmo se basa en construir una tabla de repeticiones de la sub-cadena a buscar, as que la cadena "ABCDE" estar relacionada a la tabla siguiente...
x[0]=-1 x[1]=0 x[2]=0 x[3]=0 x[4]=0 a b c d e

(el -1 es para estado inicial) de esta manera podemos saber que tantos caracteres repetidos tiene la sub-cadena, y la cadena "AAAAA" tendr
x[0]=-1 x[1]=0 x[2]=1 x[3]=2 x[4]=3 a a a a a

esta tabla nos da una idea de cuantos caracteres debemos de desplazarnos si los caracteres a comparar son diferentes los caracteres comparados con anterioridad

definen el nmero de caracteres a desplazarse, por ejemplo, al buscar "pajaro" en "mas vale pajaro en mano" se realizarn las sig. comparaciones
mas vale pajaro en mano p p p p p p p p p pajaro

la cadena pajaro tiene una tabla asociada de...


x[0]=-1 x[1]=0 x[2]=0 x[3]=0 x[4]=0 x[5]=0 p a j a r o

Sin embargo si usramos "aaaa" la comparacin aumenta en 1 por cada caracter no encontrado, as que se compararan 5 veces ms, porque "mas vale pajaro en mano" tiene 5 letras 'a' A los peores casos se les llama cuando las condiciones no estn a favor del algoritmo, por ejemplo, para este algoritmo un peor caso ser buscar la palabra "AAAAA" en la cadena "AAAABAAAABAAAAA" ya que resultara en muchas comparaciones intiles antes de llegar con las ultimas 'A' Este algoritmo garantiza que el rendimiento ser mejor para los mejores casos y peor para los peores casos, sin embargo, el algoritmo boyermoore es ms rapido en sus peores casos, y ms lento en sus casos ms favorables, una diferencia muy comn cuando se comparan algoritmos. el codigo del algoritmo aqu kmps.c Donde m es la longitud de la subcadena y n es la del texto en donde buscar...
(Tiempos) Crear tablas Comparacin(Peor Caso) Boyer-Moore Knuth-Morris O(m) O(m) Comparacin(Mejor Caso)

O(n/m) O(n)

O(n) O(n)

S-ar putea să vă placă și