In che modo l'autonomia dell'algoritmo di Ukkonen dipende dalla dimensione dell'alfabeto?


19

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 | Σ | ) ".Θ(m|Σ|)O(m)O(mlogm)O(mlog|Σ|)

[ è la lunghezza della stringa e Σ è la dimensione dell'alfabeto]mΣ

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 )Θ(|Σ|)Θ(m|Σ|)Θ(m)Θ(m)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 ) .O(1)O(m)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.


3
Non credo ci sia alcuna prova dell'effetto che un limite temporale / spaziale indipendente dalla dimensione dell'alfabeto sia impossibile. Credo che Gusfield abbia fatto la dichiarazione perché non esiste un metodo noto per eliminare completamente il tempo. Per stabilirne uno, dovresti approfondire le tue funzioni di hash in modo più dettagliato. Un vero O (1) nel peggiore dei casi per la ricerca dell'hash richiede un hash perfetto. Non mi è chiaro come farlo durante l'algoritmo (perché le voci hash non sono statiche a quel punto).
jogojapan,

(proseguendo) Potresti farlo una volta che l'albero è completo, ma il tempo limite per l'algoritmo stesso rimarrebbe invariato. (+1 per la domanda però.)
jogojapan

Risposte:


2

O(1)O(1)Ω(Σ)Θ(mΣ)

Inoltre, in pratica, il tempo necessario per impostare tutte queste tabelle hash sarà molto più lungo del tempo necessario per impostare le matrici.

Potresti fare di meglio usando una tabella hash globale indicizzata con (nodo, carattere) -pairs, ma almeno l'argomento "solo ammortizzato" rimarrà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.