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;
}