¿Cuál es la prueba del algoritmo KMP?

Si supone que ha calculado correctamente la tabla de funciones de prefijos para la aguja, entonces no hay mucho que demostrar, ya que la función de prefijos se define esencialmente de modo que el algoritmo sea correcto.

Digamos que algunos prefijos [matemática] P [/ matemática] de la aguja coinciden con una subcadena particular [matemática] S [/ matemática] del pajar. Nos gustaría saber si podría haber una coincidencia para la aguja que comienza en un índice [matemática] i [/ matemática] dentro del pajar que está después del comienzo de [matemática] S [/ matemática], pero en o antes el final de [matemáticas] S [/ matemáticas]. Para que eso sea cierto, el sufijo de [matemática] S [/ matemática] que comienza en [matemática] i [/ matemática] debe ser igual al prefijo de la aguja de la longitud correspondiente (que por lo tanto también es un prefijo de [matemática] ] P [/ math]), de lo contrario [math] i [/ math] ya se puede descartar sin observar ningún personaje posterior en el pajar. Como ya sabemos que [matemática] P [/ matemática] es igual a [matemática] S [/ matemática], sabemos que cualquier sufijo de [matemática] S [/ matemática] también es un sufijo de [matemática] P [/ matemática] . Por lo tanto, para que haya un candidato [matemática] i [/ matemática], un prefijo de [matemática] P [/ matemática] debe ser igual a un sufijo de [matemática] P [/ matemática]. El primer candidato posible [matemática] i [/ matemática] ocurre cuando el prefijo y el sufijo coincidentes de [matemática] P [/ matemática] son ​​tan largos como sea posible. La información sobre el prefijo y el sufijo de coincidencia más largos de cada prefijo de la aguja es precisamente lo que está en la tabla de funciones de prefijo.

También necesitamos demostrar la exactitud del algoritmo para calcular la tabla de funciones de prefijo. Supongamos que hemos calculado la tabla de funciones de prefijo [math] \ pi_1, \ ldots, \ pi_N [/ math] para una cadena [math] T_1, \ ldots, T_N [/ math] y agregamos un carácter [math] c [/ matemáticas] a esta cadena. Si hay algún sufijo propio no vacío de [matemática] Tc [/ matemática] que sea igual a un prefijo de [matemática] Tc [/ matemática], entonces ese sufijo debe tomar la forma [matemática] T’c [/ matemática] donde [matemática ] T ‘[/ math] es un sufijo (posiblemente vacío) de [math] T [/ math] que equivale a un prefijo de [math] T [/ math]. Por lo tanto, buscamos el prefijo más largo de [math] T [/ math] que es igual a un sufijo de [math] T [/ math] y va seguido del carácter [math] c [/ math]. Si esto no es [matemáticas] T_1, \ ldots, T _ {\ pi_N} [/ matemáticas], entonces el candidato restante más largo es el sufijo más largo del sufijo que equivale a un prefijo del prefijo … pero, esencialmente por el mismo razonamiento que arriba, esto debe ser [math] \ pi _ {\ pi_N} [/ math]. Seguimos iterando [math] \ pi [/ math] hasta que encontremos un prefijo (posiblemente vacío) seguido de [math] c [/ math].

Dejaré los detalles matemáticos formales como un ejercicio para el lector.

More Interesting

¿Cuál debería ser el tamaño máximo del árbol de segmentos construido en una matriz en 100,000 elementos?

Cómo escribir un programa en C para implementar un algoritmo de planificación de prioridades, junto con la visualización del diagrama de Gantt

¿Cuáles son algunos algoritmos inesperados que se usan en física y ciencia de materiales?

Cómo usar el algoritmo de dijkstra en programación competitiva

¿Cuál es la mejor manera de implementar una lista cerrada para un algoritmo de búsqueda en C?

Cómo explicar el algoritmo de clasificación de inserción a un niño de 10 años

¿Cuáles son las mejores pautas que una persona puede seguir para mejorar sus habilidades de resolución de problemas?

¿Cuál es una explicación intuitiva del algoritmo Metropolis-Hastings?

¿Cuál es el significado de usar una cola prioritaria en el algoritmo de Dijkstra? ¿Qué diferencia hay si usamos una cola normal?

¿Cuánto tiempo se necesita para leer Introducción a Algoritmos de TH Cormen, para un principiante?

¿Algún consejo para estudiar la complejidad del espacio para programar entrevistas? ¿Cuáles son algunos buenos recursos para aprender sobre la complejidad del espacio?

Cómo mantener una matriz, admitir inserción y asignación aleatorias, y consultar el kth elemento más grande en un intervalo dado

¿Cómo se puede predecir el rango basado en el rango anterior y los datos de puntaje disponibles?

¿Por qué el algoritmo RSA no lleva el nombre de Ellis, Cocks y Williamson, dado que lo inventaron primero?

Cómo diseñar una nueva función heurística admisible para un algoritmo A * para resolver el problema del mosaico deslizante