Sufiksno stablo

Sufiksno stablo za string BANANA. Svaki podstring se završava simbolom $. Putanje od korena do lista odgovaraju sufiksima (6 sufiksa - 6 putanja) A$, NA$, ANA$, NANA$, ANANA$ i BANANA$. Brojevi u listovima označavaju početnu poziciju odgovarajućeg sufiksa.

Sufiksno stablo predstavlja strukturu podataka koja opisuje internu strukturu stringa (niske) na vrlo iscrpan način. Sufiksno stablo može da se upotrebi da bi se rešio problem tačnog traženja za linerano vreme (postižući istu složenost u najgorem slučaju koju su postigli algoritmi KMP (Knuth-Morris-Pratt) i Bojer-Mur (Boyer-Moore), ali njihova prednost je u mogućnosti primene u algoritmima linearne složenosti za probleme sa stringovima složenijim od tačnog traženja. Štaviše, sufiksna stabla obezbeđuju most između problema tačnog traženja i približnog traženja.

Istorija

Autor prvog algoritma za konstrukciju sufiksnih stabala linearne vremenske složenosti je Vajner (Weiner) 1973. godine, pri čemu je on za to stablo koristio termin stablo pozicija. Drugačiji, i što se tiče štednje prostora prilikom gradnje sufiksnih stabala bolji algoritam, dao je MekKrejt (McCraight) nekoliko godina kasnije. Nakon toga, Ukonen (Ukkonen) je razvio konceptualno drugačiji linerani algoritam za izgradnju sufiksnih stabala koji ima sve prednosti MekKrejtovog algoritma (a detaljnija analiza pokazuje da se on može smatrati varijantom MekKrejtovog algoritma), ali nudi mnogo jednostavnije objašnjenje.

Ovi algoritmi su linearne vremenske složenosti za azbuke konstantne dužine, i u najgorem slučaju imaju vremensku složenost O ( n log n ) {\displaystyle O(n\log n)} . Farah (Farach) je 1997. osmislio prvi algoritam za konstrukciju sufiksnih stabala koji daje optimalne rezultate za azbuke bilo kojih veličina. Farahov algoritam je postao osnova za sve novije algoritame za konstrukciju sufiksnih stabala i nizova.

Definicija

Sufiksno stablo za string S {\displaystyle S} dužine znakova m {\displaystyle m} je korensko orijentisano stablo sa tačno m {\displaystyle m} listova numerisanih od 1 {\displaystyle 1} do m {\displaystyle m} . Svaki unutrašnji čvor različit od korena ima najmanje dva sina i svaka grana je označena nepraznim podstringom za S {\displaystyle S} . Nikoje dve grane koje izlaze iz čvora ne mogu da imaju oznake grane koje počinju istim znakom. Pošto ne postoji sufiksno stablo koje zadovoljava datu definiciju za sve stringove, na S {\displaystyle S} se dodaje jedan znak za kraj, koji nije u alfabetu, najčešće A$. Ovim se osigurava da ni jedan sufiks konačnog stringa ne može da bude prefiks ni jednog drugog sufiksa. Ključna osobina kod sufiksnih stabala je ta, da za svaki list i {\displaystyle i} , konkatenacija oznaka grana na putu od korena do lista i {\displaystyle i} , je jednaka sufiksu S {\displaystyle S} koji počinje na poziciji i {\displaystyle i} . Odnosno, da je S [ i . . m ] {\displaystyle S[i..m]} .

Uopšteno sufiksno stablo

Uopšteno sufiksno stablo je sufiksno stablo za više reči i sadrži sve sufikse iz te grupe reči. Svaka reč u ovakvom stablu mora biti završena različitim terminalnim simbolom ili rečju.

Složenost algoritma

Za azbuke konstantne veličine, složenost algoritma sufiksnog stabla S {\displaystyle S} dužine n {\displaystyle n} je Θ ( n ) {\displaystyle \Theta (n)} . Za slučaj velike azbuke složenost se povećava na O ( n log n ) {\displaystyle O(n\log n)} .

Složenost za azbuke konstantne veličine

Za sufiksno stablo stringa S {\displaystyle S} dužine n {\displaystyle n} , ili generalizovano sufiksno stablo niza stringova D = { S 1 , S 2 , , S K } {\displaystyle D=\{S_{1},S_{2},\dots ,S_{K}\}} ukupne dužine n = | n 1 | + | n 2 | + + | n K | {\displaystyle n=|n_{1}|+|n_{2}|+\cdots +|n_{K}|} može se:

  • Pretraživati
    • Da li je string P {\displaystyle P} dužine m {\displaystyle m} podstring, za vreme O ( m ) {\displaystyle O(m)} .
    • Pronaći prvo pojavljivanje sekvence stringova P 1 , , P q {\displaystyle P_{1},\dots ,P_{q}} ukupne dužine m {\displaystyle m} kao podstringova, za vreme O ( m ) {\displaystyle O(m)} .
    • Pronaći svih z pojavljivanja sekvence stringova P 1 , , P q {\displaystyle P_{1},\dots ,P_{q}} ukupne dužine m {\displaystyle m} kao podstringova, za vreme O ( m + z ) {\displaystyle O(m+z)} .
    • Tražiti regularni izraz P za vreme linearno n {\displaystyle n} .
    • Za svaki sufiks sekvence P {\displaystyle P} , naći dužinu najdužeg poklapanja prefiksa iz P [ i m ] {\displaystyle P[i\dots m]} sa D {\displaystyle D} , za vreme Θ ( m ) {\displaystyle \Theta (m)} . Ovo se naziva statistika poklapanja za P {\displaystyle P}
  • Tražiti svojstva stringova
    • Naći najduži zajednički podstring stringova S i {\displaystyle S_{i}} i S j {\displaystyle S_{j}} za vreme Θ ( n i + n j ) {\displaystyle \Theta (n_{i}+n_{j})} .
    • Naći LZW dekompoziciju za vreme Θ ( n ) {\displaystyle \Theta (n)} .
    • Naći najduže ponavljajuće podstringove za vreme Θ ( n ) {\displaystyle \Theta (n)} .
    • Naći najponavljanije stringove odredjene dužine za vreme Θ ( n ) {\displaystyle \Theta (n)} .
    • Naći najkraće stringove iz Σ {\displaystyle \Sigma } koji se ne pojavljuju u D {\displaystyle D} , za vreme O ( n + z ) {\displaystyle O(n+z)} , ako postoji z {\displaystyle z} takvih stringova.
    • Naći najkraće podstringove koji se pojavljuju samo jednom za vreme Θ ( n ) {\displaystyle \Theta (n)} .
    • Naći, za svako i {\displaystyle i} , najkaraći podstring S i {\displaystyle S_{i}} koji se ne pojavljuje nigde drugde u D {\displaystyle D} za vreme Θ ( n ) {\displaystyle \Theta (n)} .

Primene

Sufiksna stabla imaju siroku primenu u rešavanju problema pri editovanju i pretrazi teksta, kompjuterskoj biologiji i drugim oblastima. Neka od primarnih polja primene su:

  • Traženje najdužeg ponavljajućeg podstringa
  • Traženje najdužeg zajedničkog podstringa
  • Traženje najdužeg palindorma u stringu

Jedno od osnovnih polja primene sufiksnih stabala je bioinformatika. Proučavanje genoma je u najvećoj meri zasnovano na pretraživanju stringova i nalaženju određenih uzoraka u okviru njih. Sufiksna stabla se takodje primenjuju na polju kompresije podataka i neke vrste LZW kompresije koriste sufiksna stabla (LZSS).

Konstrukcija sufiksnog stabla

Esko Ukonen (Esko Ukkonen) je napravio algoritam za konstrukciju sufiksnog stabla u linearnom vremenu koji je konceptualno najlakši algoritam za konstrukciju u linearnom vremenu.

Ukonenov algoritam konstruiše implicitno sufiksno stablo S i {\displaystyle S_{i}} za svaki prefiks S i [ 1.. n ] {\displaystyle S_{i}[1..n]} za S {\displaystyle S} , počevši od I 1 {\displaystyle I_{1}} uvećava za i dok stablo I m {\displaystyle I_{m}} ne bude konstruisano. Pravo sufiksno stablo S {\displaystyle S} za je konstruisano iz I m {\displaystyle I_{m}} a vreme potrošeno za ceo algoritam je O ( m ) {\displaystyle O(m)} . Ukonenov algoritam inicijalno konstruiše stablo u vremenu O ( m 3 ) {\displaystyle O(m^{3})} da bi se konstruisala sva stabla I i {\displaystyle I_{i}} a zatim se optimizovanjem njegove implementacije dobija vremenski nivo složenosti O ( m ) {\displaystyle O(m)} .

Osnovna struktura Ukonenovog algoritma

Konstruiše stablo 
  
    
      
        
          T
          
            i
          
        
      
    
    {\displaystyle T_{i}}
  

for i=1 to m-1
begin {faza i+1 }
      for j=1 to i+1
            begin {produženje j}
            Polazeći od korena nalazi se kraj puta označenog sa u tekućem stablu.
            Ako je potrebno, taj put se produžava dodavanjem znaka ,
            i time osigurava da je string u stablu.
      end;
end;

Za razliku od Ukonenovog algoritma, Vajnerov algoritam počinje celim stringom S {\displaystyle S} . Kao i kod Ukonenovog algoritma, unosi se po jedan sufiks u rastuće stablo, ali u bitno različitom rasporedu. Vajnerov algoritam konstruiše stabla od T m + 1 {\displaystyle T_{m}+1} na dole do T i {\displaystyle T_{i}} .

Literatura

  • Gusfield, Dan (1999), Algorithms on Strings, Trees and Sequences: Computer Science and Computational Biology, Cambridge University Press. ISBN 978-0-521-58519-4..
  • McCreight, Edward M. (1976), „A Space-Economical Suffix Tree Construction Algorithm”, Journal of the ACM, 23 (2): 262—272, doi:10.1145/321941.321946 .
  • Farach, Martin (1997), „Optimal Suffix Tree Construction with Large Alphabets”, 38th IEEE Symposium on Foundations of Computer Science (FOCS '97) (PDF), стр. 137—143, Архивирано из оригинала (PDF) 26. 05. 2018. г., Приступљено 01. 06. 2013 .
  • McCreight, Edward M. (1976), „A Space-Economical Suffix Tree Construction Algorithm”, Journal of the ACM, 23 (2): 262—272, doi:10.1145/321941.321946 .
  • Ukkonen, E. (1995), „On-line construction of suffix trees” (PDF), Algorithmica, 14 (3): 249—260, doi:10.1007/BF01206331 .