Me preocupa la cuestión del tiempo de ejecución asintótico del algoritmo de Ukkonen , quizás el algoritmo más popular para construir árboles de sufijos en tiempo lineal (?).
Aquí hay una cita del libro "Algoritmos sobre cadenas, árboles y secuencias" de Dan Gusfield (sección 6.5.1):
"... los algoritmos Aho-Corasick, Weiner, Ukkonen y McCreight requieren espacio , o el límite de tiempo O ( m ) debe reemplazarse con el mínimo de O ( m log m ) y O ( m log | Σ | ) ".
[ es la longitud de la cadena y Σ es el tamaño del alfabeto]
No entiendo por qué eso es cierto.
- Espacio: bueno, en caso de que representemos ramas fuera de los nodos usando matrices de tamaño , entonces, de hecho, terminamos con el uso de espacio Θ ( m | Σ | ) . Sin embargo, hasta donde puedo ver, también es posible almacenar las ramas usando tablas hash (por ejemplo, diccionarios en Python). Entonces tendríamos solo Θ ( m ) punteros almacenados en todas las tablas hash en conjunto (ya que hay Θ ( m ) bordes en el árbol), mientras aún pudiéramos acceder a los nodos hijos en O ( 1 ) tiempo, tan rápido como cuando se usan matrices.
- Tiempo : como se mencionó anteriormente, el uso de tablas hash nos permite acceder a las ramas salientes de cualquier nodo en el tiempo . Dado que el algoritmo de Ukkonen requiere operaciones O ( m ) (incluido el acceso a nodos secundarios), el tiempo de ejecución general también sería O ( m ) .
Le estaría muy agradecido por cualquier pista sobre por qué estoy equivocado en mis conclusiones y por qué Gusfield tiene razón sobre la dependencia del algoritmo de Ukkonen en el alfabeto.