Articulo de referencia

matriz LCP

\\mathcal{O}(n) \n| \\mathcal{O}(n) \n\n| Construction\n| \\mathcal{O}(n) \n| \\mathcal{O}(n) \n}}"}},"i":0}}]}"> En informática , la matriz de prefijos comunes más largos ( mat...

En informática , la matriz de prefijos comunes más largos ( matriz LCP ) es una estructura de datos auxiliar de la matriz de sufijos . Almacena las longitudes de los prefijos comunes más largos (LCP) entre todos los pares de sufijos consecutivos en una matriz de sufijos ordenada.

Por ejemplo, si A  := [aab,ab,abaab,b,baab] es una matriz de sufijos, el prefijo común más largo entre A [1] =aaby A [2] =abesaque tiene longitud 1, por lo que H [2] = 1 en el arreglo LCP H . De igual modo, el LCP de A [2] =aby A [3] =abaabesab, por lo tanto H [3] = 2.

Ampliar el arreglo de sufijos con el arreglo LCP permite simular de manera eficiente recorridos de arriba hacia abajo y de abajo hacia arriba del árbol de sufijos , [ 1 ] [ 2 ] acelera la coincidencia de patrones en el arreglo de sufijos [ 3 ] y es un requisito previo para árboles de sufijos comprimidos. [ 4 ]

Historia

El arreglo LCP fue introducido en 1993 por Udi Manber y Gene Myers junto con el arreglo de sufijos para mejorar el tiempo de ejecución de su algoritmo de búsqueda de cadenas . [ 3 ]

Definición

DejarA{\displaystyle A}sea ​​el array de sufijos de la cadenaS=s1,s2,snorte1$${\displaystyle S=s_{1},s_{2},\ldots s_{n-1}\$}de longitudnorte{\displaystyle n}, dónde${\displaystyle \$}es una letra centinela que es única y lexicográficamente más pequeña que cualquier otro carácter.S[i,j]{\displaystyle S[i,j]}denota la subcadena deS{\displaystyle S}que van desdei{\displaystyle i}aj{\displaystyle j}. De este modo,S[A[i],norte]{\displaystyle S[A[i],n]}es eli{\displaystyle i}el sufijo más pequeño deS{\displaystyle S}.

Dejarlcp(v,w){\displaystyle \operatorname {lcp} (v,w)}denota la longitud del prefijo común más largo entre dos cadenasv{\displaystyle v}yw{\displaystyle w}Luego, la matriz LCPH[1,norte]{\displaystyle H[1,n]}es una matriz de enteros de tamañonorte{\displaystyle n}de tal manera queH[1]{\displaystyle H[1]}no está definido yH[i]=lcp(S[A[i1],norte],S[A[i],norte]){\displaystyle H[i]=\operatorname {lcp} (S[A[i-1],n],S[A[i],n])}por cada1<inorte{\displaystyle 1<i\leq n}. De este modoH[i]{\displaystyle H[i]}almacena la longitud del prefijo común más largo de la lexicográficamentei{\displaystyle i}el sufijo más pequeño y su predecesor en la matriz de sufijos.

Diferencia entre la matriz LCP y la matriz de sufijos:

  • Matriz de sufijos: representa el rango lexicográfico de cada sufijo de una matriz.
  • Matriz LCP: Contiene la coincidencia de prefijo de longitud máxima entre dos sufijos consecutivos, después de haber sido ordenados lexicográficamente.

Ejemplo

Consideremos la cadenaS=plátano${\displaystyle S={\textrm {plátano\$}}}:

y su correspondiente matriz de sufijos ordenadosA{\displaystyle A} :

Matriz de sufijos con los sufijos escritos verticalmente debajo:

Luego, la matriz LCPH{\displaystyle H}se construye comparando sufijos lexicográficamente consecutivos para determinar su prefijo común más largo:

Entonces, por ejemplo,H[4]=3{\displaystyle H[4]=3}es la longitud del prefijo común más largoAna{\displaystyle {\text{ana}}}compartido por los sufijosA[3]=S[4,7]=ana${\displaystyle A[3]=S[4,7]={\textrm {ana\$}}}yA[4]=S[2,7]=anana${\displaystyle A[4]=S[2,7]={\textrm {anana\$}}}. Tenga en cuenta queH[1]{\displaystyle H[1]}no está definido, ya que no existe un sufijo lexicográficamente más corto.

Algoritmos de construcción eficientes

Los algoritmos de construcción de matrices LCP se pueden dividir en dos categorías diferentes: algoritmos que calculan la matriz LCP como un subproducto de la matriz de sufijos y algoritmos que utilizan una matriz de sufijos ya construida para calcular los valores LCP.

Manber y Myers (1993) proporcionan un algoritmo para calcular la matriz LCP junto con la matriz de sufijos enO(norteregistronorte){\displaystyle O(n\log n)}tiempo. Kärkkäinen y Sanders (2003) muestran que también es posible modificar suO(norte){\displaystyle O(n)}algoritmo de tiempo tal que también calcula la matriz LCP. Kasai et al. (2001) presentan el primeroO(norte){\displaystyle O(n)}Algoritmo de tiempo (FLAAP) que calcula la matriz LCP dado el texto y la matriz de sufijos.

Suponiendo que cada símbolo de texto ocupa un byte y cada entrada del sufijo o matriz LCP ocupa 4 bytes, el principal inconveniente de su algoritmo es una gran ocupación de espacio.13norte{\displaystyle 13n}bytes, mientras que la salida original (texto, matriz de sufijos, matriz LCP) solo ocupa9norte{\displaystyle 9n}bytes. Por lo tanto, Manzini (2004) creó una versión refinada del algoritmo de Kasai et al. (2001) (lcp9) y redujo la ocupación de espacio a9norte{\displaystyle 9n}bytes. Kärkkäinen, Manzini y Puglisi (2009) proporcionan otro refinamiento del algoritmo de Kasai (Φ{\displaystyle \Phi }-algoritmo) que mejora el tiempo de ejecución. En lugar de la matriz LCP real, este algoritmo construye la matriz LCP permutada (PLCP), en la que los valores aparecen en orden textual en lugar de orden lexicográfico.

Gog y Ohlebusch (2011) proporcionan dos algoritmos que, aunque teóricamente son lentos (O(norte2){\displaystyle O(n^{2})}) fueron más rápidos que los algoritmos mencionados anteriormente en la práctica.

A partir de 2012El algoritmo de construcción de matrices LCP de tiempo lineal más rápido actualmente se debe a Fischer (2011) , que a su vez se basa en uno de los algoritmos de construcción de matrices de sufijos más rápidos (SA-IS) de Nong, Zhang y Chan (2009) . El algoritmo de Fischer y Kurpicz (2017) , basado en DivSufSort de Yuta Mori, es aún más rápido.

Aplicaciones

Como señalan Abouelhoda, Kurtz y Ohlebusch (2004), varios problemas de procesamiento de cadenas pueden resolverse mediante los siguientes tipos de recorridos de árboles :

  • Recorrido ascendente del árbol completo de sufijos
  • Recorrido descendente de un subárbol del árbol de sufijos
  • Recorrido del árbol de sufijos mediante los enlaces de sufijos.

Kasai et al. (2001) muestran cómo simular un recorrido ascendente del árbol de sufijos utilizando únicamente el arreglo de sufijos y el arreglo LCP. Abouelhoda, Kurtz y Ohlebusch (2004) amplían el arreglo de sufijos con el arreglo LCP y estructuras de datos adicionales, y describen cómo este arreglo de sufijos ampliado puede utilizarse para simular los tres tipos de recorridos del árbol de sufijos. Fischer y Heun (2007) reducen los requisitos de espacio del arreglo de sufijos ampliado preprocesando el arreglo LCP para consultas de rango mínimo . Por lo tanto, cualquier problema que pueda resolverse mediante algoritmos de árbol de sufijos también puede resolverse utilizando el arreglo de sufijos ampliado . [ 2 ]

Decidir si existe un patrónPAG{\displaystyle P}de longitudmetro{\displaystyle m}es una subcadena de una cadenaS{\displaystyle S}de longitudnorte{\displaystyle n}aceptaO(metroregistronorte){\displaystyle O(m\log n)}tiempo si solo se utiliza la matriz de sufijos. Al utilizar adicionalmente la información LCP, este límite se puede mejorar aO(metro+registronorte){\displaystyle O(m+\log n)}tiempo. [ 3 ] Abouelhoda, Kurtz y Ohlebusch (2004) muestran cómo mejorar aún más este tiempo de ejecución para lograr un óptimoO(metro){\displaystyle O(m)}tiempo. Por lo tanto, utilizando la información de la matriz de sufijos y la matriz LCP, la consulta de decisión se puede responder tan rápido como utilizando el árbol de sufijos .

El arreglo LCP también es una parte esencial de los árboles de sufijos comprimidos que proporcionan funcionalidad completa de árbol de sufijos, como enlaces de sufijos y consultas de ancestro común más bajo . [ 5 ] [ 6 ] Además, se puede utilizar junto con el arreglo de sufijos para calcular la factorización Lempel-Ziv LZ77 enO(norte){\displaystyle O(n)}tiempo. [ 2 ] [ 7 ] [ 8 ] [ 9 ]

El problema de la subcadena repetida más larga para una cadenaS{\displaystyle S}de longitudnorte{\displaystyle n}se puede resolver enΘ(norte){\displaystyle \Theta (n)}tiempo usando ambos el array de sufijosA{\displaystyle A}y la matriz LCP. Basta con realizar un barrido lineal a través de la matriz LCP para encontrar su valor máximo.vmetroaincógnita{\displaystyle v_{max}}y el índice correspondientei{\displaystyle i}dóndevmetroaincógnita{\displaystyle v_{max}}se almacena. La subcadena más larga que aparece al menos dos veces se obtiene medianteS[A[i],A[i]+vmetroaincógnita1]{\displaystyle S[A[i],A[i]+v_{max}-1]}.

El resto de esta sección explica con más detalle dos aplicaciones del array LCP: cómo se pueden usar el array de sufijos y el array LCP de una cadena para construir el árbol de sufijos correspondiente y cómo es posible responder a consultas LCP para sufijos arbitrarios usando consultas de rango mínimo en el array LCP.

Encuentra el número de ocurrencias de un patrón.

Para encontrar el número de ocurrencias de una cadena dadaPAG{\displaystyle P}(longitudmetro{\displaystyle m}) en un textoT{\displaystyle T}(longitudnorte{\displaystyle N}), [ 3 ]

  • Utilizamos la búsqueda binaria contra el arreglo de sufijos deT{\displaystyle T}para encontrar la posición inicial y final de todas las ocurrencias dePAG{\displaystyle P}.
  • Para acelerar la búsqueda, utilizamos la matriz LCP, concretamente una versión especial de la matriz LCP (LCP-LR, que se describe a continuación).

El problema de usar la búsqueda binaria estándar (sin la información LCP) es que en cada uno de losO(registronorte){\displaystyle O(\log N)}Se necesitaban realizar comparaciones, comparamos P con la entrada actual del arreglo de sufijos, lo que significa una comparación de cadena completa de hasta m caracteres. Por lo tanto, la complejidad esO(metroregistronorte){\displaystyle O(m\log N)}.

La matriz LCP-LR ayuda a mejorar esto aO(metro+registronorte){\displaystyle O(m+\log N)}, de la siguiente manera:

En cualquier punto durante el algoritmo de búsqueda binaria, consideramos, como de costumbre, un rango.(L,,R){\displaystyle (L,\dots ,R)}del conjunto de sufijos y su punto centralMETRO{\displaystyle M}y decidir si continuamos nuestra búsqueda en el subrango izquierdo(L,,METRO){\displaystyle (L,\dots ,M)}o en el subrango correcto(METRO,,R){\displaystyle (M,\dots ,R)}Para tomar la decisión, comparamosPAG{\displaystyle P}a la cuerda enMETRO{\displaystyle M}. SiPAG{\displaystyle P}es idéntico aMETRO{\displaystyle M}, nuestra búsqueda está completa. Pero si no, ya hemos comparado el primerok{\displaystyle k}personajes dePAG{\displaystyle P}y luego decidió siPAG{\displaystyle P}es lexicográficamente más pequeño o más grande queMETRO{\displaystyle M}. Supongamos que el resultado es quePAG{\displaystyle P}es más grande queMETRO{\displaystyle M}. Entonces, en el siguiente paso, consideramos(METRO,,R){\displaystyle (M,\dots ,R)}y un nuevo punto centralMETRO{\displaystyle M'}en el centro:

 M ...... M' ...... R | Sabemos: lcp(P,M)==k

El truco ahora es que LCP-LR se precalcula de tal manera que unO(1){\displaystyle O(1)}-lookup nos dice el prefijo común más largo deMETRO{\displaystyle M}yMETRO{\displaystyle M'},ldopag(METRO,METRO){\displaystyle \mathrm {lcp} (M,M')}.

Ya sabemos (del paso anterior) queMETRO{\displaystyle M}en sí mismo tiene un prefijo dek{\displaystyle k}personajes en común conPAG{\displaystyle P}:ldopag(PAG,METRO)=k{\displaystyle \mathrm {lcp} (P,M)=k}Ahora bien, existen tres posibilidades:

  • Caso 1:k<ldopag(METRO,METRO){\displaystyle k<\mathrm {lcp} (M,M')}, es decirPAG{\displaystyle P}tiene menos caracteres de prefijo en común con M que M en común con M'. Esto significa que el carácter (k+1) de M' es el mismo que el de M, y dado que P es lexicográficamente mayor que M, también debe ser lexicográficamente mayor que M'. Por lo tanto, continuamos en la mitad derecha (M',...,R).
  • Caso 2:k>ldopag(METRO,METRO){\displaystyle k>\mathrm {lcp} (M,M')}, es decirPAG{\displaystyle P}tiene más caracteres de prefijo en común conMETRO{\displaystyle M}queMETRO{\displaystyle M}tiene en común conMETRO{\displaystyle M'}. En consecuencia, si comparáramosPAG{\displaystyle P}aMETRO{\displaystyle M'}, el prefijo común sería más pequeño quek{\displaystyle k}, yMETRO{\displaystyle M'}sería lexicográficamente más grande quePAG{\displaystyle P}Así pues, sin hacer realmente la comparación, continuamos en la mitad izquierda.(METRO,,METRO){\displaystyle (M,\dots ,M')}.
  • Caso 3:k=ldopag(METRO,METRO){\displaystyle k=\mathrm {lcp} (M,M')}. Por lo tanto, M y M' son ambos idénticos conPAG{\displaystyle P}en el primerok{\displaystyle k}personajes. Para decidir si continuamos en la mitad izquierda o derecha, basta con compararPAG{\displaystyle P}aMETRO{\displaystyle M'}comenzando desde el(k+1){\displaystyle (k+1)}el personaje.
  • Continuamos recursivamente.

El efecto general es que ningún personaje dePAG{\displaystyle P}se compara con cualquier carácter del texto más de una vez (para más detalles, véase [ 3 ] ). El número total de comparaciones de caracteres está limitado pormetro{\displaystyle m}, por lo que la complejidad total es realmenteO(metro+registronorte){\displaystyle O(m+\log N)}.

Todavía necesitamos precalcular LCP-LR para que pueda decirnos enO(1){\displaystyle O(1)}Calcula el tiempo del LCP entre dos entradas cualesquiera del arreglo de sufijos. Sabemos que el arreglo LCP estándar nos da el LCP de entradas consecutivas solamente, es decirldopag(i1,i){\displaystyle \mathrm {lcp} (i-1,i)}para cualquieri{\displaystyle i}. Sin embargo,METRO{\displaystyle M}yMETRO{\displaystyle M'}En la descripción anterior, las entradas no son necesariamente consecutivas.

La clave de esto es darse cuenta de que solo ciertos rangos(L,,R){\displaystyle (L,\dots ,R)}siempre ocurrirá durante la búsqueda binaria: Siempre comienza con(0,,norte){\displaystyle (0,\dots ,N)}y lo divide por la mitad, y luego continúa hacia la izquierda o hacia la derecha y divide esa mitad de nuevo y así sucesivamente. Otra forma de verlo es  : cada entrada del arreglo de sufijos aparece como punto central de exactamente un rango posible durante la búsqueda binaria. Por lo tanto, hay exactamente N rangos distintos.(LMETROR){\displaystyle (L\dots M\dots R)}que posiblemente pueda desempeñar un papel durante la búsqueda binaria, y basta con precalcularldopag(L,METRO){\displaystyle \mathrm {lcp} (L,M)}yldopag(METRO,R){\displaystyle \mathrm {lcp} (M,R)}para aquellosnorte{\displaystyle N}rangos posibles. Entonces eso es2norte{\displaystyle 2N}valores precalculados distintos, por lo tanto LCP-LR esO(norte){\displaystyle O(N)}en tamaño.

Además, existe un algoritmo recursivo sencillo para calcular el2norte{\displaystyle 2N}valores de LCP-LR enO(norte){\displaystyle O(N)}tiempo del arreglo LCP estándar.

En resumen:

  • Es posible calcular LCP-LR enO(norte){\displaystyle O(N)}tiempo yO(2norte)=O(norte){\displaystyle O(2N)=O(N)}espacio de LCP.
  • El uso de LCP-LR durante la búsqueda binaria ayuda a acelerar el procedimiento de búsqueda.O(METROregistronorte){\displaystyle O(M\log N)}aO(METRO+registronorte){\displaystyle O(M+\log N)}.
  • Podemos usar dos búsquedas binarias para determinar el extremo izquierdo y derecho del rango de coincidencia paraPAG{\displaystyle P}y la longitud del rango de coincidencia se corresponde con el número de ocurrencias de P.

Construcción de árboles de sufijos

Dado el array de sufijosA{\displaystyle A}y la matriz LCPH{\displaystyle H}de una cuerdaS=s1,s2,snorte${\displaystyle S=s_{1},s_{2},\ldots s_{n}\$}de longitudnorte+1{\displaystyle n+1}, su árbol de sufijosST{\displaystyle ST}se puede construir enO(norte){\displaystyle O(n)}tiempo basado en la siguiente idea: comenzar con el árbol de sufijos parcial para el sufijo lexicográficamente más pequeño e insertar repetidamente los otros sufijos en el orden dado por la matriz de sufijos.

DejarSTi{\displaystyle ST_{i}}sea ​​el árbol de sufijos parciales para0inorte{\displaystyle 0\leq i\leq n}. Además, dejad(v){\displaystyle d(v)}sea ​​la longitud de la concatenación de todas las etiquetas de ruta desde la raíz deSTi{\displaystyle ST_{i}}al nodov{\displaystyle v}.

Caso 1 (d(v)=H[i+1]{\displaystyle d(v)=H[i+1]}): Supongamos que los sufijosa${\displaystyle a\$},anortea${\displaystyle ana\$},anorteanortea${\displaystyle anana\$}ybanorteanortea${\displaystyle banana\$}de la cuerdaS=banorteanortea${\displaystyle S=banana\$}ya se han añadido al árbol de sufijos. Entonces el sufijonortea${\displaystyle na\$}Se añade al árbol como se muestra en la imagen. El camino situado más a la derecha está resaltado en rojo.

Comience conST0{\displaystyle ST_{0}}, el árbol que consta únicamente de la raíz. Para insertarA[i+1]{\displaystyle A[i+1]}enSTi{\displaystyle ST_{i}}, suba por el sendero de la derecha comenzando en la hoja recién insertadaA[i]{\displaystyle A[i]}hasta la raíz, hasta el nodo más profundov{\displaystyle v}cond(v)H[i+1]{\displaystyle d(v)\leq H[i+1]}se alcanza.

Necesitamos distinguir dos casos:

  • d(v)=H[i+1]{\displaystyle d(v)=H[i+1]}: Esto significa que la concatenación de las etiquetas en la raíz-a-v{\displaystyle v}El camino es igual al prefijo común más largo de los sufijos.A[i]{\displaystyle A[i]}yA[i+1]{\displaystyle A[i+1]}En este caso, inserteA[i+1]{\displaystyle A[i+1]}como una nueva hojaincógnita{\displaystyle x}del nodov{\displaystyle v}y etiquetar el borde(v,incógnita){\displaystyle (v,x)}conS[A[i+1]+H[i+1],norte]{\displaystyle S[A[i+1]+H[i+1],n]}. Por lo tanto, la etiqueta del borde consta de los caracteres restantes del sufijoA[i+1]{\displaystyle A[i+1]}que no estén ya representadas por la concatenación de las etiquetas de la raíz av{\displaystyle v}ruta. Esto crea el árbol de sufijos parciales.STi+1{\displaystyle ST_{i+1}}.
    Caso 2 (d(v)<H[i+1]{\displaystyle d(v)<H[i+1]}): Para agregar sufijonorteanortea${\displaystyle nana\$}, el borde del sufijo previamente insertadonortea${\displaystyle na\$}tiene que dividirse. El nuevo borde hacia el nuevo nodo interno se etiqueta con el prefijo común más largo de los sufijos.nortea${\displaystyle na\$}ynorteanortea${\displaystyle nana\$}Los bordes que conectan las dos hojas están etiquetados con los caracteres de sufijo restantes que no forman parte del prefijo.
  • d(v)<H[i+1]{\displaystyle d(v)<H[i+1]}: Esto significa que la concatenación de las etiquetas en la raíz-a-v{\displaystyle v}La ruta muestra menos caracteres que el prefijo común más largo de sufijos.A[i]{\displaystyle A[i]}yA[i+1]{\displaystyle A[i+1]}y los caracteres faltantes están contenidos en la etiqueta del borde dev{\displaystyle v}borde más a la derecha . Por lo tanto, tenemos que dividir ese borde de la siguiente manera: Seaw{\displaystyle w}ser hijo dev{\displaystyle v}enSTi{\displaystyle ST_{i}}su camino más a la derecha.
  1. Eliminar el borde(v,w){\displaystyle (v,w)}.
  2. Agregar un nuevo nodo internoy{\displaystyle y}y un nuevo borde(v,y){\displaystyle (v,y)}con etiquetaS[A[i]+d(v),A[i]+H[i+1]1]{\displaystyle S[A[i]+d(v),A[i]+H[i+1]-1]}. La nueva etiqueta consta de los caracteres faltantes del prefijo común más largo deA[i]{\displaystyle A[i]}yA[i+1]{\displaystyle A[i+1]}. Por lo tanto, la concatenación de las etiquetas de la raíz ay{\displaystyle y}La ruta ahora muestra el prefijo común más largo deA[i]{\displaystyle A[i]}yA[i+1]{\displaystyle A[i+1]}.
  3. Conectarw{\displaystyle w}al nodo interno recién creadoy{\displaystyle y}por un borde(y,w){\displaystyle (y,w)}que está etiquetadoS[A[i]+H[i+1],A[i]+d(w)1]{\displaystyle S[A[i]+H[i+1],A[i]+d(w)-1]}La nueva etiqueta consta de los caracteres restantes del borde eliminado .(v,w){\displaystyle (v,w)}que no se utilizaron como etiqueta de borde(v,y){\displaystyle (v,y)}.
  4. AgregarA[i+1]{\displaystyle A[i+1]}como una nueva hojaincógnita{\displaystyle x}y conectarlo al nuevo nodo internoy{\displaystyle y}por un borde(y,incógnita){\displaystyle (y,x)}que está etiquetadoS[A[i+1]+H[i+1],norte]{\displaystyle S[A[i+1]+H[i+1],n]}. Por lo tanto, la etiqueta del borde consta de los caracteres restantes del sufijoA[i+1]{\displaystyle A[i+1]}que no estén ya representadas por la concatenación de las etiquetas de la raíz av{\displaystyle v}camino.
  5. Esto crea el árbol de sufijos parciales.STi+1{\displaystyle ST_{i+1}}.

Un argumento de amortización simple muestra que el tiempo de ejecución de este algoritmo está acotado porO(norte){\displaystyle O(n)}:

Los nodos que se recorren en el pasoi{\displaystyle i}subiendo por el sendero más a la derecha deSTi{\displaystyle ST_{i}}(aparte del último nodo)v{\displaystyle v}) se eliminan del camino más a la derecha , cuandoA[i+1]{\displaystyle A[i+1]}se agrega al árbol como una nueva hoja. Estos nodos nunca se volverán a recorrer en todos los pasos subsiguientes.j>i{\displaystyle j>i}Por lo tanto, como máximo2norte{\displaystyle 2n}Se recorrerán todos los nodos.

Consultas LCP para sufijos arbitrarios

La matriz LCPH{\displaystyle H}solo contiene la longitud del prefijo común más largo de cada par de sufijos consecutivos en la matriz de sufijosA{\displaystyle A}Sin embargo, con la ayuda de la matriz de sufijos inversosA1{\displaystyle A^{-1}}(A[i]=jA1[j]=i{\displaystyle A[i]=j\Leftrightarrow A^{-1}[j]=i}, es decir, el sufijoS[j,norte]{\displaystyle S[j,n]}que comienza en la posiciónj{\displaystyle j}enS{\displaystyle S}se almacena en posiciónA1[j]{\displaystyle A^{-1}[j]}enA{\displaystyle A}) y consultas mínimas de rango de tiempo constante enH{\displaystyle H}, es posible determinar la longitud del prefijo común más largo de sufijos arbitrarios enO(1){\displaystyle O(1)}tiempo.

Debido al orden lexicográfico de la matriz de sufijos, cada prefijo común de los sufijosS[i,norte]{\displaystyle S[i,n]}yS[j,norte]{\displaystyle S[j,n]}tiene que ser un prefijo común de todos los sufijos entrei{\displaystyle i}posición de en el array de sufijosA1[i]{\displaystyle A^{-1}[i]}yj{\displaystyle j}posición de en el array de sufijosA1[j]{\displaystyle A^{-1}[j]}Por lo tanto, la longitud del prefijo más largo que comparten todos estos sufijos es el valor mínimo en el intervaloH[A1[i]+1,A1[j]]{\displaystyle H[A^{-1}[i]+1,A^{-1}[j]]}Este valor se puede encontrar en tiempo constante siH{\displaystyle H}Se preprocesa para consultas de rango mínimo.

Así, dada una cadenaS{\displaystyle S}de longitudnorte{\displaystyle n} y dos posiciones arbitrarias i,j{\displaystyle i,j}en la cadenaS{\displaystyle S} conA1[i]<A1[j]{\displaystyle A^{-1}[i]<A^{-1}[j]}, la longitud del prefijo común más largo de los sufijosS[i,norte]{\displaystyle S[i,n]}yS[j,norte]{\displaystyle S[j,n]}se puede calcular de la siguiente manera:LCP(i,j)=H[RMQH(A1[i]+1,A1[j])]{\displaystyle \operatorname {LCP} (i,j)=H[\operatorname {RMQ} _{H}(A^{-1}[i]+1,A^{-1}[j])]}.

Notas

Referencias

  • Abouelhoda, Mohamed Ibrahim; Kurtz, Stefan; Ohlebusch, Enno (2004). "Reemplazando árboles de sufijos con arreglos de sufijos mejorados" . Journal of Discrete Algorithms . 2 : 53–86 . doi : 10.1016/S1570-8667(03)00065-0 .
  • Manber, Udi; Myers, Gene (1993). "Suffix Arrays: A New Method for On-Line String Searches". SIAM Journal on Computing . 22 (5): 935. CiteSeerX 10.1.1.105.6571 . doi : 10.1137/0222058 . S2CID 5074629 .  
  • Kasai, T.; Lee, G.; Arimura, H.; Arikawa, S.; Park, K. (2001). Cálculo del prefijo común más largo en tiempo lineal en arreglos de sufijos y sus aplicaciones . Actas del 12.º Simposio Anual sobre Coincidencia de Patrones Combinatorios. Lecture Notes in Computer Science. Vol.  2089. pp. 181–192 . doi : 10.1007/3-540-48194-X_17 . ISBN  978-3-540-42271-6.
  • Ohlebusch, Enno; Fischer, Johannes; Gog, Simon (2010). CST++ . Procesamiento de cadenas y recuperación de información. Lecture Notes in Computer Science. Vol.  6393. p.  322. doi : 10.1007/978-3-642-16321-0_34 . ISBN 978-3-642-16320-3.
  • Kärkkäinen, Juha; Sanders, Peter ( 2003). Construcción simple de arreglos de sufijos de trabajo lineales . Actas de la 30.ª conferencia internacional sobre autómatas, lenguajes y programación. pp. 943–955 . Recuperado el 28 de agosto de 2012 . 
  • Fischer, Johannes (2011). Inducción del arreglo LCP . Algoritmos y estructuras de datos. Notas de clase en ciencias de la computación. Vol.  6844. pp. 374–385 . arXiv : 1101.3448 . doi : 10.1007/978-3-642-22300-6_32 . ISBN  978-3-642-22299-3.
  • Manzini, Giovanni (2004). Dos trucos para ahorrar espacio en el cálculo lineal de matrices LCP . Algorithm Theory – SWAT 2004. Lecture Notes in Computer Science. Vol.  3111. p.  372. doi : 10.1007/978-3-540-27810-8_32 . ISBN 978-3-540-22339-9.
  • Kärkkäinen, Juha; Manzini, Giovanni; Puglisi, Simon J. (2009). Permuted Longest-Common-Prefix Array . Combinatorial Pattern Matching. Lecture Notes in Computer Science. Vol.  5577. p.  181. doi : 10.1007/978-3-642-02441-2_17 . ISBN 978-3-642-02440-5.
  • Puglisi, Simon J.; Turpin, Andrew (2008). Space-Time Tradeoffs for Longest-Common-Prefix Array Computation . Algorithms and Computation. Lecture Notes in Computer Science. Vol.  5369. p.  124. doi : 10.1007/978-3-540-92182-0_14 . ISBN 978-3-540-92181-3.
  • Gog, Simon; Ohlebusch, Enno (2011). Algoritmos rápidos y ligeros para la construcción de matrices LCP (PDF) . Actas del Taller sobre Ingeniería y Experimentos de Algoritmos, ALENEX 2011. págs. 25–34 . Recuperado el 28 de agosto de 2012 . 
  • Nong, Ge; Zhang, Sen; Chan, Wai Hong (2009). Construcción de matrices de sufijos lineales mediante ordenación inducida casi pura . Conferencia de compresión de datos de 2009. pág.  193. doi : 10.1109/DCC.2009.42 . ISBN 978-0-7695-3592-0.
  • Fischer, Johannes; Heun, Volker (2007). Una nueva representación concisa de la información RMQ y mejoras en el array de sufijos mejorado . Combinatoria, algoritmos, metodologías probabilísticas y experimentales. Lecture Notes in Computer Science. Vol.  4614. p.  459. doi : 10.1007/978-3-540-74450-4_41 . ISBN 978-3-540-74449-8.
  • Chen, G.; Puglisi, SJ; Smyth, WF (2008). "Factorización de Lempel-Ziv usando menos tiempo y espacio". Matemáticas en Ciencias de la Computación . 1 (4): 605. doi : 10.1007/s11786-007-0024-4 . S2CID 1721891 . 
  • Crochemore, M.; Ilie, L. (2008). "Cálculo del factor anterior más largo en tiempo lineal y aplicaciones". Information Processing Letters . 106 (2): 75. CiteSeerX 10.1.1.70.5720 . doi : 10.1016/j.ipl.2007.10.006 . S2CID 5492217 .  
  • Crochemore, M.; Ilie, L.; Smyth, WF (2008). Un algoritmo simple para calcular la factorización de Lempel-Ziv . Conferencia de compresión de datos (dcc 2008). pág.  482. doi : 10.1109/DCC.2008.36 . hdl : 20.500.11937/5907 . ISBN 978-0-7695-3121-2.
  • Sadakane, K. (2007). "Árboles de sufijos comprimidos con funcionalidad completa". Theory of Computing Systems . 41 (4): 589– 607. CiteSeerX 10.1.1.224.4152 . doi : 10.1007/s00224-006-1198-x . S2CID 263130 .  
  • Fischer, Johannes; Mäkinen, Veli; Navarro, Gonzalo (2009). "Árboles de sufijos comprimidos con límite de entropía más rápidos" . Theoretical Computer Science . 410 (51): 5354. doi : 10.1016/j.tcs.2009.09.012 .
  • Fischer, Johannes; Kurpicz, Florian (5 de octubre de 2017). "Desmantelando DivSufSort". Actas de la Conferencia de Stringología de Praga 2017. arXiv : 1710.01896 .
  • Espejo de la implementación ad hoc del código descrito en Fischer (2011)
  • SDSL: Biblioteca de Estructuras de Datos Concisas - Proporciona varias implementaciones de matrices LCP, estructuras de soporte para consultas de rango mínimo (RMQ) y muchas más estructuras de datos concisas.
  • Recorrido ascendente de árboles de sufijos emulado mediante arreglos de sufijos y arreglos LCP (Java)
  • Proyecto de indexación de texto (construcción en tiempo lineal de árboles de sufijos, arreglos de sufijos, arreglo LCP y transformada de Burrows-Wheeler ).