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
Dejarsea el array de sufijos de la cadenade longitud, dóndees una letra centinela que es única y lexicográficamente más pequeña que cualquier otro carácter.denota la subcadena deque van desdea. De este modo,es elel sufijo más pequeño de.
Dejardenota la longitud del prefijo común más largo entre dos cadenasyLuego, la matriz LCPes una matriz de enteros de tamañode tal manera queno está definido ypor cada. De este modoalmacena la longitud del prefijo común más largo de la lexicográficamenteel 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 cadena:
y su correspondiente matriz de sufijos ordenados :
Matriz de sufijos con los sufijos escritos verticalmente debajo:
Luego, la matriz LCPse construye comparando sufijos lexicográficamente consecutivos para determinar su prefijo común más largo:
Entonces, por ejemplo,es la longitud del prefijo común más largocompartido por los sufijosy. Tenga en cuenta queno 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 entiempo. Kärkkäinen y Sanders (2003) muestran que también es posible modificar sualgoritmo de tiempo tal que también calcula la matriz LCP. Kasai et al. (2001) presentan el primeroAlgoritmo 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.bytes, mientras que la salida original (texto, matriz de sufijos, matriz LCP) solo ocupabytes. 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 abytes. Kärkkäinen, Manzini y Puglisi (2009) proporcionan otro refinamiento del algoritmo de Kasai (-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 () 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ónde longitudes una subcadena de una cadenade longitudaceptatiempo si solo se utiliza la matriz de sufijos. Al utilizar adicionalmente la información LCP, este límite se puede mejorar atiempo. [ 3 ] Abouelhoda, Kurtz y Ohlebusch (2004) muestran cómo mejorar aún más este tiempo de ejecución para lograr un óptimotiempo. 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 entiempo. [ 2 ] [ 7 ] [ 8 ] [ 9 ]
El problema de la subcadena repetida más larga para una cadenade longitudse puede resolver entiempo usando ambos el array de sufijosy la matriz LCP. Basta con realizar un barrido lineal a través de la matriz LCP para encontrar su valor máximo.y el índice correspondientedóndese almacena. La subcadena más larga que aparece al menos dos veces se obtiene mediante.
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 dada(longitud) en un texto(longitud), [ 3 ]
- Utilizamos la búsqueda binaria contra el arreglo de sufijos depara encontrar la posición inicial y final de todas las ocurrencias de.
- 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 losSe 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 es.
La matriz LCP-LR ayuda a mejorar esto a, de la siguiente manera:
En cualquier punto durante el algoritmo de búsqueda binaria, consideramos, como de costumbre, un rango.del conjunto de sufijos y su punto centraly decidir si continuamos nuestra búsqueda en el subrango izquierdoo en el subrango correctoPara tomar la decisión, comparamosa la cuerda en. Sies idéntico a, nuestra búsqueda está completa. Pero si no, ya hemos comparado el primeropersonajes dey luego decidió sies lexicográficamente más pequeño o más grande que. Supongamos que el resultado es quees más grande que. Entonces, en el siguiente paso, consideramosy un nuevo punto centralen el centro:
M ...... M' ...... R | Sabemos: lcp(P,M)==k
El truco ahora es que LCP-LR se precalcula de tal manera que un-lookup nos dice el prefijo común más largo dey,.
Ya sabemos (del paso anterior) queen sí mismo tiene un prefijo depersonajes en común con:Ahora bien, existen tres posibilidades:
- Caso 1:, es decirtiene 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:, es decirtiene más caracteres de prefijo en común conquetiene en común con. En consecuencia, si comparáramosa, el prefijo común sería más pequeño que, ysería lexicográficamente más grande queAsí pues, sin hacer realmente la comparación, continuamos en la mitad izquierda..
- Caso 3:. Por lo tanto, M y M' son ambos idénticos conen el primeropersonajes. Para decidir si continuamos en la mitad izquierda o derecha, basta con compararacomenzando desde elel personaje.
- Continuamos recursivamente.
El efecto general es que ningún personaje dese 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 por, por lo que la complejidad total es realmente.
Todavía necesitamos precalcular LCP-LR para que pueda decirnos enCalcula 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 decirpara cualquier. Sin embargo,yEn la descripción anterior, las entradas no son necesariamente consecutivas.
La clave de esto es darse cuenta de que solo ciertos rangossiempre ocurrirá durante la búsqueda binaria: Siempre comienza cony 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.que posiblemente pueda desempeñar un papel durante la búsqueda binaria, y basta con precalcularypara aquellosrangos posibles. Entonces eso esvalores precalculados distintos, por lo tanto LCP-LR esen tamaño.
Además, existe un algoritmo recursivo sencillo para calcular elvalores de LCP-LR entiempo del arreglo LCP estándar.
En resumen:
- Es posible calcular LCP-LR entiempo yespacio de LCP.
- El uso de LCP-LR durante la búsqueda binaria ayuda a acelerar el procedimiento de búsqueda.a.
- Podemos usar dos búsquedas binarias para determinar el extremo izquierdo y derecho del rango de coincidencia paray 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 sufijosy la matriz LCPde una cuerdade longitud, su árbol de sufijosse puede construir entiempo 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.
Dejarsea el árbol de sufijos parciales para. Además, dejasea la longitud de la concatenación de todas las etiquetas de ruta desde la raíz deal nodo.

Comience con, el árbol que consta únicamente de la raíz. Para insertaren, suba por el sendero de la derecha comenzando en la hoja recién insertadahasta la raíz, hasta el nodo más profundoconse alcanza.
Necesitamos distinguir dos casos:
- : Esto significa que la concatenación de las etiquetas en la raíz-a-El camino es igual al prefijo común más largo de los sufijos.yEn este caso, insertecomo una nueva hojadel nodoy etiquetar el bordecon. Por lo tanto, la etiqueta del borde consta de los caracteres restantes del sufijoque no estén ya representadas por la concatenación de las etiquetas de la raíz aruta. Esto crea el árbol de sufijos parciales..

Caso 2 (): Para agregar sufijo, el borde del sufijo previamente insertadotiene que dividirse. El nuevo borde hacia el nuevo nodo interno se etiqueta con el prefijo común más largo de los sufijos.yLos bordes que conectan las dos hojas están etiquetados con los caracteres de sufijo restantes que no forman parte del prefijo. - : Esto significa que la concatenación de las etiquetas en la raíz-a-La ruta muestra menos caracteres que el prefijo común más largo de sufijos.yy los caracteres faltantes están contenidos en la etiqueta del borde deborde más a la derecha . Por lo tanto, tenemos que dividir ese borde de la siguiente manera: Seaser hijo deensu camino más a la derecha.
- Eliminar el borde.
- Agregar un nuevo nodo internoy un nuevo bordecon etiqueta. La nueva etiqueta consta de los caracteres faltantes del prefijo común más largo dey. Por lo tanto, la concatenación de las etiquetas de la raíz aLa ruta ahora muestra el prefijo común más largo dey.
- Conectaral nodo interno recién creadopor un bordeque está etiquetadoLa nueva etiqueta consta de los caracteres restantes del borde eliminado .que no se utilizaron como etiqueta de borde.
- Agregarcomo una nueva hojay conectarlo al nuevo nodo internopor un bordeque está etiquetado. Por lo tanto, la etiqueta del borde consta de los caracteres restantes del sufijoque no estén ya representadas por la concatenación de las etiquetas de la raíz acamino.
- Esto crea el árbol de sufijos parciales..
Un argumento de amortización simple muestra que el tiempo de ejecución de este algoritmo está acotado por:
Los nodos que se recorren en el pasosubiendo por el sendero más a la derecha de(aparte del último nodo)) se eliminan del camino más a la derecha , cuandose agrega al árbol como una nueva hoja. Estos nodos nunca se volverán a recorrer en todos los pasos subsiguientes.Por lo tanto, como máximoSe recorrerán todos los nodos.
Consultas LCP para sufijos arbitrarios
La matriz LCPsolo contiene la longitud del prefijo común más largo de cada par de sufijos consecutivos en la matriz de sufijosSin embargo, con la ayuda de la matriz de sufijos inversos(, es decir, el sufijoque comienza en la posiciónense almacena en posiciónen) y consultas mínimas de rango de tiempo constante en, es posible determinar la longitud del prefijo común más largo de sufijos arbitrarios entiempo.
Debido al orden lexicográfico de la matriz de sufijos, cada prefijo común de los sufijosytiene que ser un prefijo común de todos los sufijos entreposición de en el array de sufijosyposición de en el array de sufijosPor lo tanto, la longitud del prefijo más largo que comparten todos estos sufijos es el valor mínimo en el intervaloEste valor se puede encontrar en tiempo constante siSe preprocesa para consultas de rango mínimo.
Así, dada una cadenade longitud y dos posiciones arbitrarias en la cadena con, la longitud del prefijo común más largo de los sufijosyse puede calcular de la siguiente manera:.
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 .
Enlaces externos
- 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 ).
- Matrices
- Índices de subcadenas
- Estructuras de datos de cadena