Sufijo autómata

sufijo autómata
inglés  sufijo
autómata  gráfica de palabras acíclica dirigida

Sufijo autómata para abcbc
Tipo de Índice de subcadena
año de invención 1983
Autor Anselm Bloomer, Janet Bloomer, Andrzej Ehrenvecht , David Haussler , Ross McConnell
Complejidad en los símbolos O
Lo peor
Edificio
Consumo de memoria
 Archivos multimedia en Wikimedia Commons

Sufijo autómata ( inglés  sufijo autómata , gráfico de palabra acíclica dirigida ) es una estructura de datos que le permite almacenar en forma comprimida y procesar información asociada con subcadenas de una cadena dada. Representa un autómata finito determinista que acepta todos los sufijos de una palabra y solo ellos, y tiene el menor número posible de estados entre todos esos autómatas. Menos formalmente, un sufijo autómata es un gráfico acíclico dirigido con un vértice inicial distinguido símboloslosestán etiquetados conarcosy un conjunto de vértices "finales", concatenan , forman un sufijo dado. De todos los grafos que satisfacen esta descripción, el sufijo autómata es el que tiene el menor número posible de vértices .

El sufijo autómata fue descrito por primera vez por un grupo de científicos de la Universidad de Denver y Colorado en 1983, también demostraron que el tamaño del autómata depende linealmente de la longitud y también propusieron un algoritmo en línea para construirlo con un tiempo de ejecución lineal . En trabajos posteriores sobre este tema, se descubrió una estrecha conexión entre el autómata de sufijos y los árboles de sufijos , y el concepto de autómata de sufijos recibió varias generalizaciones. Así, se introdujo un autómata de sufijos comprimidos, obtenido del original por un procedimiento similar al que se aplica a un sufijo boro para obtener un árbol de sufijos, así como un autómata de sufijos generalizado, que se construye para un conjunto de palabras y acepta palabras que son sufijos de al menos uno de los datos .

Con la ayuda de un autómata de sufijos, puede resolver eficazmente problemas tales como buscar una subcadena en una cadena , determinar la subcadena común más grande de dos o más cadenas y otros .

Historia

El concepto de sufijo autómata fue introducido por un grupo de científicos de la Universidad de Denver y Colorado Anselm Blumer, Andrzej Ehrenvecht , David Haussler , Ross McConnell y Janet Bloomer en 1983, aunque se encontraron estructuras relacionadas con él. anteriormente en el trabajo de Peter Weiner [1] , Vaughn Pratt [2] y Anatoly Olesevich Slisenko [3] dedicado a los algoritmos para construir árboles de sufijos . En el mismo trabajo, Bloomer y otros demostraron que un autómata construido a partir de una palabra de mayor longitud no contiene más estados ni más transiciones, y también presentó un algoritmo lineal para construir un autómata [4] .

En 1983, Mu Tian Chen y Joel Seiferas desarrollaron de forma independiente un algoritmo para construir un autómata de sufijos que muestra que el algoritmo de Weiner [1] propuesto en 1973 para construir un árbol de sufijos de palabras también construye un autómata de sufijos para la palabra invertida como estructura auxiliar [5] . En 1987, Bloomer y otros, por analogía con un árbol de sufijos, describieron un autómata de sufijos comprimido [6] obtenido a partir de un autómata de sufijos eliminando estados no finales con un resultado semigrado igual a uno, y en 1997 Maxime Crochemore y Renaud Verin desarrolló un algoritmo lineal para su construcción directa [7] . En 2001, Shunsuke Inenaga y otros desarrollaron un algoritmo lineal en línea para construir un autómata de sufijos comprimidos [8] , así como un algoritmo lineal para construir un autómata de sufijos comprimidos para un conjunto de palabras dadas por un árbol de prefijos [9] .

