Ir al contenido principal

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:
Salto del mal carácter(bad-character shift) (o salto de ocurrencia).
Horspool propuso utilizar solamente el salto del mal carácter para calcular los saltos en el algoritmo de Boyer-Moore.

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, …, m-2].
Si el carácter no ocurre en el patrón x, la no ocurrencia de x puede incluir el carácter, y alinearlo en el lado más izquierdo del patrón.
Esta operación (usada en el algoritmo BM) no es muy eficiente para alfabetos pequeños, pero cuando el alfabeto es grande comparado con la longitud del patrón llega a ser muy útil. Usarlo sólo produce un algoritmo muy eficiente en la práctica.

Ejemplo

El algoritmo encuentra todas las ocurrencias del patrón en el texto.

El patrón se denota por x = x[0, ..., m-1]; su longitud es igual a m.
El texto se denota por y = y[0, ..., n-1]; su longitud es igual a n.
Ambas secuencias son estructuras sobre un sistema finito de caracteres llamado alfabetodenotado por S, con tamaño igual a s.

x = GCAGAGAG
y = GCATCGCAGAGAGTATACAGTACG



Implementación

Comentarios

Publicar un comentario

Entradas populares de este blog

Autómata Finito Determinista - Código C++

En esta ocasión les traigo la implementación de un AFD en lenguaje C++. Un autómata finito determinista es una quíntupla que denotaremos de manera genérica por M=(Q,Σ,q0,δ,F) , donde: Q es un conjunto finito cuyos elementos llamaremos estados.  Σ es un alfabeto que llamamos alfabeto de entrada.  q0∈Q es un estado señalado que llamamos estado inicial.  F es un subconjunto de Q no vacío, cuyos elementos llamamos estados finales.  δ es una aplicación de Q×Σ→Q , que llamamos función de transición.  Para la implementación se utiliza una matriz de transición convirtiendo los símbolos y letras del alfabeto en indices de la matriz donde los estados son las FILAS y los símbolos son las COLUMNAS, por ejemplo: Tenemos un alfabeto Σ = {a, b, c}, entonces en la matriz de transición tomara la letra 'a' como indice 0 , letra 'b' indice 1 y letra 'c' indice 2. Lo mismo seria para las transiciones, pero allí no interesa que letra representa si no cuantos estados...

Collision Shapes - Box2D & SFML

En el ámbito del desarrollo de videojuegos y simulaciones interactivas, la gestión de colisiones es un componente crítico que determina la experiencia del usuario y la interactividad del entorno virtual. Desde las interacciones entre elementos del juego hasta las respuestas del entorno, las colisiones bien implementadas son esenciales para la jugabilidad y la inmersión.  En esta oportunidad, exploraremos en detalle el tema de las colisiones en 2D, centrándonos en la implementación de Collision Shapes y el uso del polimorfismo mediante dos herramientas populares: Box2D, un motor de física de código abierto, y SFML (Simple and Fast Multimedia Library), una biblioteca gráfica multiplataforma.  Con estas herramientas, podremos crear simulaciones y juegos con colisiones precisas y realistas, agregando profundidad y dinamismo a nuestros proyectos en dos dimensiones.   IDE: CodeBlocks: http://www.codeblocks.org/ v13.12 Library: SFML: http://www.sfml-dev.org/ v2.1 Box2...

Deploy a Heroku con Laravel 5