Mi preoccupo della questione del tempo di esecuzione asintotico dell'algoritmo di Ukkonen , forse l'algoritmo più popolare per la costruzione di alberi di suffissi in tempo lineare (?).
Ecco una citazione dal libro "Algorithms on archi, alberi e sequenze" di Dan Gusfield (sezione 6.5.1):
"... gli algoritmi di Aho-Corasick, Weiner, Ukkonen e McCreight richiedono entrambi spazio oppure il limite temporale O ( m ) deve essere sostituito con il minimo di O ( m log m ) e O ( m log | Σ | ) ".
[ è la lunghezza della stringa e Σ è la dimensione dell'alfabeto]
Non capisco perché sia vero.
- Spazio: bene, nel caso in cui si rappresentano dirama dei nodi che utilizzano array di dimensioni , poi, in effetti, si finisce con Θ ( m | Σ | ) l'utilizzo dello spazio. Tuttavia, per quanto posso vedere, è anche possibile memorizzare i rami usando tabelle hash (diciamo dizionari in Python). Avremmo quindi solo pointer ( m ) puntatori memorizzati in tutte le tabelle hash (dato che ci sono Θ ( m ) bordi nella struttura), pur potendo accedere ai nodi figli in O ( 1 ) tempo, veloce come quando si usano gli array.
- Tempo : come accennato in precedenza, l'utilizzo di tabelle hash ci consente di accedere ai rami in uscita di qualsiasi nodo in tempo. Poiché l'algoritmo di Ukkonen richiede operazioni O ( m ) (incluso l'accesso ai nodi figlio), il tempo di esecuzione complessivo sarebbe quindi anche O ( m ) .
Le sarei molto grato per qualsiasi suggerimento sul motivo per cui ho torto nelle mie conclusioni e perché Gusfield ha ragione sulla dipendenza dell'algoritmo di Ukkonen dall'alfabeto.