En su artículo original, Bloomer y sus colegas definieron la estructura que describieron como un autómata mínimo que reconoce todas las subcadenas (no los sufijos) de una palabra determinada. Llamaron a esta estructura un gráfico de palabras acíclicas dirigidas [ 4 ] .  Posteriormente, este nombre también se usó como sinónimo de un autómata finito acíclico determinista : un autómata mínimo que reconoce un conjunto finito arbitrario de palabras (que no constituyen necesariamente un conjunto de sufijos o subcadenas de una determinada cadena) [10] [ 11] .

Notación

Cuando se describen autómatas con sufijos y hechos y teoremas relacionados, a menudo se utilizan notaciones de la teoría de los lenguajes formales en general y de la teoría de los autómatas en particular [12] :

Estructura del autómata

Formalmente, un autómata finito determinista se define por un conjunto de cinco elementos donde:

Muy a menudo, en la práctica, los autómatas finitos se representan como un gráfico dirigido ( diagrama ) tal que [13] :

En dicho gráfico, los vértices y arcos se identifican con estados y transiciones del autómata, respectivamente. El autómata acepta una palabra si y sólo si hay un camino desde el estado inicial hasta algún estado final , de modo que si concatenamos los símbolos que se encuentran en este camino, obtenemos la palabra . El conjunto de palabras que un autómata acepta del lenguaje de este autómata [12] .

Estados autómatas

El contexto correcto de una palabra en relación con el idioma se llama el conjunto . Es decir, se trata de un conjunto de palabras , atribuyéndolas a la palabra de la derecha resulta una palabra del idioma . Los contextos correctos inducen una relación de equivalencia natural en el conjunto de todas las palabras. Si un lenguaje puede ser definido por algún autómata finito determinista, entonces para él existe un único, hasta el isomorfismo , autómata, que al mismo tiempo tiene el menor número posible de estados. Tal autómata se llama mínimo para un lenguaje dado , el teorema de Myhill-Nerode nos permite especificarlo explícitamente [14] [15] :

Un autómata mínimo que reconoce un idioma sobre un alfabeto se puede dar de la siguiente manera:

  • El alfabeto permanece sin cambios.
  • Los estados corresponden a los contextos correctos de todas las palabras ,
  • El estado inicial corresponde al contexto derecho de la palabra vacía ,
  • Los estados finales corresponden a los contextos correctos de las palabras del idioma ,
  • Las transiciones tienen la forma , donde y .

En tal notación, un sufijo autómata  es un DFA mínimo que acepta la palabra sufijo lenguaje . El contexto correcto de una palabra relativo a un idioma dado consiste en palabras tales que  - sufijo . Esto nos permite formular el siguiente lema, que define una correspondencia biunívoca entre el contexto correcto de una palabra y el conjunto de posiciones de sus ocurrencias en una subpalabra [16] [17] :

Sea el conjunto de posiciones correctas de ocurrencias en .

Entre los elementos de los conjuntos y existe la siguiente correspondencia biunívoca:

  • Si , entonces ;
  • Si , entonces .

Por ejemplo, para una palabra y su subpalabra , y . Informalmente, consta de palabras que siguen a las ocurrencias hasta el final de la palabra, y  - desde las posiciones de estas ocurrencias. En este ejemplo, el elemento coincide con la palabra . Al mismo tiempo, el elemento corresponde a la palabra .

De aquí se sigue una serie de propiedades estructurales de los estados del sufijo autómata y las palabras que aceptan. Sea , entonces [17] :

Por lo tanto, cualquier estado del autómata de sufijos acepta alguna cadena continua de sufijos anidados de la cadena más grande de este estado [17] .

La extensión izquierda de una cadena es la cadena más larga que tiene el mismo contexto derecho que . La longitud de la cadena más larga aceptada por el estado se indica como . Es verdad para él que [18] :

La extensión izquierda de una cadena se puede representar como , donde es la palabra más larga tal que cualquier aparición de una palabra en está precedida por la palabra .

Un enlace de sufijo de un estado es un puntero al estado que contiene el sufijo más grande que no es  aceptado por el estado .

En esta notación, podemos decir que el estado toma exactamente todos los sufijos que son más largos que y no más largos que . Además, lo siguiente es cierto [18] :

