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].
- ¿Cuáles son algunos algoritmos geniales que se pueden usar para el reconocimiento de objetos y cómo los usamos?
- ¿Cuál es la intuición detrás del algoritmo de clasificación rápida de múltiples claves?
- ¿Qué es un árbol rojo-negro?
- ¿Cuál es la probabilidad de que 2 números sean iguales en una lista aleatoria de n números de m dígitos?
- ¿Qué es una matriz en Java? ¿Y cuál es un ejemplo de su uso?
Dejaré los detalles matemáticos formales como un ejercicio para el lector.