You are on page 1of 5

ALGORITMO DE BOYER MOORE

HORSPOOL EN C++
Características

Es una simplificación del algoritmo de Boyer-Moore.

Es fácil de implementar.

Existe un preprocesamiento del patrón.

Necesita O(σ)en espacio y O(m+σ)en tiempo (por el preprocesamiento).

Realiza saltos determinados en el preprocesamiento.

Compara de derecha a izquierda.

Realiza la búsqueda del patrón en un tiempo O(mn).

Realiza un número promedio de comparaciones para un carácter entre 1/σy 2/

(σ+1).
Lógica

Se calcula el preprocesamiento del patrón de la siguiente forma:

Se calcula la distancia mínima entre el último carácter y la ocurrencia de cada
carácter del alfabeto de la hilera principal.

Para realizar la búsqueda:
Consiste en la comparación de cada carácter del texto con las posiciones del patrón en el
orden m-1, 0, 1, 2, …, y m-2, si se da una ocurrencia del patrón o no.
Cuando se encuentra una no ocurrencia, al hacer la primera comparación entre el patrón y
el

texto,

el

salto

se

calcula

bmBc[c],

donde

ces

el

carácter

del

texto.

Cuando se encuentra una no ocurrencia o una ocurrencia total, al hacer las siguientes
comparaciones entre el patrón y el texto, el salto se calcula bmBc[c], donde ces el carácter
del patrón.
Descripción
Es considerado el mejor algoritmo de búsqueda de un patrón en un texto en aplicaciones
usuales.
El algoritmo escanea los caracteres del patrón con el texto iniciando con el carácter más a
la derecha.
En caso de una no ocurrencia o una ocurrencia total del patrón se usa una función
preprocesada para saltar:

. x = GCAGAGAG y = GCATCGCAGAGAGTATACAGTACG Implementación /* * C++ . con tamaño igual a s. m-2].Algoritmo de Boyer Moore Horspool * * Copyright 2014 Martin Cruz Otiniano * . Ejemplo El algoritmo encuentra todas las ocurrencias del patrón en el texto. m-1]. Usarlo sólo produce un algoritmo muy eficiente en la práctica. la no ocurrencia de x puede incluir el carácter. n-1]. El salto del mal carácter consiste en: Alinear cada carácter del alfabeto Σ con la ocurrencia más a la derecha en x[0.. su longitud es igual a m. y alinearlo en el lado más izquierdo del patrón. El patrón se denota por x = x[0.. . Esta operación (usada en el algoritmo BM) no es muy eficiente para alfabetos pequeños.... Ambas secuencias son estructuras sobre un sistema finito de caracteres llamado alfabetodenotado por S. Si el carácter no ocurre en el patrón x. Horspool propuso utilizar solamente el salto del mal carácter para calcular los saltos en el algoritmo de Boyer-Moore.Salto del mal carácter(bad-character shift) (o salto de ocurrencia). pero cuando el alfabeto es grande comparado con la longitud del patrón llega a ser muy útil. El texto se denota por y = y[0. …. su longitud es igual a n..

h> #define MAXT 1001 #define MAXP 1000 using namespace std. m.1] == c && memcmp(P.* Site: www. rep .1.h> #include<string. T + j. ++i) { tabla[P[i]] = m . rep ++ .com */ #include<iostream> #include <stdlib. int m) { int j . preBMBc(P. for (i = 0. ++i) tabla[i] = m. char char signed int signed int texto[MAXT] . } } void BMH( char *T.h> #include<time. } . // numero de veces encontrado // numero de comparaciones /******************** Busqueda por Boyer Moore Horspool ****************************/ void preBMBc(char *P. bmBC[256] . if ( P[m . i < m . int m.marcsdev. for (i = 0.1. char *P. m . char c . int n . i < 256. int tabla[]) { int i.m) { c = T[j + m . bmBC) .1] . while (j <= n . // Preprocesamiento // Búsqueda j = 0.1) == 0 ) { cout<<" * Encontrado en : "<< j + 1 << endl.i . patron[MAXP] . comp .

cout<<"\n\n__________________________________________________________"<<endl<< endl. tiempo . cout<<"\n__________________________________________________________"<<endl<<en dl. m ) . t1 = clock(). } } /*************************** Funcion Principal *****************************/ int main() { system("color 0B" ). else cout<<endl<<endl<<" >> Ocurrencias : "<< rep . cout<<"\n__________________________________________________________"<<endl<<en dl. = strlen( patron ) . t2. if(rep == 0) cout<<endl<<endl<<" >> Patron no encontrado . cout<<endl<<" Ingrese Patron : \n\t\t" . int n int m = strlen( texto ) . HORSPOOL º "<< endl .. tiempo = (t2-t1)/100000 . cout<<"\t ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ "<<endl<<endl.º "<< endl . // variables pata tiempo de busqueda cout<<endl . comp ++ . t2 = clock(). float t1 . patron .j = j + bmBC[c] . cout<<endl<<" >> Tiempo de busqueda : "<< tiempo .! " . gets( texto ) . cout<<endl<<" Ingrese Texto : \n\t\t" . cout<<"\t ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» "<<endl. n . rep = 0 . gets( patron ) . BMH( texto . . cout<<"\t º ---------------------------------------------. cout<<"\t º ALGORITMO BOOYER M. cout<<endl<<endl<<" >> Comparaciones : "<< comp .

return 0. } .system("pause").