Los enlaces de sufijo forman un árbol , que se puede especificar explícitamente de la siguiente manera:

  1. Los vértices corresponden a las expansiones izquierdas de todas las subcadenas ,
  2. Los bordes conectan vértices tales que y .

Conexión con el árbol de sufijos

Un árbol de prefijos (o taladro ) es un árbol orientado a la raíz, cuyos arcos están marcados con símbolos de tal manera queno sale más de un arco de cualquier vértice de este árbol , etiquetado con un símbolo dado. Algunos vértices del árbol de prefijos están etiquetados. Se dice que un árbol de prefijos define un conjunto de palabras definidas por caminos desde la raíz del árbol hasta los vértices etiquetados. Por lo tanto, los árboles de prefijos son un tipo especial de autómatas finitos, si consideramos la raíz como el estado inicial y los vértices etiquetados como los estados finales [19] . El sufijo boro de una palabraes un árbol de prefijos que define el idioma de los sufijos de esta palabra. Un árbol de sufijos es un árbol obtenido a partir de un taladro de sufijos mediante un procedimiento de compresión, en el que las aristas sucesivas se pegan entre sí si hay un vértice no final entre ellas, cuyo grado es 2 [18] .

Por definición, se puede obtener un autómata de sufijo minimizando un orificio de sufijo. Además, se puede obtener un autómata de sufijos comprimidos tanto minimizando un árbol de sufijos (asumiendo que los símbolos del alfabeto son palabras en los bordes del árbol) como comprimiendo un autómata convencional [8] . Sin embargo, además de la conexión obvia entre el autómata de sufijos y el árbol de sufijos de la misma cadena, también se puede establecer alguna correspondencia entre el autómata de sufijos de una cadena y el árbol de sufijos de una cadena invertida [20] .

De manera similar a los contextos de la derecha, se pueden introducir contextos de la izquierda y extensiones de la derecha correspondientes a las cadenas más largas que tienen un contexto de la izquierda dado, así como una relación de equivalencia . Si consideramos las extensiones correctas con respecto al idioma del prefijo de cadena , entonces podemos obtener eso [18] :

El árbol de sufijos de una cadena se puede especificar explícitamente de la siguiente manera:

  • Los vértices corresponden a las extensiones derechas de todas las subcadenas ,
  • Las aristas corresponden a ternas tales que y .

Aquí, el triple significa que la cadena de a está escrita en el borde .

De lo cual se deduce que el árbol de enlaces de sufijos para un autómata de cadenas y el árbol de sufijos de una cadena son isomorfos [20] :

Estructuras de sufijos de las palabras abbcbc y cbcbba 

De manera similar a las extensiones por la izquierda, también se puede formular un lema estructural [18] para las extensiones por la derecha :

La extensión derecha de una cadena se puede representar como , donde es la palabra más larga tal que cualquier aparición de in va seguida inmediatamente por la palabra .

Tamaño

En un autómata de sufijos, las cadenas de longitud no son más que estados y no más que transiciones, y estas estimaciones se logran en cadenas y, respectivamente [16] . También es posible formular una declaración más fuerte sobre la relación entre el número de estados y transiciones en un autómata: , donde y  son el número de transiciones y estados, respectivamente [17] .

Autómatas de sufijo máximo 

Edificio

El sufijo autómata de una cadena se construye construyendo sucesivamente la palabra para la que se construye. Inicialmente, se construye un autómata trivial para una palabra vacía, y luego en cada paso se agrega un símbolo a la palabra actual, lo que implica un reordenamiento de estados y transiciones del autómata [21] .

Cambio de estados

Después de asignar un nuevo carácter a una palabra, algunas clases de equivalencia cambiarán. Sea  el contexto correcto de la palabra con respecto al sufijo idioma de la palabra . Luego, la transición de a cuando se asigna un símbolo a una palabra se describe mediante el siguiente lema [17] :

