Drzewa sufiksowe - przez tablice sufiksowe


sigma = {1, ..., n}

T = t0 t1 t(n-1) 0 0 0 0 0 (wypełniamy zerami)
S_i = sufiks t(i) ... t(n-1)
S_n = epsilon

chcemy leksykograficznie uporządkować wszystkie sufiksy. oczywiście nie
chcemy przechowywac wszystkich sufiksow, lecz chcemy tylko permutacje
indeksow

SA[0..n] of 0..n

SA - permutacja liczb 0..n taka, Ĺźe S(SA[i]) < S(SA[i+1])

chcemy to zrobić w O(n)

redukujemy zadanie rozm n -> 2/3*n

przykład

                    111
          0123456789012
niech T = yabbadabbado

     0  1  2  3  4  5  6  7  8  9 10 11 12
SA= 12  1  6  4  9  3  8  2  7  5 10 11  0

koniec przykladu

Krok 0 - konstrukcja prĂłbki

B(k) == def == {i \in 0..n: i mod 3 = k}
k=0,1,2

C = B(1) + B(2)

S(C) = {S_i: i \in C} - prĂłbki

Krok 1 - sortujemy leksykograficznie prĂłbki, ale sprytnie

k = 1,2
budujemy słowo R_k = [t_k, t_k+1, t_k+2][t_k+3, t_k+4, t_k+5]...
[xyz] - pojedynczy symbol
R = R1 concat R2

R = [abb][ada][bba][do0][bba][dab][bad][o00]
     S1   S4   S7   S10  S2   S5   S8   S11

ta odpowiedniość zachowuje porządek leksykograficzny (m.in. dzięki temu,
że wypełnialiśmy zerami, które są najmniejsze)

oczywiście nie używamy w rekurencyjnym wywołaniu tych dzikich trójek, tylko
sortujemy je leksykograficznie między sobą i nadajemy im nowe cyferki, więc
nasze R tak naprawdę to jest

R'=(  1,  2,  4,  6,  4,  5,  3,  7)
     S1  S4  S7 S10  S2  S5  S8 S11

Teraz dopiero rekurencyjne znajdujemy tablicę sufiksową dla R', mamy więc
porządek między nimi.

SA' = (epsilon, S1, S4, S8, S2, S7, S5, S10, S11)

wszystko liniowo pĂłki co

pozostają sufiksy z pozycji podzielnych przez 3

niech S_i, S_j in B_0. ale wtedy

S_i <= S_j <==> (t_i, S_i+1) <= (t_j, S_j+1) !

yuppi!

mamy sortowanie leksykograficzne nad alfabetem rozmiaru n, więc możemy
posortować w O(n) sufiksy z B_0.

teraz trzeba to zmergować. i trzeba nam umieć porównywać elementy z B_0
z elementami B_1+B_2

niech S_i in B_0, S_j in B_1+B_2. chcemy porównywać

(1) S_j in B_1: prosto: S_i = t_i S_i+1, S_j = t_j S_j+1, ale S_i+1 umiemy
    porównać z S_j+1 (bo S_j+i in B_2)

(2) S_j in B_2: podobnie: ale bierzemy 2 symbole do porównywania ręcznego:
    S_i = t_i t_i+1 S_i+2, S_j = t_j t_j+1 S_j+2, ale S_i+2 oraz S_j+2
    możemy porównać.

koniec.