Algoritmo KMP percepción personal

  Desde que vino aquí, debe ser un pequeño amigo que KMP confundió por un tiempo. Aunque este artículo no necesariamente le permite comprenderlo, pero esta es mi comprensión más directa de KMP, tal vez no sea bueno, tal vez esté mal, señaló Wang Dao.

  Existen muchos algoritmos para la coincidencia de patrones de cuerdas. Por supuesto, el más simple es el craqueo por fuerza bruta (es decir, el algoritmo BF).

  El principio del algoritmo BF es comparar la cadena principal y la cadena de patrón en secuencia. Si son diferentes, la cadena principal y la cadena de patrón se remontarán (tal vez esto sea un poco confuso al principio, pero no tiene ningún efecto, y naturalmente lo entenderá más adelante)

Como

 

  Comenzamos a comparar la cadena del patrón y la cadena principal en secuencia, la primera no es la misma, es muy simple usar directamente la cadena del patrón y el primero y el segundo de la cadena principal para comenzar a comparar, de la siguiente manera

 

   De esta manera, encontraremos que los primeros cuatro no son aceptables (incluido uno de los paréntesis), por lo que comenzamos directamente desde el quinto

 

   Descubriremos que A a B de la cadena del patrón son iguales, por lo tanto, salte directamente a diferentes posiciones para comparar

 

 

  Esta es la diferencia entre la cadena principal y la cadena de patrón, por lo que debemos comenzar a pensar qué hacer a continuación.

  Es fácil pensar que podemos tomar el primero de la cadena de patrones y el siguiente de la cadena principal solo para comenzar la comparación nuevamente, de la siguiente manera

 

 

 

  Este proceso de este paso se llama retroceso

  Pero encontraremos un problema porque ya hemos determinado las letras en la posición anterior cuando comenzamos a coincidir con éxito, y definitivamente no volveremos a rastrear el retroceso de la cadena principal y el comienzo de la cadena del patrón, lo que perderá mucho tiempo. Luego, observaremos cuidadosamente que cuando no podemos hacer coincidir, podemos comparar directamente la tercera posición de la cadena del patrón con la posición no coincidente de la cadena principal, de modo que no necesitamos retroceder el puntero de la cadena principal, y no necesitamos comparar la cadena del patrón. El puntero vuelve al final, lo que puede ahorrar mucho tiempo. Esta es la idea del algoritmo KMP.

  Pero, ¿por qué deberíamos comparar desde la tercera posición de la cadena de patrón?

  Pensamos en esta foto

 

  Cuando coincidimos con este punto, encontramos que no hay una coincidencia, que es equivalente a la cadena principal coincidente que tenemos delante, es la misma que la cadena del patrón, lo que significa que sabemos cómo es esta parte de la cadena principal, sabemos exactamente Personaje en esta posición, por lo que definitivamente no va a comparar un personaje diferente, lo cual es una pérdida de tiempo. Por lo tanto, buscaremos la misma subcadena y compararemos el puntero de cadena de patrón a la posición adecuada de acuerdo con esto.

  Como en el caso anterior, definitivamente comenzaremos a comparar desde la tercera posición de la cadena de patrón, porque encontraremos que el prefijo AB y el sufijo AB en la parte anterior son los mismos, por lo que la siguiente figura

 

 

  Algoritmo KMP

  Aquí, podemos analizar seriamente los pasos del algoritmo KMP

  Primero, compararemos la cadena del patrón y la cadena principal a su vez

  Luego, si encontramos una falla de coincidencia, mantenga el puntero de la cadena principal sin cambios y deslice la cadena del patrón hacia la derecha lo más posible (es decir, el puntero i de la cadena del patrón se remonta). , Es decir, retroceder al valor de la siguiente matriz correspondiente

  Finalmente, hasta que la coincidencia sea exitosa o la longitud de la cadena principal no sea suficiente, la coincidencia falla

 

  Luego está la última y más importante pregunta: ¿a dónde regreso cuando la coincidencia falla, cómo calcular, la computadora definitivamente no pensará como nuestro cerebro, por lo que debemos decirlo?

  Nota: La siguiente matriz relacionada con este artículo se basa en la estricta antigüedad, es decir, la primera posición de la matriz no almacena elementos (muchas personas deben usar este libro de texto)

  Resolvimos el problema de a dónde regresar, descubrimos que cuando lo pensamos, encontramos la longitud de elemento común más larga del sufijo, luego pensemos en cómo encontrar esto y luego le decimos a la computadora que no lo haga.

  Nota: el prefijo y el sufijo aquí son más pequeños que la longitud de la cadena en sí

  Ejemplos:

  Para una cadena ABABC

  Empieza a buscar

  A - 0

  AB - 0

  ABA - 1

  ABAB - 2

  ABABC - 0

  Obtendrá una tabla de sufijos más larga pública

  Pero también habrá algunos errores. Por ejemplo, si hacemos coincidir C con el paso de desajuste, esta tabla nos permitirá comenzar a comparar nuevamente desde 0, pero esto obviamente es incorrecto, porque los anteriores son AB, por lo que deberíamos comenzar a comparar desde el tercero Por lo tanto, el algoritmo KMP funciona en base a esta tabla, que forma la siguiente matriz conocida por todos.

  siguiente matriz

  Para la siguiente matriz, nuestro primer elemento debe ser 0, y el segundo elemento es 1 (no lo dude, escúcheme lentamente) (Por supuesto, le recordamos que la matriz aquí almacena datos de la posición 1 )

  Piénselo, ¿qué pasa si la posición actual de comparación de la cadena principal no coincide con la primera posición de la cadena del patrón? Por supuesto, BF mueve directamente el puntero de cadena principal j hacia atrás y luego compara. Sin embargo, en la descripción del algoritmo KMP, cuando la falta de coincidencia se mantiene en j, el puntero de cadena de patrón i se remonta. Por lo tanto, debido a que el valor del primer elemento es 0, seré igual a 0, pero no hay ningún elemento en la posición 0, por lo que cuando i = 0, moveremos tanto j como i hacia atrás en uno, ¿es equivalente a j directamente? Retrocedió un poco. 

 

 

 

  Entonces, ¿por qué el segundo lugar debe ser 1?

  Supongamos de nuevo, ¿qué debemos hacer si el partido falla en segundo lugar? De hecho, es muy simple, mantenemos la cadena principal sin cambios y comparamos la cadena del patrón de 1 para comenzar, por lo que el segundo bit debe ser 1

   Entonces, ¿cómo encontrar la siguiente matriz completa?

  De hecho, es muy simple aquí, hemos dejado en claro que el primer y segundo dígitos son 0 y 1, luego, desde el tercer dígito, el valor es la longitud de sufijo común más larga delante de +1

  Por ejemplo

  

 

   

  Bueno, el contenido general del algoritmo KMP está aquí, gracias por verlo aquí. Si crees que todavía está en la niebla, no te cuestiones. Esto definitivamente es mi culpa.

  Cangrejo cangrejo

Supongo que te gusta

Origin www.cnblogs.com/joco208/p/12740810.html
Recomendado
Clasificación