Sean algunas palabras sobre un alfabeto y sean algún símbolo de este alfabeto. Entonces entre los contextos correctos y las palabras con respecto a los idiomas de los sufijos de las palabras y, respectivamente, se da la siguiente relación:

  • si - sufijo ;
  • de lo contrario.

Es decir, cuando se agrega un carácter a la palabra actual, el contexto correcto de la palabra solo puede cambiar si es un sufijo de palabra . De esto se sigue que la partición de todas las palabras en clases de equivalencia con respecto a es un refinamiento de la partición en clases de equivalencia con respecto a . En otras palabras, si , entonces . Además, al agregar el siguiente símbolo a la palabra, la división se producirá en no más de dos estados. En primer lugar, se dividirá el estado que corresponde al contexto derecho vacío (es decir, el que toma el idioma de las palabras que no se incluyen como subpalabra). De este estado, se extraerá un nuevo estado que contiene la palabra completa , así como todos sus sufijos que ocurren pero no ocurrieron en . En consecuencia, el contexto correcto de estas palabras, que antes estaba vacío, ahora consistirá solo en la palabra vacía [17] .

Teniendo en cuenta la conexión entre los estados del autómata de sufijos y los vértices del árbol de sufijos, también podemos rastrear el segundo estado, que puede dividirse cuando se agrega el siguiente símbolo. Dado que una transición de palabra -to corresponde a una transición a-to para una cadena invertida, asignar un carácter a una cadena corresponde a agregar un sufijo nuevo (el más largo) al árbol de sufijos de la cadena . En este caso, no aparecerán más de dos vértices: uno de ellos corresponderá a la palabra entera , y el otro podrá aparecer en el lugar donde se encuentra la rama del árbol. Por lo tanto, un nuevo estado corresponde al contexto correcto de toda la cadena y el otro (si lo hay) solo puede corresponder a la referencia del sufijo de ese estado. Estas observaciones pueden generalizarse mediante el teorema [17] :

Sea y . Sea también el sufijo más largo que ocurre en , y sea su extensión izquierda con respecto a , es decir, la subpalabra más larga de la palabra tal que . Entonces lo siguiente es cierto para cualquier subpalabra de la palabra :

  • Si y , entonces ;
  • Si y , entonces ;
  • Si y , entonces .

En particular, si (por ejemplo, cuando no ocurre en absoluto en y ), no ocurre la división del segundo estado [17] .

Además de los enlaces de sufijos, los estados finales también deben definirse en el nuevo autómata. De las propiedades estructurales del autómata se sigue que los sufijos de cualquier palabra están ubicados de tal manera que si , entonces los sufijos cuya longitud excede , se encuentran en , los sufijos cuya longitud es mayor que , pero no mayor que , se encuentran en , y pronto. En otras palabras, para cualquier sufijo hay un vértice en el estado del sufijo path , que viene dado por la secuencia . En consecuencia, si designamos el estado que actualmente acepta toda la cadena como , entonces los estados del terminal (que aceptan sufijos ) serán aquellos y solo aquellos estados que están incluidos en la ruta del sufijo [21] .

Cambio de saltos y enlaces de sufijos

Cualquier cambio al agregar el siguiente carácter no afecta a más de dos nuevos estados, por lo que los cambios en las transiciones del autómata también afectarán solo a estos estados. Después de la atribución a la palabra , se forma un nuevo estado y también, posiblemente, un estado . El sufijo link from conducirá a , y from  -to . Las palabras from ocurren solo como sufijos, por lo que no debe haber transiciones from, y las transiciones que conducen a ella deben comenzar por carácter de sufijos con una longitud de al menos . El estado se separa de , por lo que las transiciones desde este estado duplicarán las de . Y las transiciones que conducen a él conducirán por símbolo de estados correspondientes a sufijos de longitud menor que y no menor que , ya que antes estas transiciones conducían y correspondían a la parte separada del estado. Los estados que aceptan estas palabras se pueden identificar mediante la ruta del sufijo de estado [21] .

