# Autômato finito determinístico acíclico

Em ciência da computação, um autômato finito determinístico acíclico (AFDA), também chamado de grafo orientado acíclico de palavras (GOAP; apesar desse nome também se referir a uma estrutura de dados relacionada que funciona como um índice de sufixo) é uma estrutura de dados que representa um conjunto de cadeias de caracteres, e permite uma operação de consulta que testa se uma dada cadeia pertence ao conjunto em tempo proporcional ao seu comprimento. Algoritmos existem para criar e manter tais autômatos, enquanto os mantêm mínimo.
Um AFDA é um caso especial de uma máquina de estados finitos que toma a forma de um grafo acíclico orientado com um único vértice fonte (um vértice que nenhuma aresta o têm como destino), em que cada aresta do grafo é rotulada por uma letra ou um símbolo, e em que cada vértice tem no máximo uma aresta que o têm como origem por símbolo. As sequências de caracteres representados pelo AFDA são formada pelos símbolos nos caminhos do grafo a partir do vértice fonte para o vértice sumidouro (ou poço) (um vértice que nenhuma aresta o têm como origem). De fato, um autômato finito determinístico é acíclico se, e somente se reconhece um conjunto finito de cadeias de caracteres.

## Comparação com Tries

Por permitir que os mesmos vértices possam ser alcançados por vários caminhos, um AFDA pode usar um número significativamente menor de vértices que uma trie. Considere, por exemplo, as quatro palavras em inglês "tap", "taps", "top", e "tops". Uma trie para essas quatro palavras teria 11 vértices, um para cada uma das cadeias formadas como um prefixo de uma dessas palavras, ou para uma das palavras seguidas pelo símbolo de fim da palavra. No entanto, um AFDA pode representar estas mesmas quatro palavras usando apenas seis vértices v$_i$ para 0 ≤ i ≤ 5, e as seguintes arestas: uma aresta de v$_0$ para v$_1$ rotulada de "t", duas arestas de v$_1$ a v$_2$ rotuladas de "a" e "s", uma aresta de v$_2$ para v$_3$ rotulada de "p", uma aresta v$_3$ para v$_4$ rotulada de "s", e as arestas que saem de v$_3$ e v$_4$ e chegam a v$_5$ rotuladas com o símbolo de fim da palavra. Existe uma escolha entre memória ou funcionalidade, porque um AFDA padrão pode dizer se uma palavra existe dentro dele, mas não pode fornecer informações auxiliares sobre essa palavra, enquanto que uma trie pode.
A principal diferença entre um AFDA e uma trie é a eliminação da redundância de sufixos e infixos no armazenamento de cadeias de caracteres. A trie elimina a redundância de prefixos, pois todos os prefixos comuns são compartilhados entre cadeias de caracteres, como por exemplo, entre cachos e cachorro o prefixo cacho é compartilhado. Em um AFDA sufixos comuns também são compartilhados, para palavras que tem o mesmo conjunto de possíveis sufixos entre si. Para um dicionário da língua portuguesa, isso resulta em uma grande redução de memória.
Porque os nós terminais de um AFDA podem ser alcançados por vários caminhos, um AFDA não tem a capacidade de armazenar informações auxiliares relativas a cada caminho, ex. a frequência de uma palavra na língua portuguesa. No entanto, se em cada nó fosse armazenado o número de caminhos únicos através daquele ponto na estrutura, poderíamos usá-lo para obter o índice de uma palavra, ou uma palavra dado o seu índice. As informações auxiliares então podem ser armazenados em um array.