Algoritmo de coincidencia de cadenas KMP

Introducción

El algoritmo KMP es un algoritmo de coincidencia de cadenas. La coincidencia de cadenas se usa ampliamente, como la búsqueda de texto en páginas web, la búsqueda de todas las apariciones de un patrón en el texto, la búsqueda de secuencias específicas en secuencias de ADN, etc. Este algoritmo fue diseñado por Knuth, Morris y Pratt y es un algoritmo que puede hacer coincidir cadenas en tiempo lineal. Otros algoritmos de coincidencia incluyen el algoritmo de fuerza bruta, el algoritmo de Rabin-Karp, el algoritmo de autómata finito (utilizado para expresiones regulares, análisis léxico, etc.) A continuación presentamos principalmente el algoritmo KMP.

la complejidad

Establezca la longitud de la cadena principal en n y la longitud de la cadena del patrón en m. La
complejidad del tiempo coincidente es O (n).
La función auxiliar calcula la complejidad del tiempo. O (m).
La función auxiliar tiene una complejidad espacial de O (m).
La función auxiliar registra la cadena de patrón en la siguiente matriz. La información de prefijo y sufijo evita el retroceso de la cadena principal durante el proceso de coincidencia de cadenas, logrando así una complejidad de tiempo de coincidencia de O (n)

Explicación detallada del algoritmo.

1. siguiente matriz


La siguiente matriz es la configuración next*[i] = k para la cadena de patrón P, que representa el número máximo de caracteres k con el mismo prefijo y sufijo en la subcadena de la cadena de patrón P desde el subíndice 0 hasta el subíndice i, donde k < =i-1.
La siguiente matriz se desplaza una posición hacia la derecha con respecto a la siguiente* matriz en su conjunto, y el primer bit se complementa con -1. Esto es principalmente por conveniencia de uso. El algoritmo KMP también se puede realizar usando la siguiente* matriz .

Ejemplo:

Cadena de patrón P a b a b a b C b
índice 0 1 2 3 4 5 6 7
próximo* 0 0 1 2 3 4 0 ESO
próximo -1 0 0 1 2 3 4 0

next*[0] = 0, el sufijo y el sufijo son cadenas vacías
next*[1] = 0, el sufijo y el sufijo son diferentes
next*[2] = 1, existe el sufijo idéntico más largo y el sufijo "a"
next* [3] = 2. El sufijo idéntico más largo "ab" existe
a continuación*[4] = 3. El sufijo idéntico más largo "aba" existe
a continuación*[5] = 4. El sufijo idéntico más largo "abab" existe
a continuación*[6 ] = 0, ni el sufijo ni el sufijo son iguales

siguiente* proceso de resolución de matrices

Insertar descripción de la imagen aquí

2. Algoritmo KMP

En el proceso de coincidencia
Por favor agregue una descripción de la imagen.
anterior, la cadena principal no se rastreará. Si falla una coincidencia, la posición de coincidencia de la cadena del patrón se ajustará de acuerdo con los siguientes datos. La posición donde la cadena principal no coincide puede coincidir varias veces, pero la complejidad general no es la misma. No excederá O (n). Hay un análisis de amortización de la complejidad temporal del algoritmo KMP en la introducción al algoritmo. Si está interesado, puede echar un vistazo.

implementar código

1. Resuelva el siguiente código de matriz

void getNext(char * p, int * next) {
	next[0] = -1;
	int i = 0, j = -1;
	while (i < (int)strlen(p)) {
		if (j == -1 || p[i] == p[j]) {
			++i;
			++j;
			next[i] = j;
		} else {
			j = next[j];
		}
	}
}

2. Coincidencia de KMP

int kmp(char * t, char * p)  {
	int i = 0; 
	int j = 0;
	while (i < (int)strlen(t) && j < (int)strlen(p)) {
		if (j == -1 || t[i] == p[j])  {
			i++;
       		j++;
		} else  {
       		j = next[j];
        }
    }
    if (j == strlen(p))
       return i - j;
    else 
       return -1;
}

Supongo que te gusta

Origin blog.csdn.net/ID314846818/article/details/127855809
Recomendado
Clasificación