Construyendo un sufijo autómata para la palabra abcbc 
∅ → un
Cuando se agrega el primer símbolo, se crea un único estado nuevo en el autómata. De manera similar, se agrega una sola hoja al árbol de sufijos.
a→ab
Se extraen nuevas transiciones de todos los estados finales, ya que el nuevo símbolo no se ha encontrado antes. Por la misma razón, en un árbol de enlaces de sufijos, el nuevo nodo se suspende desde la raíz.
ab → abb
El estado 2 toma las palabras ab y b , pero solo b se convertirá en un sufijo, por lo que esa palabra se asigna al estado 4. En el árbol de sufijos de la palabra expandida, esto corresponde a la división del borde que conduce al vértice 2.
abb → abbc
El nuevo símbolo no se ha visto antes, las transiciones se llevan a cabo desde todos los finales. Se agrega una nueva hoja al árbol de enlaces de sufijos suspendidos de la raíz.
abbc → abbcb
En el estado 4, solo existe la palabra b y es un sufijo, por lo que no se produce división. En consecuencia, en el árbol de enlaces de sufijos, una nueva hoja se suspende del vértice 4.
abbcb → abbcbc
El estado 5 acepta las palabras abbc , bbc , bc y c , pero solo las dos últimas son sufijos de la nueva palabra, por lo que se separan en un estado 8 separado. En consecuencia, en el árbol de enlaces de sufijos, el borde que conduce al vértice 5 se divide.


Algoritmo para la construcción de un autómata

Los resultados teóricos anteriores conducen al siguiente algoritmo, que toma un símbolo y reorganiza un autómata de sufijo de palabra en un autómata de sufijo de palabra [21] :

  1. Se admite un número de estado correspondiente a toda la línea ;
  2. Cuando se agrega un símbolo , el número se almacena en la variable , y se escribe el número del nuevo estado correspondiente a la palabra ;
  3. De los estados correspondientes a los sufijos , se añaden transiciones a . Para hacer esto, se pasa por alto la ruta del sufijo hasta que se encuentra un estado desde el cual ya hay una transición a lo largo de ;
  4. Otras acciones corresponden a uno de los tres casos:
    1. Si en toda la ruta del sufijo no hay transición de ningún estado a , entonces no se ha encontrado previamente en y el enlace del sufijo de conduce a ;
    2. Si se encontró la transición por y conduce de estado a estado tal que , entonces no hay necesidad de dividir y es suficiente dibujar un enlace de sufijo de a ;
    3. Si , entonces las palabras del estado cuya longitud no exceda deben separarse en un estado separado ;
  5. Si se seleccionó un estado separado en el paso anterior , entonces las transiciones y el enlace de sufijo deberían duplicarse en , mientras que se convertirá en un enlace de sufijo común de los estados y ;
  6. Los saltos que conducen a palabras coincidentes de longitud no superior a , se redirigen a . Para hacer esto, puede continuar siguiendo la ruta del sufijo hasta que encuentre un estado, cuya transición no conduzca a .

El procedimiento que implementa este algoritmo se puede describir mediante el siguiente pseudocódigo:

función add_letter(x) : definir p = último asignar último = nuevo_estado() asignar len(último) = len(p) + 1 hasta que se defina δ(p , x) : asignar δ(p, x) = último, p = link(p) define q = δ(p, x) if q = last : asigna link(last) = q 0 else if len(q) = len(p) + 1 : asigna link(last) = q else : define cl = nuevo_estado() asignar len(cl) = len(p) + 1 asignar δ(cl) = δ(q), enlace(cl) = enlace(q) asignar enlace(último) = enlace(q) = cl while δ(p, x) = q : asignar δ(p, x) = cl, p = enlace(p)

Aquí  , es el estado inicial del autómata, y  es una función que agrega un nuevo estado al autómata. Se supone que , y se almacenan como variables globales.

Complejidad computacional

