Вы находитесь на странице: 1из 14

ALGORITMOS DE CUERDAS DE

LA BUSQUEDA: CAPTULO 10
Ricardo A. Baeza-Yates
Departamento de Ciencias de la Computacin, Universidad de Chile,
Casilla 2777, Santiago, Chile
Resumen.
Hacemos un estudio de varios algoritmos para la bsqueda de una
cadena en un texto. Se incluyen los resultados tericos y empricos, as
como el cdigo real de cada algoritmo. Una extensa bibliografa tambin
se incluye.
10.1 INTRODUCCIN
Bsqueda de cuerdas es un componente importante de muchos
problemas, entre ellos la edicin de texto, recuperacin de datos, y
manipulacin de smbolos. A pesar de la utilizacin de ndices para la
bsqueda de grandes cantidades de texto, bsqueda de cadenas puede
ayudar en un sistema de recuperacin de informacin. Por ejemplo,
puede ser utilizado para el filtrado de potencial partidos o para buscar
trminos de recuperacin que se destacan en la salida.
La bsqueda de cuerda o cadena coincidente problema consiste en
encontrar todos los sucesos (o la primera aparicin) de un patrn en un
texto, en el que el patrn y el texto son las cadenas sobre algn alfabeto.
Estamos interesados en la presentacin de informes de todas las
ocurrencias. Es bien sabido que para buscar un patrn de longitud m en
un texto de longitud n (donde n> m) el tiempo de bsqueda es 0 (n) en el
peor de los casos (para m fijo). Adems, en el peor de los casos, por lo
menos n - m + 1 caracteres deben ser inspeccionados. Este resultado se
debe a Rivest (1977). Sin embargo, para los diferentes algoritmos de la
constante en el trmino lineal puede ser muy diferente. Por ejemplo, en
el peor de los casos, el mltiplo constante en el algoritmo ingenuo es m,
mientras que para la de Knuth-Morris-Pratt (1977) algoritmo es dos.
Se presentan los algoritmos ms importantes para la cadena coincidente:
el algoritmo de fuerza bruta o ingenuo, el (1977) del algoritmo de Knuth-
Morris-Pratt, distintas variantes del algoritmo de Boyer-Moore (1977), el
Shift-o algoritmo de Baeza-Yates y Gonnet (1989), y la Karp-Rabin
(1987) algoritmo, que es probabilstica. Los resultados experimentales de
texto al azar y una muestra de texto Ingls estn incluidos. Se revisan
tambin los principales resultados tericos para cada algoritmo.
Aunque slo cubrimos la bsqueda de cuerdas, se dan referencias para
problemas relacionados. Utilizamos el lenguaje de programacin C
descrito por Kernighan y Ritchie (1978) para presentar nuestros
algoritmos.
10.2 PRELIMINARES
Nosotros usamos la siguiente notacin:
n: la longitud del texto
m: la longitud del patrn (cadena).
C: el tamao del alfabeto *.

: El nmero esperado de comparaciones realizadas por un algoritmo


mientras que la bsqueda en el patrn de un texto de longitud n.

