¿Cuál es la mejor manera de aprender el algoritmo KMP para poder recordarlo fácilmente?

Para ser honesto, KMP es uno de los algoritmos más difíciles de aprender que he visto. Me llevó casi un día entero finalmente darme cuenta de cómo funciona. Para cualquiera que esté tratando de aprenderlo, aquí hay algunos consejos que ayudarán.

Digamos que tenemos un texto T y un patrón P que queremos buscar. Lo primero que hace KMP es que, para cada índice de P, calcula la siguiente función:

K [i] = prefijo propio más largo de P [i], que también es un sufijo de P [i]

Este es el quid del algoritmo. La idea detrás de esto es que supongamos que primero los caracteres i de P coinciden con T, pero luego hay un desajuste en el carácter (i + 1). Ya sabemos la longitud del prefijo más largo de P que es el sufijo de P. Por lo tanto, ya sabemos que P [K [i]] coincide con T [j..i], y así podemos reanudar el procedimiento de comparación comparando P [K [i] + 1] con T [i + 1].

Ahora, la parte difícil es el cálculo de K. Se calcula utilizando un algoritmo de programación dinámico.

  1. Para i = 0, K [i] será 0 (= L), (ya que la longitud del prefijo apropiado es 0).
  2. Para i> 0, hay 2 casos:
    1. P [i] = P [L], en este caso, K [i] es simple ++ L;
    2. P [i]! = P [L], coincide recursivamente con el siguiente prefijo más pequeño. es decir, L = K [L]

Espero que esto ayude.

Puede consultar estos enlaces para aprender el algoritmo KMP:

El cómputo de matriz de sufijo de prefijo más largo en el algoritmo de coincidencia de patrones KMP.

El algoritmo Knuth Morris Pratt para la coincidencia de patrones.

Es muy fácil de entender ya que una explicación en video se presenta con ejemplos. También puede verificar la visualización del algoritmo para visualizar el código en un dato de prueba dado.

Aquí está la solución de video para lo mismo:

Espero que esto ayude.

La mejor manera de recordarlo es entender cómo puedes inventarlo a partir del problema inicial. Lo presento de esta manera en la lección sobre KMP del curso Algorithms on Strings en Coursera.