Según las estructuras utilizadas, se puede implementar una versión determinista del algoritmo descrito anteriormente en tiempo de memoria o en tiempo de memoria , suponiendo que la asignación de memoria se produzca en . Al mismo tiempo, para obtener tal estimación del tiempo de ejecución, es necesario realizar un análisis de amortización de los ciclos internos del algoritmo. Si consideramos cómo cambia el parámetro después de la primera iteración del primer ciclo, podemos ver que disminuye estrictamente con cada iteración del ciclo. Además, si en la última iteración del paso anterior este valor era igual a , entonces en la segunda iteración del siguiente paso este valor será igual a . Que no exceda en ningún instante de tiempo, y que entre ciclos esta cantidad aumente en uno solo, da la afirmación requerida. Un análisis similar puede mostrar la linealidad del tiempo total de ejecución del segundo ciclo del algoritmo [21] .

Variaciones y generalizaciones

El autómata de sufijos está estrechamente relacionado con otras estructuras de sufijos e índices de subcadenas . Teniendo un autómata de sufijos de alguna cadena, es posible construir un árbol de sufijos de esta cadena en tiempo lineal mediante compresión y recorrido recursivo de este autómata [22] . Son posibles transformaciones similares en ambas direcciones entre un autómata de sufijo de cadena y un árbol de sufijo de cadena invertido [20] . Además, se han desarrollado una serie de modificaciones del algoritmo que permiten construir un autómata para un conjunto de cadenas dadas por un árbol de prefijos [9] , aplicarle compresión [6] , mantener su estructura en modo ventana deslizante [23] , y también reconstruir al agregar caracteres tanto desde el final como desde el comienzo de la cadena [24] .

Autómata de sufijo comprimido

Como se mencionó anteriormente, se puede obtener un autómata de sufijo comprimido a partir de un autómata de sufijo ordinario mediante compresión (eliminando estados que no son finales y de los que conduce exactamente una transición), así como minimizando el árbol de sufijos, si asumimos que el alfabeto es formado por palabras escritas en los bordes del árbol. Además, los estados de un autómata comprimido se pueden describir explícitamente, de forma similar a como se hizo para un autómata sin comprimir. Una extensión de palabra bidireccional es la palabra más larga , de modo que cualquier ocurrencia en está precedida por una palabra e inmediatamente seguida por una palabra . En términos de extensiones izquierda y derecha, esto significa que la extensión bidireccional es la extensión izquierda de la extensión derecha o, de manera equivalente, la extensión derecha de la extensión izquierda: . En términos de extensiones bilaterales, un autómata de sufijo comprimido se puede describir de la siguiente manera [18] :

El sufijo comprimido autómata de una palabra puede estar dado por el par , donde:

  • es el conjunto de estados del autómata;
  • - un conjunto de transiciones del autómata.

Las extensiones bidireccionales generan una relación de equivalencia que describe las palabras aceptadas por el mismo estado del autómata comprimido. Esta relación es un cierre transitivo de la relación , que enfatiza el hecho de que los estados de un autómata de sufijo comprimido se pueden obtener pegando vértices de árboles de sufijos que son equivalentes en términos de (minimización del árbol de sufijos) y pegando estados de un autómata de sufijos que son equivalentes en términos de (comprimir sufijo autómata) [25 ] . Si las palabras y tienen las mismas extensiones a la derecha, y las palabras y  tienen las extensiones a la izquierda, entonces en conjunto las palabras , y tienen la misma extensión bilateral. En este caso, puede resultar que las palabras y no tengan las mismas extensiones izquierda o derecha. En el caso de , y las extensiones izquierda y derecha son: , pero y . En el caso de contextos y extensiones unidireccionales, las palabras de la misma clase de equivalencia formaban una cadena continua de prefijos o sufijos anidados y podían determinarse únicamente por la longitud de las palabras más cortas y más largas de la clase. En el caso de las extensiones bidireccionales, solo se puede decir con certeza que las palabras de la misma clase son subpalabras de la palabra más larga de esta clase y, de lo contrario, las clases pueden tener una estructura bastante compleja. El número total de tales clases de equivalencia no excede , lo que implica que un autómata de sufijo comprimido de una cadena de longitud tendrá como máximo estados. El número de transiciones en tal autómata no excede [18] .

