Pokażemy konstruktywnie następujący istotny fakt:
jeśli znamy tablicę sufiksową i tablicę lcp, to drzewo sufiksowe dla danego tekstu możemy łatwo skonstruować w czasie liniowym.
Przypuśćmy, że SUF = [i1,i2,…,in], a więc:
sufiksi1<sufiksi2<sufiksi3<…sufiksin.
Algorytm Drzewo-Sufiksowe
T := drzewo reprezentujące sufiks(i_1) (jedna krawędź); for k:=2 to n do wstaw nową ścieżkę o sumarycznej etykiecie sufiks(i_k) do T;
Rysunek 3: Wstawianie kolejnego sufiksu sufiksik do drzewa sufiksowego, przed włożeniem wszystkie krawędzie ścieżki roboczej od u do korzenia są skierowane w lewo.
Opiszemy w jaki sposób wstawiamy kolejny sufiks β do drzewa. Operacja ta jest zilustrowana na rysunku. Załóżmy, że w każdym węźle drzewa trzymamy długość tekstu, który ten węzeł reprezentuje (jako pełna etykieta od korzenia do węzła).
Niech α będzie poprzednio wstawionym sufiksem, a u ostatnio utworzonym liściem.
Wtedy wstawienie β polega na znalezieniu maksymalnego wspólnego prefiksu γ1 tekstów α, β. Niech β=γ1⋅γ2. Znajdujemy węzeł v odpowiadający ścieżce od korzenia etykietowanej γ1.
Kluczowym pomyslem algorytmicznym jest tutaj to, że węzła v szukamy nie od korzenia, ale od ostatnio utworzonego liścia u. Jeśli takiego węzła v nie ma (jest wewnątrz krawędzi) to go tworzymy. Następnie tworzymy nowy liść w odpowiadający sufiksowi β, oraz krawędź (v,w) etykietowaną γ2.
Z tablicy lcp odczytujemy długość γ1.
W celu obliczenia v posuwamy się ścieżką od u w górę drzewa, aż znajdziemy węzeł oddalony od korzenia o |γ|.
Przechodząc drzewo posuwamy się po węzłach drzewa, przeskakując (w czasie stalym) potencjalnie długie teksty na krawędziach.
Koszt operacji wstawienia jest proporcjonalny do sumy: jeden plus zmniejszenie głębokości nowego liścia w stosunku do starego. Suma tych zmniejszeń jest liniowa. γ1 jest najdłuższym wspólnym prefiksem słów sufiksik−1 i sufiksik. Kluczowe znaczenie w operacji ma znajomość wartości |γ1|=lcp[k−1]. Wiemy kiedy się zatrzymać idąc do góry od węzła u w kierunku korzenia.
Lokalnie wykonana praca w jednej iteracji jest zamortyzowana zmniejszeniem się głębokości aktualnego liścia w stosunku do poprzedniego. W sumie praca jest liniowa.
Historia algorytmu jest pokazana dla przykładowego tekstu na rysunkach.
Rysunek 4: Pierwsze 6 iteracji algorytmu Drzewo-Sufiksowe dla tekstu babaabababba#.
Rysunek 5: Ostatnie 6 iteracji algorytmu Drzewo-Sufiksowe dla tekstu babaabababba#.