Ich beschäftige mich mit der Frage nach der asymptotischen Laufzeit des Ukkonen-Algorithmus , dem vielleicht beliebtesten Algorithmus zur Konstruktion von Suffix-Bäumen in linearer (?) Zeit.
Hier ist ein Zitat aus dem Buch "Algorithmen für Strings, Bäume und Sequenzen" von Dan Gusfield (Abschnitt 6.5.1):
"... die Algorithmen Aho-Corasick, Weiner, Ukkonen und McCreight benötigen entweder alle Platz, oder die O ( m ) -Zeitgrenze sollte durch das Minimum von O ( m log m ) und O ersetzt werden ( m log | Σ | ) ".
[ ist die Länge der Zeichenkette und Σ ist die Größe des Alphabets]
Ich verstehe nicht, warum das so ist.
- Raum: Nun, falls wir Zweige aus den Knoten mit Arrays der Größe , erhalten wir tatsächlich eine Raumnutzung von Θ ( m | Σ | ) . Soweit ich sehen kann, ist es jedoch auch möglich, die Zweige mithilfe von Hash-Tabellen zu speichern (z. B. Wörterbücher in Python). Wir würden dann nur Θ ( m ) Zeiger in allen Hash - Tabellen zusammen gespeichert (da es Θ ( m ) Kanten im Baum), während noch in der Lage zu sein , die Kinder - Knoten in dem Zugriff auf O ( 1 ) Zeit, so schnell wie bei der Verwendung von Arrays.
- Zeit : Wie oben erwähnt, können wir mithilfe von Hash-Tabellen in -Zeit auf die ausgehenden Zweige eines beliebigen Knotens zugreifen . Da der Ukkonen-Algorithmus O ( m ) -Operationen erfordert (einschließlich des Zugriffs auf untergeordnete Knoten), wäre die Gesamtlaufzeit dann auch O ( m ) .
Ich wäre Ihnen sehr dankbar für Hinweise, warum ich in meinen Schlussfolgerungen falsch liege und warum Gusfield in Bezug auf die Abhängigkeit des Ukkonen-Algorithmus vom Alphabet Recht hat.