KMP algoritmo implementado en C ++.

Tomado del producto es ligeramente Biblioteca: http://www.pinlue.com/article/2020/03/0417/469980519323.html

 

algoritmo KMP

algoritmo de coincidencia KMP es un modo rápido por el algoritmo de coincidencia propuesto "Knuth Morris Pratt".

PISTA: único subcadena su longitud máxima incluido

1. El problema a resolver: Supongamos que P se da en cadenas, la T es una cadena que se debe buscar, y les pidió que identificaran el mismo para todos los P subcadena de la T, esto se llama la coincidencia de patrones. (Substring se puede dar en la posición en T) (en lo sucesivo denominado P y T son la cadena de destino y sub-string)

Veamos un ejemplo:

T: T0 T1 T2 T3 .... tm-1 ... tn-1

P: P0 P1 P2 P3 ..... pm-1

Comparar comenzar desde la más T izquierda, haciendo TK = PK, entonces el partido es un éxito.

2. Soluciones de problemas coincidencia de patrones:

R: sencillo algoritmo de coincidencia de patrones (la idea es simple, pero lo suficientemente simple, mucho tiempo, no están dando marcha atrás): El enfoque más simple y directa, con el fin de comparar con los personajes de caracteres T P, no son iguales caracteres , P será el carácter correcto, vuelva a comparar, hasta que un golpe más a la derecha es P caracteres éxito o alcanzar fuera de fecha T.

Tales como: Si P = "aaaba", T = "aaabbaaaba", el proceso de correspondencia siguiente figura.

T: aaabbaaaba

P: aaaba

aaaba

.....

aaaba

A partir del análisis no es difícil, el peor de los casos es "la comparación de cada personaje aparecido en el último mes, por viaje comparar hasta M veces, comparar hasta N-M + 1 veces, el número total de comparaciones hasta m * (N -M + 1)", el tiempo de complejidad de 0 (M * N). Cuando un derecho P, independientemente de lo que el resultado intermedio viaje de la comparación, por tanto, es inevitable retroceso (por ejemplo: un primer turno de AAA de tres bits no es necesario). Aquí les presento KMP algoritmo sin dar marcha atrás.

3.KMP algoritmo para resolver los principales problemas que emparejan:

A. Cuando la comparación de cadenas se produce HASTA determinar el próximo viaje antes de la comparación, el número de caracteres P debe ser correcto;

Después de B. P a la derecha, que debe continuar para iniciar la comparación de caracteres desde el principio y sólo el carácter T en comparación desigual.

Esto nos lleva al problema a través del simple ejemplo de coincidencia de patrones. El fracaso en el primer proceso de comparación es la primera de cuatro caracteres P b, que indica que los cuatro primeros caracteres P es exitosa. El tercer patrón P b personaje no aparece en sus tres primeros caracteres (AAA) en. Por lo tanto, cuando la siguiente comparación, se mueve hacia atrás, al menos, a los cuatro personajes P; P mirada en el primer carácter al último carácter es el mismo, y por tanto los cuatro caracteres a la derecha después de la p de nuevo desde el primer carácter comparar, y ciertamente no es igual. Resumiendo la apelación: P debería ser justo al lado de 5 caracteres, y luego empezar a comparar los primeros cinco caracteres del carácter 0th de P y T!

KMP algoritmo de núcleo: algoritmo KMP por medio de una matriz auxiliar para determinar cuando se produce el siguiente partido durante el modo de rango y una posición P a la derecha de la comparación de inicio. siguiente [I] de la i + 1 valores de sólo el primer punto relativo al patrón mismo P, independientemente de la T. objetivo Cuando el proceso de coincidencia no es igual a Tj encontró Pi, si el siguiente [i]> = 0, P debería ser derecho i-siguiente [i] caracteres bits, Tj realizadas por P en los primeros caracteres siguientes [I]. comparación; si: siguiente [i] = -1, P en los caracteres ya no se compara con Tj, sino más bien a la derecha P i + 1 caracteres de P0 y Tj + 1 y empezar de nuevo en un comparador (mayo no comprender realmente, para encontrar sus propios ejemplos, frente a una sentencia, a continuación, darle una oportunidad)

En tanto que la siguiente matriz asociada con el patrón P calculada, de acuerdo con los significados anteriores, se puede dar fácilmente algoritmo cadena coincidente. (Problemas de modo transformado)

Calculado C.next: A P = "01001010100001" por ejemplo.

i: 0 1 2 3 4 5 6 .....

P: 0 1 0 0 1 0 1 .....

j (junto [i]): -1 0 0 1 1 2 3 .....

Tal como 1: Queremos ser considerado junto [2] valor, en relación con los dos primeros caracteres 0,1 P en sí. En la cadena 01, para encontrar el "cadena máxima sobre el mismo, el número de caracteres contenidos en la cadena, ya que está al lado [i] valor" no es igual a 0 y 1, la misma cadena no existe, por lo que la próxima [i ] = 0;

Tales como 2: Queremos ser considerado junto [6] valores relacionados con la propia P antes de los seis personajes 010010. Esta cadena 010 los mismos máximos = aproximadamente 010 cadena 010, es el número 3. Así que la próxima [i] = 3;

Tal como 3: Queremos ser considerado junto [5] valores relacionados con la misma antes de los 5 caracteres P 01001. Acerca = 01 en esta cadena de cadena de 01 01 el mismo número máximo es de 2. Así que la próxima [i] = 2;

// KMP.h

template <class T>

clase KMP

{

};

template <class T>

int KmpCompare (T fuente [], int ssize, T dest [], int DSIZE, int P [])

{

int j = -1;

for (int i = 0; i <ssize; i ++)

{

mientras que (j> = 0 && dest [j + 1]! = fuente [i])

j = P [j];

si (dest [j + 1] == fuente [i])

j ++;

si (j == DSIZE-1)

{

volver ij;

}

}

volver -1;

}

template <class T>

void (fuente T [], int P [], int ssize) KmpPreCompare

{

P [0] = -1;

for (int i = 1, j = -1; i <ssize; i ++)

{

mientras que (j> = 0 && fuente [j + 1]! = fuente [i])

j = P [j];

si (fuente [j + 1] == fuente [i])

j ++;

P [i] = j;

}

}

// KMPTest.cpp

#include <iostream>

# include "KMP.h"

using namespace std;

int main (int argc, char ** argv)

{

char * a = "C: \ Windows \ system32; \ Archivos de programa \ Java \ jdk1.7.0 \ bin;";

char * b = "D: \ Archivos de programa \ Java \ jdk1.7.0";

int * P = new int [5];

KmpPreCompare (B, P, 5); // cadena de destino debe primero pre-compilados con el fin de encontrar de nuevo

size_t i = KmpCompare (a, strlen (a), b, 5, P); // devuelve es un índice de posición de

delete [] P;

tribunal << i << endl;

return 0;

}

Publicado 60 artículos originales · ganado elogios 52 · vistas 110 000 +

Supongo que te gusta

Origin blog.csdn.net/yihuliunian/article/details/104658528
Recomendado
Clasificación