Algoritmo de coincidencia de patrones de cadena (pensamiento + implementación de Python)

Algoritmo de coincidencia de patrones ingenuo

un ejemplo:

En la cadena principal S = "buen trabajo", busque la posición de la subcadena T = "trabajo". Por lo general, necesitamos los siguientes pasos.

1. 将子串"job"与主串S从第一位对应匹配。即判断 whether 'g' == 'j';
2. 判断结果为否,继续匹配 whether 'o' == 'j';
3. 直到找到第一位匹配 'j' = 'j';
4. 继续匹配完整 S[4:7] == 'job' == T。

Es el algoritmo de coincidencia más simple, es fácil de implementar la fuerza bruta, pero hay muchos pasos redundantes.

Algoritmo de coincidencia de patrones KMP

La idea general es eludir los pasos que se pueden omitir en la coincidencia de patrones ingenuos a través de la información existente de la cadena.

El proceso detallado no se repetirá, y aquí solo se dará una breve descripción.

El subíndice de la cadena principal conocida es iii , el subíndice de la subcadena esjjj , para resumir hay dos frases cortas: "iii no dar marcha atrás,jjjsiguiente siguienten e x t ”。

ii i Sin retroceso: significa que durante el proceso de comparación, el subíndice coincidente de la cadena principal solo aumentará o permanecerá sin cambios, y no coincidirá con el subíndice de la cadena principal anterior.

ni una palabra jsiguiente siguienten e x t : se refiere a la regla de coincidencia de subíndices de la subcadena de acuerdo con elsiguiente siguienten e x t valor de la matriz.

Luego te lo explicaremos en detalle a continuación a continuación.¿Cuál es el valor de la matriz n e x t ?

siguiente siguiente derivación de valores de matriz n e x t

Primero dé la definición de la fórmula matemática:
siguiente [j] = {0, cuando j = 1, Max {k ∣ 1 <k <j, y 'p 1 ... Pk - 1 ′ = ′ pj - k + 1 ... pj - 1 ′} 1 cuando este conjunto no está vacío, de lo contrario next [j] = \ begin {cases} 0, & \ text {cuando j = 1} \\ [2ex] Max \ {k | 1 < k <j, y'p_1 ... p_ {k-1} '=' p_ {j-k + 1} ... p_ {j-1} '\} & \ text cuando este conjunto no está vacío \\ [2ex] 1, & \ text {otros casos} \ end {casos}n e x t [ j ]=0 ,M a x { k 1<k<j , y P1. . . pagk - 1'=pagj - k + 1. . . pagj - 1'}1 ,Cuando  j = 1 cuandoCuando este conjunto en conjunto no se vacía cuandoOtros casos
p. ej., T = "abcabx"
j 123456 patrón de cadena T abcabxnext [j] 011123 \ begin {array} {c | lcr} j & 123456 \\ \ hline patrón de cadena T & abcabx \\ siguiente [j] & 011123 \ end {array }jTipo de modo cadena Tn e x t [ j ]1 2 3 4 5 6a b c a b x0 1 1 1 2 3
Una de las subcadenas "abcab", ab c ab , el prefijo y el sufijo tienen dos caracteres iguales, luego siguiente [6] = 2 + 1 = 3 siguiente [6] = 2 + 1 = 3n e x t [ 6 ]=2+1=3

La complejidad de tiempo de todo el algoritmo es O (n + m), que es mejor que el O ((n-m + 1) * m) del algoritmo de coincidencia de patrones ingenuo (la longitud de T es m).

Mejora del algoritmo de coincidencia de patrones KMP

Un ejemplo: la cadena principal S = "aaaabcde", la subcadena T = "aaaaax", los siguientes valores de la matriz son 012345, al principio, cuando i = 5, j = 5, encontramos "b" y "a "No quiero esperar, por lo tanto, j = siguiente [5] = 4, en este momento," b "y" a "en la cuarta posición todavía no son iguales, j = siguiente [4] = 3… Este también tendrá muchos pasos redundantes. Por tanto, hemos mejorado la solución de la siguiente función.

Agregue un juicio cada vez que se asigne el siguiente, juzgue si T [i] = = T [j] si \ T [i] == T [j]w h e t h e r T [ i ] ==T [ j ]

Finalmente, se proporciona un programa de Python específico para resolver la siguiente matriz:

import numpy as np

def get_nextval(T):
    T = '#' + T
    i = 1
    j = 0
    nextval = np.zeros(len(T), dtype=int)
    
    while i < len(T)-1:
        if j == 0 or T[i] == T[j]:
            i = i + 1
            j = j + 1
            if T[i] != T[j]:
                nextval[i] = j
            else:
                nextval[i] = nextval[j]
        else: 
            j = nextval[j]
    nextval = np.delete(nextval,0)
    return nextval

- - - - - - - - - - - - - - - - ---------------- --------------- -
Este artículo apareció por primera vez enzyairelu.cn
Bienvenido a mi sitio web para comentar y discutir
el buzón personal [email protected]
- - - - - - - - - - - - - - - -------- - ---------------------- -

Supongo que te gusta

Origin blog.csdn.net/weixin_42731543/article/details/103587078
Recomendado
Clasificación