Drzewo sufiksowe

Drzewo sufiksowe – struktura danych reprezentująca zbiór sufiksów danego ciągu znaków w sposób umożliwiający efektywne wykonywanie wielu istotnych operacji na łańcuchach znaków.

Drzewo sufiksowe dla słowa BANANA zakończonego znakiem $. Liniami przerywanymi zaznaczono łącza sufiksowe.

Definicja

Drzewo sufiksowe dla słowa S nad alfabetem Σ {\displaystyle \Sigma } jest skompresowanym drzewem trie dla zbioru wszystkich niepustych sufiksów S. Stąd wynikają następujące własności:

  • istnieje jednoznaczna odpowiedniość między liśćmi drzewa a sufiksami S,
  • krawędzie drzewa są etykietowane niepustymi łańcuchami znaków,
  • wszystkie węzły wewnętrzne mają co najmniej dwóch synów.

Aby zapewnić spełnienie powyższych własności, na końcu słowa S umieszcza się znak spoza alfabetu, co gwarantuje, że żaden sufiks nie jest prefiksem innego sufiksu, a drzewo będzie posiadać dokładnie n {\displaystyle n} liści, po jednym dla każdego niepustego sufiksu słowa S. Ponieważ dodatkowo każdy węzeł wewnętrzny który nie jest korzeniem ma dwóch synów, takich węzłów może być co najwyżej ( n 1 ) , {\displaystyle (n-1),} więc całe drzewo jest liniowego rozmiaru (zawiera n + ( n 1 ) + 1 {\displaystyle n+(n-1)+1} wszystkich węzłów).

W drzewie mogą być przechowywane łącza sufiksowe (zaznaczone na rysunku liniami przerywanymi), które są podstawą do jednego ze sposobów konstrukcji drzewa sufiksowego w czasie liniowym względem długości słowa S. W każdym węźle wewnętrznym drzewa niebędącym korzeniem, do którego ścieżka prowadzi przez krawędzie, których etykiety składają się na słowo χ α {\displaystyle \chi \alpha } (gdzie χ Σ , α Σ {\displaystyle \chi \in \Sigma ,\alpha \in \Sigma ^{\ast }} ), przechowywane jest łącze do węzła reprezentującego podsłowo α . {\displaystyle \alpha .}

Historia

Koncepcję drzew sufiksowych (nazwanych wtedy drzewami pozycyjnymi) wprowadził Weiner w 1973 roku[1]. Konstrukcja została uproszczona przez McCreighta (1976). Ukkonen (1995) podał pierwszy liniowy algorytm konstrukcji drzewa sufiksowego online[2], znany jako Algorytm Ukkonena.

Uogólnione drzewo sufiksowe

Uogólnione drzewo sufiksowe dla słów ABAB (zakończony ciągiem $0) i BABA (zakończony ciągiem $1)

Uogólnione drzewo sufiksowe to drzewo sufiksowe zbudowane dla zbioru słów zamiast dla jednego słowa, reprezentujące wszystkie sufiksy słów z tego zbioru. W tym przypadku konieczne jest zakończenie każdego ze słów unikalnym znakiem lub słowem.

Zastosowania

Drzewa sufiksowe znajdują zastosowanie między innymi w bioinformatyce, gdzie służą do analizy łańcuchów DNA i sekwencji aminokwasów w białkach, oraz w kompresji danych (modyfikacje kompresji LZW).

Funkcjonalności

Drzewo sufiksowe dla słowa długości n {\displaystyle n} i uogólnione drzewo sufiksowe dla słów o łącznej długości n {\displaystyle n} można zbudować w czasie O ( n ) . {\displaystyle {\mathcal {O}}(n).} Po zbudowaniu może służyć między innymi do efektywnego wykonania następujących operacji:

  • znajdowanie dowolnego wystąpienia wzorca P długości m {\displaystyle m} jako podsłowa słowa S w czasie O ( m ) , {\displaystyle {\mathcal {O}}(m),}
  • znajdowanie wszystkich z {\displaystyle z} wystąpień wzorca P długości m {\displaystyle m} w słowie S w czasie O ( m + z ) , {\displaystyle {\mathcal {O}}(m+z),}
  • znajdowanie najdłuższego wspólnego podsłowa (spójnego podciągu) dwóch napisów długości n 1 {\displaystyle n_{1}} i n 2 {\displaystyle n_{2}} w czasie O ( n 1 + n 2 ) , {\displaystyle {\mathcal {O}}(n_{1}+n_{2}),}
  • znajdowanie najdłuższego podsłowa słowa S które powtarza się w tym słowie w czasie O ( n ) . {\displaystyle {\mathcal {O}}(n).}

Zobacz też

  • algorytm Knutha-Morrisa-Pratta – inna metoda szybkiej implementacji działań na łańcuchach znaków
  • skompresowane drzewo trie
  • tablica sufiksowa

Szczegóły implementacji

Drzewo sufiksowe można przechowywać w pamięci rozmiaru liniowego względem długości słowa S, utrzymując jako etykiety krawędzi drzewa pozycje początkowego i końcowego znaku etykiety zamiast wszystkich jej znaków.

Przypisy

  1. Weiner, P. „Linear pattern matching algorithm”. 14th Annual IEEE Symposium on Switching and Automata Theory (1973): 1-11.
  2. Ukkonen, E. „On-line construction of suffix trees”. Algorithmica 14, 1995, s. 249--260.[1].

Linki zewnętrzne

  • Wizualizacja drzewa sufiksowego

Bibliografia

  • Dan Gusfield: Algorithms on strings, trees, and sequences: computer science and computational biology. Cambridge [England]: Cambridge University Press, 1997. ISBN 0-521-58519-8.