Niepokoi mnie kwestia asymptotycznego czasu działania algorytmu Ukkonena , być może najpopularniejszego algorytmu do konstruowania drzewek sufiksów w czasie liniowym (?).
Oto cytat z książki „Algorytmy na strunach, drzewach i sekwencjach” Dana Gusfielda (sekcja 6.5.1):
„... wszystkie algorytmy Aho-Corasick, Weiner, Ukkonen i McCreight wymagają albo przestrzeni , albo ograniczenie czasowe O (m) należy zastąpić minimum O (m \ log m ) i O (m \ log | \ Sigma |) ".O ( m ) O ( m log m ) O ( m log | Σ | )
[ to długość łańcucha, a to rozmiar alfabetu]
Nie rozumiem, dlaczego to prawda.
- Space: cóż, w przypadku, gdy reprezentujemy gałęzie poza węzłami za pomocą tablic o rozmiarze , wówczas faktycznie kończy się użycie miejsca . Jednak, o ile widzę, możliwe jest również przechowywanie gałęzi za pomocą tabel skrótów (powiedzmy słowników w Pythonie). Wówczas mielibyśmy tylko wskaźniki zapisane we wszystkich tabelach skrótów (ponieważ w drzewie znajdują się krawędzie ), a jednocześnie nadal jesteśmy w stanie uzyskać dostęp do węzłów potomnych w czasie , tak szybko jak przy użyciu tablic.
- Czas : jak wspomniano powyżej, użycie tabel skrótów pozwala nam uzyskać dostęp do wychodzących gałęzi dowolnego węzła w czasie . Ponieważ algorytm Ukkonena wymaga operacji (w tym dostępu do węzłów potomnych), całkowity czas działania wyniósłby wówczas również .O ( m ) O ( m )
Byłbym bardzo wdzięczny za wszelkie wskazówki, dlaczego mylę się we wnioskach i dlaczego Gusfield ma rację co do zależności algorytmu Ukkonen od alfabetu.
algorithms
data-structures
algorithm-analysis
strings
Michaił Dubow
źródło
źródło
Odpowiedzi:
Jak wspomina @jogojapan w komentarzach, hasing zasadniczo jest tylko zamortyzowanym , więc otrzymasz tylko zamortyzowane granice algorytmu. Myślę jednak, że nawet ich nie otrzymujesz: aby uzyskać zamortyzowany hasz , tabele skrótów muszą mieć rozmiar , więc nadal masz przestrzeń ( i ten sam wymóg czasu inicjalizacji).O ( 1 ) Ω ( Σ ) Θ ( m Σ )O(1) O(1) Ω(Σ) Θ(mΣ)
Co więcej, w praktyce czas na ustawienie wszystkich tych tabel skrótów będzie znacznie dłuższy niż czas na ustawienie tablic.
Możesz lepiej sobie radzić przy użyciu globalnej tabeli skrótów, która jest indeksowana parami (węzeł, znak), ale przynajmniej pozostanie argument „tylko zamortyzowany”.
źródło