User:Oarr/sandbox

Algoritmo BNDM
El algoritmo BNDM (Backward Nondeterministic DAWN Matching) es un algoritmo de emparejamiento de cadenas, donde usualmente denotamos a n como el tamaño del texto y a m como el tamaño del patrón. Este es una simulación del algoritmo BDM, a diferencia de este el algoritmo BNMD utiliza un autómata de sufijos simulado con paralelismo de bits.

Al igual que el algoritmo Bitap el algoritmo BNDM utiliza mascaras. Dichas mascaras serán creadas por cada letra del patrón y una mascara general de tamaño m que inicialmente es $$2^m-1$$, despues de cada comparacion recorreremos la mascara general 1 bit a la izquierda.

En el articulo original de Gonzalo Navarro y Mathieu Raffinot proponen extensiones, estos tratan de la busqueda de multiples patrones, y la admision de errores en el patron o en el texto.

Pseudocodigo
Algoritmo BNDM para busqueda de patrones. T[n] P[m] B = [|cantidad de letras diferentes del patron|][|patron|] para i=1 hasta m        B[P[i]][i] = 1 fin para pos = 0 k = m - 1 mientras(pos <= n-m) i = m       last = m        D = $$(2^m)-1$$ mientras(D != 0) D = D & B[T[pos + i]] i = i - 1 si((D and $$ 2^k $$) != 0) si(i > 0) last = i                   else mostrar(pos+1) fin si fin si D = D << 1 fin mientras pos = pos + last fin mientras

Claramente podemos ver que inicialmente realizamos el pre-procesamiento, creando las mascaras para las diferentes letras del patrón. posteriormente entramos al primer bucle para iniciar la comparación, acá se puede resaltar la asignación a de que es una mascara de puro unos de tamaño m.

Luego entramos al segundo bloque, realizamos la operación and con la mascara del carácter del texto en la posición pos+i y reducimos en 1. Es importante notar que el recorrido es de derecha a izquierda. Luego preguntamos si el primer bit de nuestra mascara D (general) es diferente de 1, por verdad guardamos la posición i en last si es que i>0, caso contrario, encontramos una ocurrencia.

Es importante notar que last es la cantidad de posiciones que recorreremos al final de las comparaciones. Finalmente recorremos nuestra mascara D (general) 1 bit a la izquierda, salimos que bucle interior y sumamos a nuestra variable pos el valor de la variable last, y asi sucesivamente mientras la variable last sea menor o igual a n-m.