Los resultados tericos se dan para el peor nmero de los casos de las
comparaciones, y el nmero medio de comparaciones entre un carcter
en el texto y un carcter en el patrn (comparaciones de patrones de
texto) al encontrar todas las apariciones del patrn en el texto, donde el
promedio es tomado de manera uniforme con respecto a cadenas de
longitud n sobre un alfabeto finito dado.
Citando Knuth et al. (1977). "Se podra argumentar que, en promedio
asumir cadenas aleatorias es de poco inters, ya que un usuario rara vez
se busca en una cadena aleatoria. Sin embargo, este modelo es una
aproximacin razonable si tenemos en cuenta los fragmentos de texto
que no contienen el patrn, y el algoritmo, obviamente, debe comparar
cada carcter del texto en los lugares donde se produce el patrn".
Nuestros resultados experimentales muestran que este es el caso.
Los datos empirical, para casi todos los algoritmos, se compone de los
resultados para dos tipos de texto: texto aleatorio y texto Ingls. Las dos
funciones de coste que medimos fueron el nmero de comparaciones
realizadas entre un carcter en el texto y un carcter en el patrn, y el
tiempo de ejecucin. Para determinar el nmero de comparaciones, se
realizaron 100 carreras. El tiempo de ejecucin se midi durante la
bsqueda l, 000 patrones. En cada caso, se consideraron los patrones de
longitudes de 2 a 20.
En el caso de texto al azar, el texto era de longitud 40.000, y tanto el
texto como el patrn se eligieron de manera uniforme y aleatoriamente
de un alfabeto de tamao c. Alfabetos de tamao c = 4 (bases de ADN) y
c = 30 (aproximadamente el nmero de letras en ingls en minsculas) se
consideraron.
Para el caso de texto Ingls se utiliz un documento de
aproximadamente 48.000 caracteres, con los patrones escogidos al azar
de palabras dentro del texto de una manera tal que un patrn era siempre
un prefijo de una palabra (bsquedas tpicos). El alfabeto utilizado fue el
conjunto de letras en minscula, algunos dgitos y signos de puntuacin,
dando 32 caracteres. No se consideraron las bsquedas fallidas, porque
esperamos bsquedas sin xito para ser ms rpido que las bsquedas
successfu1 (menos comparaciones de media). Los resultados para el
texto de Ingls no son estadsticamente significativas, porque slo se
utiliz una muestra de texto. Sin embargo, muestran la correlacin de
buscar patrones extrados del mismo texto, y esperamos que otras
muestras de texto Ingls den resultados similares. Nuestros resultados
experimentales estn de acuerdo con los presentados por Davies y
Bowsher (1986) y Smit (1982).
Definimos una cadena aleatoria de longitud p como una cadena construida
como la concatenacin de caracteres elegidos independientemente y de
manera uniforme desde. Es decir, la probabilidad de que dos caracteres en
igualdad de condiciones es 1 / c. Nuestro modelo de texto aleatorio es similar
a la utilizada en Knuth et al. (1977) y Schaback (1988).
Por ejemplo, la probabilidad de encontrar una coincidencia entre un
texto al azar de longitud m y un patrn aleatorio de longitud m es:
...
El nmero esperado de partidos de un patrn aleatorio de longitud m en un
texto aleatoria de longitud n es:
...
10.3 ALGORITMO NAIVE
La fuerza ingenua o bruta, el algoritmo es el mtodo ms simple coincidencia
de cadenas. La idea consiste en tratar de igualar cualquier subcadena de
longitud m en el texto con el patrn (vase la Figura 10.1).
...
Figura 10.1: El algoritmo de coincidencia vigor cadena ingenuo o
bruta
Sec. 10.3. El algoritmo Naive.
El nmero esperado de comparaciones de patrones de texto realizadas por el algoritmo de
fuerza bruta ingenua o cuando se busca con un patrn de longitud m en un texto de longitud
n (n> = m) viene dada por Baeza-Yates (1989c) como:
...
Este es drsticamente diferente de la peor de los casos MN.
10.4 LA KNUTH-MORRIS-PRATT
ALGORITMO
El clsico Knuth, Morris, y Pratt (1977) algoritmo, descubierto en 1970,
es el primer algoritmo para el que el factor constante en el trmino lineal,
en el peor de los casos, no depende de la longitud del patrn. Se basa en
el patrn de preprocesamiento en tiempo O (m). De hecho, el nmero
esperado de comparaciones realizadas por este algoritmo (tiempo de
bsqueda slo) est delimitada por:
...
La idea bsica detrs de este algoritmo es que cada vez que se detecta una discrepancia, la
"salida en falso" se compone de personajes que ya hemos examinado. Podemos tomar
ventaja de esta informacin en lugar de repetir las comparaciones con los personajes
conocidos. Por otra parte, siempre es posible disponer el algoritmo de modo que el puntero
en el texto nunca se decrementa. Para lograr esto, el patrn se preprocesa para obtener una
tabla que da la siguiente posicin en el patrn para ser procesado despus de una falta de
coincidencia.
La definicin exacta de este cuadro (. Llamada siguiente en Knuth et al [1977]) es:
...
para j = 1,. . . , M. En otras palabras, consideramos el prefijo
acoplamiento mximo del modelo de manera que el siguiente carcter en
el patrn es diferente del carcter del patrn que caus la falta de
coincidencia. Este algoritmo se presenta en la Figura 10.2.
Ejemplo 1La siguiente tabla para el abracadabra patrn es:
...
Cuando el valor en la siguiente tabla es cero, tenemos que avanzar una
posicin en el texto y empezar a comparar de nuevo desde el principio
del patrn. El ltimo valor de la mesa de al lado (cinco) se utiliza para
continuar la bsqueda despus de que se ha encontrado una coincidencia.
En el peor de los casos, el nmero de comparaciones es 2 n + o (m). Una
explicacin ms detallada de cmo procesar previamente el patrn en
tiempo O (m) para obtener esta tabla se puede encontrar en el documento
original o en Sedgewick (1983, vase
Figura 10.3).
Cadena Buscando Algortihms.
...
...
Figura 10.3: pre-procesamiento del patrn en el algoritmo de
Knuth-Morris-Pratt
Sec. 10.4 El knuth-Morris-Pratt Algoritmo
Un algoritmo para la bsqueda de un conjunto de cuerdas, similar al
algoritmo KMP, fue desarrollado por Aho y Corasick (1975). Sin
embargo, el espacio utilizado y el tiempo de procesamiento previo para
buscar una cadena se mejora en el algoritmo KMP. Las variaciones que
calculan la mesa de al lado "sobre la marcha" son presentados por Barth
(1981) y Takaoka (1986). Variaciones para la Aho y Corasick algoritmo
se presentan por Bailey y Dromey (1980) y Meyer (1985).
10.5 LA BOYER-MOORE
ALGORITMO
Tambin en 1977, el otro algoritmo clsico fue publicado por Boyer y
Moore (1977). Su idea principal es la bsqueda de derecha a izquierda en
el patrn. Con este esquema, la bsqueda es ms rpido que el promedio.
El algoritmo de Boyer-Moore (BM) posiciona el patrn a lo largo de los
caracteres ms a la izquierda en el texto y los intentos de igualar de
derecha a izquierda. Si no se produce la falta de coincidencia, a
continuacin, se ha encontrado el patrn. De lo contrario, el algoritmo
calcula un cambio; es decir, se lleva a cabo una cantidad en la que el
patrn se mueve a la derecha antes de un nuevo intento de juego.
El cambio se puede calcular utilizando dos heursticos: la heurstica
partido y el heursticas ocurrencia. La heurstica partido se obtiene
observando que cuando el patrn se mueve a la derecha, se debe
1. Emparejar a todos los personajes previamente emparejados, y
2. Traer un carcter diferente a la posicin en el texto que caus la falta de coincidencia.
La ltima condicin se menciona en el documento de Boyer-Moore (1977),
pero se introdujo en el algoritmo por Knuth et al. (1977). Tras la posterior
consulta, llamamos a la mesa de cambio de dd original, y el mejorado dd
versin. Las definiciones formales son:
...
Ejemplo 2La tabla dd para el abracadabra patrn es
...
El hueristic ocurrencia se obtiene observando que hay que alinear la posicin
en el texto que caus la falta de coincidencia con el primer carcter del patrn
que coincida con l. Llamando Formalmente esta tabla d, se tiene:
Cadena Buscando algoritms
...
para cada smbolo x en el alfabeto. Vea la Figura 10.4 para el cdigo para
calcular ambas tablas (es decir, dd y d) a partir del patrn.
...
Figura 10.4: El algoritmo de Boyer-Moore
Ejemplo 3La tabla d para el abracadabra patrn es
...
y el valor de cualquier otro personaje es 11.
Ambos cambios pueden ser precalculados basado nicamente en el patrn y el
alfabeto. Por lo tanto, el espacio necesario es m + C + O (1). Teniendo en
cuenta estas dos funciones de cambio, el algoritmo elige el ms grande. La
misma estrategia de cambio se puede aplicar despus de un partido. En Knuth
et al. (1977) el preprocesamiento del patrn se muestra a
ser lineal en el tamao del patrn, como lo es para el algoritmo KMP. Sin
embargo, su algoritmo es incorrecta. La versin corregida se puede encontrar
en el documento de Rytter (1980; vase la Figura 10.5).
...
Figura 10.5: Preprocesamiento del patrn en el algoritmo de
Boyer-Moore
Knuth et al. (1977) han demostrado que, en el peor de los casos, el nmero de
comparaciones es O (n + rm), donde r es el nmero total de partidos. Por lo
tanto, este algoritmo puede ser tan malo como el algoritmo ingenuo cuando
tenemos muchos partidos, a saber, (n) Partidos. Una prueba alternativa ms
simple se puede encontrar en un documento por Guibas y Odlyzko (1980). En
el mejor de los casos C n = N / m. Nuestros resultados de la simulacin
concuerdan bien con los resultados emprical y tericos en el papel de Boyer-
Moore original, (1977). Algunos experimentos en un entorno distribuido se
presentan por Moller-Nielsen y Straunstrup (1984). Una variante del
algoritmo BM cuando m es similar a N est dada por Iyengar y Alia (1980).
Los algoritmos de tipo Boyer-Moore para buscar un conjunto de cadenas son
presentados por Commentz-Walter (1979) y Baeza-Yates y Regnier (1990).
Para mejorar el peor de los casos, Galil (1979) modifica el algoritmo de forma
que recuerda cuntos caracteres superpuestos que puede tener entre dos
partidos consecutivos. Es decir, se calcula la longitud, l, del prefijo ms largo
adecuado que tambin es un sufijo del patrn. Entonces, en vez de ir de m a 1
en el circuito de comparacin, el algoritmo va de m a k, donde k = L-1 si el
ltimo evento fue una coincidencia, o K = 1 en caso contrario. Por ejemplo, L
= 3 para el Abeba patrn. Este algoritmo es realmente lineal, con un peor caso
de O (n + m) comparaciones. Recientemente, Cole (1991) demostr que el
peor de los casos es exacta comparaciones 3 n + o (m). Sin embargo, de
acuerdo con los resultados empricos, como se esperaba, slo mejora el caso
promedio para las pequeas alfabetos, a costa de la utilizacin de ms
instrucciones. Recientemente, Apostolico y Giancarco (1986) mejoraron este
algoritmo a un peor caso de 2 n - m + 1 comparaciones.
10.5.1 La Boyer-Moore Algoritmo simplificado
Una versin simplificada del algoritmo de Boyer-Moore (simplificado-Boyer-
Moore, o SBM, algoritmo) se obtiene mediante el uso de slo la heurstica de
ocurrencia. La razn principal detrs de esta simplificacin es que, en la
prctica, los patrones no son peridicas. Adems, el espacio adicional
necesario disminuciones de O (m + c) a O (c). Es decir, el espacio depende
solamente del tamao del alfabeto (casi siempre fija) y no en la longitud del
patrn (variable). Por la misma razn, no tiene sentido escribir una versin
simplificada que utiliza la mejora de Galil porque necesitamos O (m) Espacio
para calcular la longitud de los caracteres que se solapan. Por supuesto, el
peor de los casos es ahora O (MN), pero ser ms rpido en la media.
10.5.2 El algoritmo de Boyer-Moore-Horspool
Horspool (1980) present una simplificacin del algoritmo de Boyer-Moore,
y sobre la base de resultados empricos mostr que esta versin ms simple es
tan bueno como el algoritmo original de Boyer-Moore. Por otra parte, los
mismos resultados muestran que para casi todas las longitudes de patrn de
este algoritmo es mejor que los algoritmos que utilizan una instruccin de
hardware para encontrar la aparicin de un carcter designado.
Horspool seal que cuando se sabe que el patrn sea coincide o no, ninguno
de los caracteres del texto se puede utilizar para hacer frente a la mesa
heurstico. En base a esto, Horspool (1980) mejor el algoritmo de SBM
abordando la ocurrencia de la tabla con el carcter en el texto correspondiente
al ltimo carcter del patrn. Llamamos a este algoritmo de Boyer-Moore-
Horspool o BMH, algoritmo.
Para evitar una comparacin cuando el valor de la tabla es igual a cero (el
ltimo carcter del patrn), se define el valor inicial de la entrada en la
ocurrencia de la tabla, lo que corresponde al ltimo carcter en el patrn,
como m, y luego calculamos la tabla heurstica ocurrencia solamente durante
el primer m - 1 caracteres del patrn. Formalmente
...
Sec. 10.5 El algoritmo de Boyer-Moore
Ejemplo 4La tabla d para el abracadabra patrn es
...
y el valor de cualquier otro personaje es 11.
El cdigo para una versin eficiente del algoritmo de Boyer-Moore-Horspool
es extremadamente simple y se presenta en la Figura 10.6, donde
MAX_ALPHABET_SIZE es el tamao del alfabeto. En este algoritmo, el
orden de las comparaciones no es relevante, como seal Baeza-Yates (1989c)
y el domingo (1990). Por lo tanto, el algoritmo compara el patrn de izquierda
a derecha. Este algoritmo tambin incluye la idea de usar el carcter del texto
que corresponde a la posicin M + 1 de la pauta, una modificacin debido a
Domingo
(1990). Otras mejoras se deben a Hume y el domingo (1990).
...
Figura 10.6: El algoritmo de Boyer-Moore-Horspool-Domingo
Basado en el anlisis empricos y tericos, el algoritmo BMH es ms simple y
ms rpido que el algoritmo de SBM, y es tan bueno como el algoritmo BM
para alfabetos de tamao de al menos 10. Adems, no es difcil de probar que
el cambio esperado es mayor para el algoritmo de BMH. Mejoras en el
algoritmo BMH para buscar en el texto de Ingls son discutidos por Baeza-
Yates (1989b, 1989a) y el domingo (1990). Un algoritmo hbrido que
combina los algoritmos BMH y KMP es propuesto por Baeza-Yates (1989c).
Figura 10.7 muestra, para los algoritmos estudiados hasta el momento, el
nmero esperado de comparaciones por carcter para el texto al azar con c =
4. Los cdigos utilizados son los que figuran en este captulo, a excepcin de
que el algoritmo de Knuth-Morris-Pratt se implement segn lo sugerido por
sus autores. (La versin dada aqu es ms lento pero ms simple.)
...
Figura 10.7: Nmero previsto de las comparaciones para texto
aleatorio (c = 4)
10.6 LA SHIFT-o algoritmo
La idea principal es la de representar el estado de la bsqueda como un
nmero, y se debe a Baeza-Yates y Gonnet (1989). Cada paso de bsqueda
cuesta una pequea cantidad de operaciones aritmticas y lgicas, siempre que
los nmeros son lo suficientemente grandes como para representar a todos los
estados posibles de la bsqueda. Por lo tanto, para los patrones pequeos
tenemos
una operacin O (n) tiempo utilizando algoritmo O () ms espacio y O (m +)
tiempo, donde denota el alfabeto procesamiento previo.
Sec. 10.6 El Shift-O lAlgortihm
Las principales propiedades de la transicin-o algoritmo son:
Simplicidad: el pre-procesamiento y la bsqueda son
muy simples, y slo a nivel de bits se utilizan
operaciones lgicas, cambios y adiciones.
En tiempo real: el retardo de tiempo para procesar un
carcter de texto est limitada por una constante.
No buffering: el texto no necesita ser almacenado.
Vale la pena sealar que el algoritmo KMP no es un algoritmo en tiempo real,
y el algoritmo BM necesita para amortiguar el texto. Todas estas propiedades
indican que este algoritmo es adecuado para la implementacin de hardware.
Este algoritmo se basa en la teora de autmatas finitos, como el algoritmo
KMP, y tambin explota la finitud del alfabeto, como en el algoritmo BM.
En lugar de tratar de representar el estado global de la bsqueda como
algoritmos anteriores hacen, se utiliza un vector de m diferentes estados,
donde el estado i nos dice que el estado de la bsqueda entre las posiciones 1,.
. . , I del patrn y las posiciones (j - i + 1),. . . , J del texto, donde j es la
posicin actual en el texto.
Utilizamos un bit para representar cada estado individual, donde el estado es 0
si los ltimos personajes que han igualado o 1 en caso contrario. A
continuacin, podemos representar el estado de vectores de manera eficiente
como un nmero en base 2 por
---
Estado
donde los s i son los estados individuales. Se presenta un partido si s m es 0, o
equivalentemente, si el estado <2 m -1. El partido finaliza en la posicin
actual.
Para actualizar el estado despus de la lectura de un nuevo personaje en el
texto, debemos:
Desplazar el vector de estado de 1 bit a la izquierda para
reflejar que hemos avanzado una posicin en el texto. En
la prctica, esto establece el estado inicial de s 1 que es 0
por defecto.
Actualizacin de los estados individuales de acuerdo con
el nuevo carcter. Para ello utilizamos una tabla T que se
define por preprocesamiento del patrn con una entrada
por smbolo del alfabeto, y el operador bit a bit o que,
dada la edad, estado del vector y el valor de la tabla, le
da al nuevo estado.
Cada paso de bsqueda es entonces:
estado = (estado << 1) o T [char curr]
donde << denota el desplazamiento a la izquierda la operacin.
La definicin de la tabla T es
...
para cada smbolo del alfabeto x, donde d (C) es 0 si la condicin C es
verdadera, y 1 en caso contrario. Por lo tanto, necesitamos m. Sum () bits de
memoria extra, pero si el tamao de la palabra es por lo menos m, slo se
necesitan palabras. Hemos creado la tabla de pre-procesamiento del patrn
antes de la bsqueda. Esto se puede hacer en O () tiempo.
Ejemplo 5Sea {a, b, c, d} el alfabeto, y ABABC el patrn. Las entradas para
la tabla T (un dgito en cada posicin en el patrn) son entonces:
...
Terminamos el ejemplo mediante la bsqueda de la primera aparicin de
ABABC en el abdabababc texto. El estado inicial es 11.111.
texto: abdabababc
T [x]: 11010 10101 11111 11010 10101 11010 10101
11010 10101 01111
estado: 11110 11101 11111 11110 11101 11010 10101
11010 10101 01111
Por ejemplo, el estado 10,101 significa que en la situacin actual que tenemos
dos partidos parciales a la izquierda, de longitudes de dos y cuatro,
respectivamente. El partido al final del texto se indica con el valor 0 en el bit
ms a la izquierda del estado de la bsqueda.
La complejidad del tiempo de bsqueda, tanto en lo peor y caso promedio es
O (), donde [m / w] es el tiempo para calcular un desplazamiento u otra
operacin sencilla sobre el nmero de m bits utilizando un tamao de palabra
de w bits. En la prctica, para los patrones pequeos (tamao de palabra de 32
o 64 bits), tenemos O (n) tiempo para el peor de los casos y el caso promedio.
La figura 10.8 muestra una implementacin eficiente de este algoritmo. La
programacin es independiente del tamao de la palabra en la medida de lo
posible. Utilizamos las siguientes constantes simblicas:
MAXSYM: tamao del alfabeto. Por ejemplo, 128 para
el cdigo ASCII.
WORD: tamao de la palabra en bits (32 en nuestro
caso).
B: nmero de bits por cada estado; en este caso, uno.
...
Figura 10.8: Maysculas + O algoritmo para la coincidencia de
cadenas (versin simple)
Sec.10.6. El Shift-O Algoritmo
Los cambios necesarios para una ejecucin ms eficiente del algoritmo (es
decir, escanear el texto hasta que veamos el primer carcter del patrn) se
muestran en la Figura 10.9. La velocidad de esta versin depende de la
frecuencia de la primera letra del patrn en el texto. Los resultados empricos
de este cdigo se muestran en las figuras 10,11 y 10,12. Otra aplicacin es
posible utilizar el operador de bits y en lugar de la u operacin, y
complementando el valor de T x para todo x.
...
Figura 10.9: Shift-O algoritmo para la coincidencia de cadenas
* Basado en la aplicacin de Knuth, Morris y Pratt (1977).
Con slo cambiar la definicin de la tabla T podemos buscar patrones tales
que cada posicin del patrn es:
un conjunto de caracteres (por ejemplo, igualar una
vocal),
un smbolo de "no me importa" (cualquier carcter), o
el complemento de un conjunto de caracteres.
Por otra parte, podemos tener "no les importa" smbolos en el texto. Esta idea
se ha extendido recientemente a la cadena en busca de errores y otras variantes
por Wu y Manber (l991).
10.7 LA KARP-RABIN ALGORITMO
Un enfoque diferente para la bsqueda de cadena es utilizar tcnicas de
hashing, como se sugiere por Harrison (1971). Todo lo que es necesario es
calcular la funcin de firma de cada posible subcadena m-carcter en el texto
y comprobar si es igual a la funcin de la firma de la pauta.
Karp y Rabin (1987) encontraron una manera fcil de calcular estas funciones
de manera eficiente de firma para la funcin de la firma h (k) = k mod q,
donde q es un gran primo. Su mtodo se basa en el clculo de la funcin de la
firma para la posicin i dado el valor de la posicin i -. 1 El algoritmo requiere
un tiempo proporcional a n + m en casi todos los casos, sin necesidad de
utilizar el espacio extra. Tenga en cuenta que este algoritmo encuentra
posiciones en el texto que tiene el mismo valor de firma como el patrn. Para
asegurar que no es un partido, hay que hacer una comparacin directa de la
subcadena con el patrn. Este algoritmo es probabilstica, pero utilizando un
valor grande para q hace poco probable colisiones [la probabilidad de una
colisin aleatoria es O (1 / q)].
En teora, este algoritmo podra solicitar medidas mn en el peor de los casos,
si se echa cada partido potencial y tener demasiados partidos o colisiones. En
nuestros resultados empricos que observamos slo 3 choques en 10 7 clculos
de la funcin de la firma, el uso de grandes alfabetos.
La funcin de la firma representa una cadena como un nmero de base-d,
donde d = c es el nmero de caracteres posibles. Para obtener el valor de la
firma de la siguiente posicin, slo se necesita un nmero constante de
operaciones. El cdigo para el caso d = 128 (ASCII) y q = 16647133 para un
tamao de palabra de 32 bits, basado en la exposicin de Sedgewick (1983),
se da en la figura 10.10 (D = log 2 d y Q = q). Mediante el uso de una potencia
de 2 para d las multiplicaciones por d se pueden computar como turnos. El
primo q se elige lo ms grande posible, de tal manera que (d + 1) q no causa
desbordamiento. Tambin nos imponemos la condicin de que d es una raz
rimitive mod q. Esto implica que la funcin de firma tiene ciclo mxima; es
decir
...
Min ()
Por lo tanto, el perodo de la funcin de firma es mucho mayor que m para
cualquier caso prctico, como se muestra en Gonnet y Baeza-Yates (1990).
...
Figura 10.10: El algoritmo de Karp-Rabin
En la prctica, este algoritmo es lento debido a las multiplicaciones y las
operaciones de mdulo. Sin embargo, se convierte en competitiva para los
patrones de largo. Nos podemos evitar el clculo de la funcin de mdulo en
cada paso mediante el uso de la aritmtica modular implcita propuesta por el
hardware. En otras palabras, se utiliza el valor mximo de un entero
(determinado por el tamao de la palabra) para q. El valor de d se elige de
modo que d k mod 2 r tiene la longitud de ciclo mximo (ciclo de longitud 2 r -
2), para r 8-64, donde r es el tamao, en bits, de una palabra. Por ejemplo, un
valor adecuado para D es 31.
Con estos cambios, la evaluacin de la firma en cada paso (vase la Figura
10.10) es
h2 = h2 * D - Texto [jm] * dM + texto [i + m]; / *
Actualizar el valor de la firma * /
y el desbordamiento se ignora. De esta manera, utilizamos dos
multiplicaciones en vez de uno de multiplicacin y dos operaciones de
mdulo.
10.8 CONCLUSIONES
Hemos presentado los algoritmos de bsqueda de cadena ms importantes.
Figura 10.11 muestra el tiempo de ejecucin de la bsqueda 1000 patrones
aleatorios en texto aleatorio para todos los algoritmos considerados, con C =
30. Basndose en los resultados empricos, es evidente que la variante de
Horspool es el algoritmo ms conocido para longitudes de casi todos los
patrones y tamaos alfabeto . La figura 10.12 muestra los mismos resultados
empricos como figura 10.11, pero para el texto Ingls en lugar de texto
aleatorio. Los resultados son similares. Para el algoritmo de cambio-o, los
resultados dados son para la versin eficiente. Los resultados para el
algoritmo de Rabin-Karp no se incluyen debido a que en todos los casos el
tiempo supera los 300 segundos.
El principal inconveniente de los algoritmos de tipo de Boyer-Moore es el
tiempo de preprocesamiento y el espacio necesario, que depende del tamao
del alfabeto y / o el tamao del patrn. Por esta razn, si el patrn es pequeo
(1 a 3 caracteres de longitud) que es mejor utilizar el algoritmo ingenuo. Si el
tamao del alfabeto es grande, entonces el algoritmo de Knuth-Morris-Pratt es
una buena opcin. En todos los otros casos, en particular para textos largos, el
algoritmo de Boyer-Moore es mejor. Por ltimo, la versin Horspool del
algoritmo de Boyer-Moore es el mejor algoritmo, de acuerdo con el tiempo de
ejecucin, para casi todas las longitudes de patrn.
El cambio-o algoritmo tiene un tiempo de ejecucin similar al algoritmo
KMP. Sin embargo, la principal ventaja de este algoritmo es que podemos
buscar patrones ms generales ("no importa" smbolos, complemento de un
personaje, etc) utilizando exactamente el mismo tiempo de bsqueda (ver
Baeza-Yates y Gonnet [1989] ); slo el pre-procesamiento es diferente.
...
(Tabla)
Figura 10.11: Resultados de la simulacin para todos los
algoritmos de texto aleatorio (c = 30)
El tiempo lineal peores algoritmos de casos presentados en las secciones
anteriores son ptimas en el peor de los casos con respecto al nmero de
comparaciones (ver Rivest [1977]). Sin embargo, no son ptimos espacio en
el peor de los casos debido a que utilizan el espacio que depende del tamao
del patrn, el tamao del alfabeto, o ambos. Galil y Seiferas (1980, 1983)
muestran que es posible tener algoritmos peor caso de tiempo lineal utilizando
el espacio constante. (Vase tambin Slisenko [1980, 1983].) Tambin
muestran que la demora entre la lectura de dos caracteres del texto est
limitado por una constante, lo que es interesante para cualquier tiempo real
algoritmos de bsqueda (Galil 1981). Algoritmos prcticos que logran ptima
tiempo en el peor caso y el espacio se presentan por Crochemore y Perrin
(1988, 1989). Algoritmos paralelos ptimas para la coincidencia de cadenas
son presentados por Galil (1985) y por Vishkin (1985). (Ver tambin
Berkman et al. [1989] y Kedem y col. [1989])
...
(Cuadro dos)
Figura 10.12: Resultados de la simulacin para todos los
algoritmos en el texto Ingls
Muchos de los algoritmos presentados se pueden implementar con el
hardware (Haskin 1980; Hollaar 1979). Por ejemplo, las mquinas de Aho y
Corasick (ver Aoe et al. (1985), Cheng y Fu (1987), y Wakabayashi et al.
(1985).
Si permitimos que el preprocesamiento del texto, podemos buscar una cadena
en peor momento proporcional caso a su longitud. Esto se logra mediante el
uso de un rbol Patricia (Morrison 1968) como un ndice. Esta solucin
necesita O (n) espacio adicional y O (n) Tiempo de reprocesamiento, donde n
es el tamao del texto. Ver tambin Weiner (1973), McCreight (1976),
Majster y Reiser (1980), y Kemp et al. (1987). Para otros tipos de ndices de
texto, consulte Faloutsos (1985), Gonnet (1983), Blumer et al. (1985; 1987).
Para ms referencias y problemas, consulte Gonnet y Baeza-Yates (1991).
REFERENCIAS

Вам также может понравиться