Estou preocupado com a questão do tempo de execução assintótico do algoritmo de Ukkonen , talvez o algoritmo mais popular para a construção de árvores de sufixo em tempo linear (?).
Aqui está uma citação do livro "Algoritmos sobre cordas, árvores e sequências" de Dan Gusfield (seção 6.5.1):
"... os algoritmos Aho-Corasick, Weiner, Ukkonen e McCreight exigem espaço ou o limite de tempo deve ser substituído pelo mínimo de e ".
[ é o comprimento da string e é o tamanho do alfabeto]
Não entendo por que isso é verdade.
- Espaço: bem, caso representemos ramificações fora dos nós usando matrizes de tamanho , então, de fato, acabamos com o uso de espaço Θ ( m | Σ | ) . No entanto, tanto quanto posso ver, também é possível armazenar os ramos usando tabelas de hash (por exemplo, dicionários em Python). Teríamos, então, apenas q ( m ) ponteiros armazenados em todas as tabelas de hash ao todo (uma vez que existem Θ ( m ) bordas na árvore), enquanto continuam sendo capazes de acessar os nós filhos em O ( 1 ) tempo, tão rápido quanto ao usar matrizes.
- Tempo : como mencionado acima, o uso de tabelas de hash nos permite acessar as ramificações de saída de qualquer nó no tempo . Como o algoritmo de Ukkonen requer operações O ( m ) (incluindo o acesso a nós filhos), o tempo de execução geral também seria O ( m ) .
Ficaria muito grato a você por qualquer sugestão sobre por que estou errado em minhas conclusões e por que Gusfield está certo sobre a dependência do algoritmo de Ukkonen no alfabeto.