Sufijo autómata para un conjunto de cadenas

Deje que se dé un conjunto de palabras . De manera similar a un autómata construido sobre una sola palabra , podemos considerar un autómata de sufijo generalizado que acepta el lenguaje de las palabras que son el sufijo de al menos una palabra de . En este caso, para el número de estados y transiciones de este autómata, se cumplirán todas las mismas restricciones que se indicaron anteriormente si ponemos [25] . El algoritmo de construcción en sí es esencialmente similar al algoritmo para construir un autómata para una línea, pero en lugar de un puntero al estado correspondiente a la palabra , al pasar a la palabra , la función agregar_letra tomará un puntero al estado que acepta el word , lo que implica que la transición se produce desde el conjunto actual de palabras al conjunto . Además de las acciones principales que ya están incluidas en el algoritmo, será necesario analizar por separado el caso cuando la cadena ya esté presente en la máquina; en este caso, es posible que deba dividir el estado que la acepta, similar a cómo sucedió al formar un enlace de sufijo en el algoritmo para una sola palabra [26] [27] .

Un desarrollo posterior de esta idea fue la construcción de un autómata de sufijos para el caso en que el conjunto no se especifica de forma explícita, sino como un árbol de prefijos en los vértices. Mohry y otros han demostrado que tal autómata contiene en la mayoría de los estados y puede construirse en el tiempo lineal en su tamaño. Al mismo tiempo, la cantidad de transiciones en dicho autómata puede alcanzar  ; por ejemplo, si consideramos un conjunto de palabras sobre el alfabeto , entonces la longitud total de las palabras de este conjunto será del orden de , la cantidad de vértices en el árbol de prefijos correspondiente será igual a , y en el sufijo autómata habrá un orden de estados y transiciones. El algoritmo en sí, propuesto por Mohri, repite en gran medida el algoritmo general para construir un autómata a partir de un conjunto de cadenas, pero en lugar de agregar cada vez los caracteres de una palabra del conjunto de principio a fin, el algoritmo atraviesa el árbol de prefijos en el orden de recorrido en ancho y asigna los siguientes caracteres en ese orden, en el que los encuentra durante el recorrido, lo que garantiza un tiempo de ejecución lineal amortizado del algoritmo [28] .

Ventana corrediza

En algunos algoritmos de compresión , como LZ77 y RLE , puede ser útil almacenar un autómata de sufijo o una estructura similar no para la palabra de lectura completa, sino solo para los últimos caracteres. En primer lugar, surge tal necesidad debido a las características específicas de las tareas de compresión de datos, donde las cadenas comprimidas suelen ser bastante grandes y el uso de la memoria no es deseable. En 1985, Janet Bloomer desarrolló un algoritmo que admite un autómata de sufijos en una ventana de tamaño deslizante y se ejecuta en el peor de los casos y en el promedio, suponiendo que los caracteres de la palabra que se va a comprimir se distribuyen de manera independiente y uniforme . En el mismo trabajo se demostró que la estimación es inmejorable - si consideramos palabras obtenidas por formaconcatenación de varias palabras de la para un sufijo autómata es imposible [29] .

Parecería que lo mismo debería ser cierto para el árbol de sufijos , ya que los vértices del árbol de sufijos corresponden a los estados del autómata de sufijos de la cuerda desplegada. Sin embargo, si no se asigna un vértice separado para cada sufijo en el árbol de sufijos, entonces no habrá saltos tan bruscos y es posible la construcción de un algoritmo amortizado que admita el árbol de sufijos en una ventana deslizante. Un algoritmo correspondiente para un árbol de sufijos, basado en el algoritmo de McCraith y que permite agregar un nuevo carácter a la derecha y eliminar un carácter a la izquierda, fue propuesto en 1989 por Edward Fiala y Daniel Green [30] , y en 1996 expuesto en términos del algoritmo de Ukkonen por Jesper Larsson [31] [ 32] . En este sentido, la cuestión de si es posible mantener una ventana deslizante rápida para un autómata comprimido, que combina algunas propiedades tanto de un autómata de sufijos ordinarios como de un árbol de sufijos, permaneció abierta durante mucho tiempo. Martin Senft y Tomasz Dvorak obtuvieron una respuesta negativa a esta pregunta en 2008, quienes demostraron que si el alfabeto consta de dos o más caracteres, entonces el tiempo amortizado requerido para cambiar la ventana un carácter en el peor de los casos es del orden de [33] .

