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.
algorithms
data-structures
algorithm-analysis
strings
Mikhail Dubov
fonte
fonte
Respostas:
Como @jogojapan menciona nos comentários, geralmente, o hasing é apenas amortizado , portanto você só obteria limites amortizados para o algoritmo. No entanto, acho que você nem consegue: Para obter o hash O ( 1 ) amortizado , as tabelas de hash devem ser do tamanho Ω ( Σ ) , portanto, você ainda tem espaço Θ ( m Σ ) (e ao mesmo tempo requisito para inicialização).O ( 1 ) O ( 1 ) Ω ( Σ ) Θ ( m Σ )
Além disso, na prática, o tempo para configurar todas essas tabelas de hash será muito maior do que o tempo para configurar matrizes.
Você pode se sair melhor usando uma tabela de hash global indexada com (nó, caractere) -pairs, mas pelo menos o argumento "somente amortizado" permanecerá.
fonte