sufijo autómata | |||||||
---|---|---|---|---|---|---|---|
inglés sufijo autómata gráfica de palabras acíclica dirigida | |||||||
| |||||||
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 | |||||||
|
|||||||
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 .
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] .
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] :
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] .
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:
|
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:
|
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:
|
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:
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 . |
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 |
---|
|
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] .
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:
|
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 :
|
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] .
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 | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
| ||||||||
|
| ||||||||
|
|
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] :
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.
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] .
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] .
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:
|
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] .
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] .
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] .
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] .
Instrumentos de cuerda | |
---|---|
Medidas de similitud de cadenas | |
Búsqueda de subcadena | |
palíndromos | |
Alineación de secuencia | |
Estructuras de sufijos | |
Otro |
Lenguajes formales y gramáticas formales | |
---|---|
Conceptos generales | |
tipo 0 | |
Tipo 1 |
|
Tipo 2 | |
tipo 3 |
|
analizando |