Al mismo tiempo, si el ancho exacto de la ventana no es importante y el objetivo es solo mantener una ventana cuyo ancho no exceda , en orden de magnitud, esto se puede hacer con el algoritmo aproximado propuesto por Inenaga et al. 2004. Una característica del algoritmo es que la “ventana” que se mueve a lo largo de la palabra tiene una longitud variable, que en cualquier momento no es ni menor ni mayor que , mientras que el tiempo total de ejecución sigue siendo lineal [34] .

Aplicaciones

El autómata de sufijo de cadena se puede utilizar para resolver problemas como [35] [36] :

Aquí vale la pena considerar que se ingresa alguna cadena cuando el autómata ya se ha construido y está listo para usar.

Los autómatas de sufijos también se han abierto paso en aplicaciones como la compresión de datos [37] , la identificación de música a partir de fragmentos grabados [38] [39] y la coincidencia de secuencias genómicas [40] .

Notas

  1. ↑ 1 2 Weiner, 1973
  2. Pratt, 1973
  3. Slisenko, 1983
  4. ↑ 1 2 Blumer et al., 1984 , pág. 109-110
  5. Chen, Seiferas, 1985 , pág. 97
  6. ↑ 12 Blumer et al., 1987 , pág. 578
  7. Crochemore, Verín, 1997 , pág. 192
  8. ↑ 1 2 Inenaga et al., 2005 , págs. 156-158
  9. ↑ 1 2 Inenaga et al., 2001 , pág. una
  10. Perrin, 1990 , pág. diez
  11. Sgarbas et al., 2003 , pág. 2
  12. ↑ 1 2 Crochemore, Hancart, 1997 , págs. 3-6
  13. Serebryakov et al., 2006 , pág. 50-54
  14. Rubtsov, 2019 , pág. 89-94
  15. Hopcroft, Ullman, 1979 , págs. 65-68
  16. ↑ 12 Blumer et al., 1984 , págs. 111-114
  17. ↑ 1 2 3 4 5 6 7 8 Crochemore, Hancart, 1997 , págs. 27-31
  18. ↑ 1 2 3 4 5 6 7 Inenaga et al., 2005 , págs. 159-162
  19. Rubinchik, Shur, 2018 , págs. 1-2
  20. ↑ 1 2 3 Fujishige et al., 2016 , págs. 1-3
  21. ↑ 1 2 3 4 5 Crochemore, Hancart, 1997 , págs. 31-36
  22. Parashchenko, 2007 , pág. 19-22
  23. Blumer, 1987 , pág. 451
  24. Inénaga, 2003 , p. una
  25. ↑ 1 2 Blumer et al., 1987 , págs. 585-588
  26. Blumer et al., 1987 , págs. 588-589
  27. Blumer et al., 1987 , pág. 593
  28. Mohri et al., 2009 , págs. 3558-3560
  29. Blumer, 1987 , págs. 461-465
  30. Fiala, Greene, 1989 , pág. 490
  31. Larson, 1996
  32. Brodnik, Jekovec, 2018 , pág. una
  33. Senft, Dvorak, 2008 , pág. 109
  34. Inénaga et al., 2004
  35. Crochemore, Hancart, 1997 , págs. 39-41
  36. Crochemore, Hancart, 1997 , págs. 36-39
  37. Yamamoto et al., 2014 , pág. 675
  38. Crochemore et al., 2003 , pág. 211
  39. Mohri et al., 2009 , pág. 3553
  40. Faro, 2016 , pág. 145

Literatura

Enlaces