En términos simples, ¿qué es el algoritmo Z?

El algoritmo Z es una forma eficiente de encontrar todas las ocurrencias de una cadena corta en una cadena larga. Esto se conoce como el problema de coincidencia de cadena exacta.

La manera fácil pero lenta de hacer esto es recorrer todos los caracteres de la cadena larga y ver si hay una cadena corta que comienza con ese carácter.

El algoritmo Z es eficiente porque a medida que se mueve a través de la cadena larga guarda información sobre los prefijos de la cadena corta que encuentra.

El tiempo de ejecución del algoritmo Z es [matemática] O (n) [/ matemática], donde [matemática] n [/ matemática] es el tamaño de la cadena larga. Esto se debe a que en cada iteración del algoritmo, avanza un carácter o encuentra a lo sumo una falta de coincidencia. Entonces, el peor tiempo de ejecución es [matemática] O (2n) = O (n) [/ matemática].

Esa es la descripción general de alto nivel. Para obtener más detalles sobre cada paso del algoritmo, no puedo hacer nada mejor que lo que ya existe, y no hay un atajo para comprenderlo que no sea trabajarlo. Le recomendaría que tome un ejemplo de una de las explicaciones y lo escriba en papel. Luego impleméntelo en su idioma favorito.

Algunas fuentes para mirar:

  • Con mucha notación matemática y código C: Algoritmo Z – Codeforces
  • Resumen de diapositiva, con diagramas: Página en umd.edu
  • Ejemplo detallado, con código Python: algoritmo Z | Ivan Yurchenko
  • Conferencia en video: página en youtube.com

Considere una cadena S = “abcdabaabc”

Definamos el valor Z de un índice como la longitud de la subcadena más larga que comienza con ese índice que es un prefijo de la cadena original. Asi que,

[matemáticas] Z [1] = 0 [/ matemáticas]

a bcdabaabc y a b cdabaabc, cualquier subcadena que comience con “b” no puede ser un prefijo

[matemáticas] Z [2] = 0, Z [3] = 0 [/ matemáticas]

[matemáticas] Z [4] = 2 [/ matemáticas]

ab cdabaabc y abcd ab aabc, coincidencia de 2 caracteres

[matemáticas] Z [5] = 0 [/ matemáticas]

[matemáticas] Z [6] = 1 [/ matemáticas]

a bcdabaabc y abcdab a abc

[matemáticas] Z [7] = 3 [/ matemáticas]

abc dabaabc y abcdaba abc

[matemática] Z [8] = 0, Z [9] = 0 [/ matemática] Suponga que esto se puede calcular en O (| S |) para cualquier cadena.

Lea: Algoritmo Z: Fuerzas de código para comprender cómo y por qué es O (| S |)

Veamos cómo podemos resolver la coincidencia de cadenas usando esta información.
Problema: Encuentre todas las ocurrencias de una cadena S en la cadena T.

Solución:

Hagamos una cadena L = S + “$” + T (concatene S y T con cualquier delimitador, que no existe en nuestro diccionario de caracteres, aquí el símbolo “$”).

Calcule los valores de Z para L.
Ahora observe aquí que la cadena S es un prefijo de L, y los valores de Z nos dan, para cada índice, cuál es la coincidencia con el prefijo.

Entonces, revise cada índice de L y si Z [i] = | S | de lo que es una coincidencia (observe que el delimitador “$” asegura que el valor Z nunca excederá | S |)

Ejemplo:

S = “abc”, T = “abcdabaabc”

L = “abc $ abcdabaabc”

Calcule los valores Z
Z [1] = 0, Z [2] = 0, Z [3] = 0, Z [4] = 3, Z [5] = 0, Z [6] = 0, Z [7] = 0, Z [8] = 2, Z [9] = 0, Z [10] = 1, Z [11] = 3, Z [12] = 0, Z [13] = 0

Mire los valores de Z [4] y Z [11]
por lo tanto, la cadena S coincide en el índice 4 (abc $ abc dabaabc) y el índice 11 (abc $ abcdaba abc )

More Interesting

¿Las funciones del tipo x ^ 2, x ^ 3, x ^ n se consideran de naturaleza recursiva?

Hay una recta numérica con puntos enteros. Empiezas en 0. Puedes moverte (saltar) de dos maneras: 'a' avanza o 'b' retrocede a la vez. Si se da un entero de destino particular, x, (x> = 0), ¿cómo encontrar el número mínimo de saltos necesarios para llegar al destino?

¿Cuál es la mejor descripción del cálculo lambda?

Si encuentro que las matemáticas discretas son totalmente comprensibles pero no realmente emocionantes, ¿debería reconsiderar estudiar CS? (Soy un estudiante de segundo año)

¿Cuál es la diferencia en informática, matemáticas e informática en los IIT?

¿Cómo ayuda una base sólida en matemáticas discretas en la programación de computadoras?

¿Por qué utilizamos el kit de microprocesador 8085 para agregar dos números hexadecimales en lugar de un simple proceso de suma?

¿Puedo ingresar una máquina Turing en otra máquina Turing? Si es así, ¿cómo? Y si no, ¿por qué?

Coloque números de cinco bits en los vértices de un hipercubo de 9 dimensiones de modo que, desde cualquier vértice, pueda alcanzar cualquier número en no más de dos movimientos a lo largo de los bordes del hipercubo.

Cómo implementar esto en Python: dada una matriz, encuentre tres números a, byc de modo que a ^ 2 + b ^ 2 = c ^ 2

Cómo probar [matemáticas] p (a \ cup b \ cup c) \ leq p (a) + p (b) + p (c) [/ math]

¿Cuál es el nivel de matemáticas de un estudiante de doctorado en ciencias de la computación?

¿Cuál es el significado de los lenguajes regulares [matemática] \ omega [/ matemática] en informática?

¿Qué algoritmos se pueden usar para resolver este problema de optimización?

¿Necesitaríamos resolver P vs. NP como prerrequisito en el diseño de inteligencia general artificial?