10. Suffixové stromy V této kpitole popíšeme jednu pozoruhodnou dtovou strukturu, pomocí níž dokážeme prolémy týkjící se řetězců převádět n grfové prolémy řešit je tk v lineárním čse. Řetězce, trie suffixové stromy Definice: Σ...konečnáeced množinznků (znky udeme znčit ltinskými písmeny) Σ...množinvšechslovndΣ (slov udeme znčit řeckými písmeny) ε... prázdnéslovo α...délkslov α αβ...zřetězeníslov αβ(αε=εα=α) α R...slovo αnpsnépozpátku αjeprefixem β... γ: β= αγ(βzčínán α) αjesuffixem β... γ: β= γα(βkončín α) αjepodslovem β... γ,δ: β= γαδ(znčíme α β) αjevlstnímprefixem β... jeprefixemα β (nlogicky vlstní suffix podslovo) Pozorování: Prázdné slovo je prefixem, suffixem i podslovem kždého slov včetně see sm. Podslov jsou právě prefixy suffixů tké suffixy prefixů. Definice:Trie(Σ-strom)prokonečnoumnožinuslov X Σ jeorientovnýgrf G=(V,E),kde: V = {α:αjeprefixemnějkého β X}, (α,β) E x Σ:β= αx. Pozorování:Triejestromskořenem ε.jeholistyjsouslovzx,kteránejsouvlstnímiprefixyjinýchslovzx.hrnysimůžemepředstvitpopsnépísmeny,oněž prefixrozšiřují,popiskyhrnncestězkořenedovrcholu αdávjíprávěslovo α. Definice:Komprimovnátrie(Σ + -strom)vznikneztrienhrzenímmximálních nevětvících se cest hrnmi. Hrny jsou tentokrát popsné řetězci místo jednotlivými písmeny, přičemž popisky všech hrn vycházejících z jednoho vrcholu se liší v prvním znku.vrcholům uvnitřhrn (kterépdlyzoěťkompresi)udemeříktskryté vrcholy. Definice:Suffixovýstrom(ST)proslovo σ Σ jekomprimovnátriepro X= {α: αjesuffixem σ}. Pozorování: Vrcholy suffixového stromu(včetně skrytých) odpovídjí prefixům suffixůslov σ,tedyvšemjehopodslovům.listystromujsousuffixy,kterésevσjiž nikde jinde nevyskytují(tkovým suffixům udeme říkt nevnořené). Vnitřní vrcholyodpovídjívětvícímpodslovům,tedypodslovům α σtkovým,že α σi α σpronějkédvrůznéznky,. 1 2014-01-23
Někdy může ýt neprktické, že některé suffixy neodpovídjí listům(protože jsouvnořené),lestímsemůžemesndnovypořádt:přidámenkonecslov σ nějký znk $, který se nikde jinde nevyskytuje. Neprázdné suffixy slov σ$ odpovídjísuffixůmslov σžádnýznichnemůžeýtvnořený.tkovýsuffixovýstrom udeme znčit ST$. Příkld: r r r () r r r $ $ $ r$ $ r$ r$ Suffixyslov r :trie,suffixovýstrom,stsdolrem Nyní jk je to s konstrukcí suffixových stromů: Lemm: Suffixový strom pro slovo σ délky n je reprezentovtelný v prostoru O(n). Důkz:Strommá O(n)listůkždývnitřnívrcholmálespoň2syny,tkževnitřních vrcholů je tké O(n). Hrn je rovněž lineárně. Nálepky n hrnách stčí popst počáteční koncovou pozicí v σ. Vět:Suffixovýstromproslovo σdélky nlzesestrojitvčse O(n). Důkz: Ve zytku této kpitoly předvedeme dvě různé konstrukce v lineárním čse. Aplikce co vše dokážeme v lineárním čse, když umíme lineárně konstruovt ST: 1. Inverzní vyhledávání (tj. předzprcujeme si v lineárním čse text pk umímeproliovolnéslovo αvčse O( α )rozhodnout,zdsevtextuvyskytuje) 1 stčísestrojitstpkjejprocházetodkořene.tkéumíme njít všechny výskyty(odpovídjí suffixům, které mjí jko prefix hledné slovo, tkže stčí vytvořit ST$ vypst všechny listy pod nlezeným vrcholem) neo přímo vrátit jejich počet(předpočítáme si pomocí DFS pro kždý vrchol, kolik pod ním leží listů). 2. Nejdelší opkující se podslovo tkové podslovo je v ST$ nutně větvící, tkže stčí njít vnitřní vrchol s největší písmenkovou hloukou (tj. hloukou měřenou ve zncích místo ve hrnách). 3. Histogrm četností podslov délky k rozřízneme ST$ v písmenkové hlouce kspočítáme,kolikpůvodníchlistůjepodkždýmnovým. 4.Nejdelšíspolečnépodslovoslov αβ postvímestproslovo α$ 1 β$ 2, jeholistyodpovídjísuffixůmslov αβ.tkžestčípomocídfsnjít 1 Čilipřesnýopktoho,coumívyhledávcíutomt tensipředzprcovává dotz. 2 2014-01-23
nejhluší vnitřní vrchol, pod kterým se vyskytují listy pro α i β. Podoně můžemesestrojitst$proliovolnoumnožinuslov. 2 5.Nejdelšíplindromicképodslovo(tj.tkové β α,proněžje β R = β) postvímespolečnýst$proslov αα R.Postupněprocházímepřes všechny možné středy plindromického podslov všimneme si, že tkové slovo je pro kždý střed nejdelším společným prefixem podslov od tohotoodudokoncepodslovodtohotoodupozpátkukzčátku,čili nějkéhosuffixu αnějkéhosuffixu α R.Tytosuffixyovšemodpovídjí listům sestrojeného ST jejich nejdelší společný prefix je nejližším společným předchůdcem ve stromu, tkže stčí pro strom vyudovt dtovou strukturu pro společné předchůdce s její pomocí dokážeme jeden střed prozkoumt v konstntním čse. 6. Burrows-Wheelerov Trnsformce[1] jejím zákldem je lexikogrfické setřídění všech rotcí slov σ, což zvládneme sestrojením ST pro slovo σσ, jeho uříznutím v písmenkové hlouce σ vypsáním nově vzniklých listů vpořdí zlevdoprv. Cvičení: Zkuste vymyslet co nejlepší lgoritmy pro tyto prolémy ez použití ST. Suffixová pole V některých přípdech se hodí místo suffixového stromu používt kompktnější dtové struktury. Notce: Pro slovo σ ude σ[i] znčit jeho i-tý znk(číslujeme od nuly), σ[i: j] pkpodslovo σ[i]σ[i+1]...σ[j 1].Liovolnouzmezímůžemevynecht,proto σ[i:]udesuffixod idokonceσ[:j]prefixodzčátkudo j 1.Pokud j i, definujeme σ[i: j] jko prázdné slovo, tkže prázdný suffix můžeme npříkld zpst jko σ[ σ :]. LCP(α,β)udeznčitdélkunejdelšíhospolečnéhoprefixuslov αβ,čilinejvětší i α, β tkové,že α[:i]=β[:i]. Definice:Suffixovépole(SuffixArry) A σ proslovo σdélky njeposloupnostvšech suffixů slov σ v lexikogrfickém pořdí. Můžeme ho reprezentovt npříkld jko permutci Ačísel0,...,n,proníž σ[a[0]:]<σ[a[1]:]<... < σ[a[n]:]. Definice:Polenejdelšíchspolečnýchprefixů(LongestCommonPrefixArry) L σ pro slovo σjeposloupnost,vníž L σ [i]:=lcp(a σ [i],a σ [i+1]). Vět:Suffixovýstromproslovo σ$dvojici(a σ,l σ )nseelzevlineárnímčse převádět. Důkz:KdyžprojdemeST(σ$)dohlouky,pořdílistůodpovídáposloupnosti A σ písmenkovéhloukyvnitřníchvrcholůvinorderuodpovídjí L σ.nopkst(σ$) získámetk,žesestrojímekrtézskýstrompro L σ (získámevnitřnívrcholyst), doplnímedonějlisty,přiřdímejimsuffixypodle A σ nkonecpodlelistůrekonstruujeme nálepky hrn. 2 Jensimusímedátpozor,ychomsimocnezvětšiliecedu;jkmocsiji můžeme dovolit zvětšit, vyplyne z konkrétních konstrukcí. 3 2014-01-23
Rekurzivní konstrukce Ukážemelgoritmus,kterýproslovo σ Σ délky nsestrojíjehosuffixovépole LCPpolevčse O(n+Sort(n,Σ)),kdeSort(...)ječspotřenýprosetřídění n symolů z ecedy Σ. V kominci s předchozími výsledky tedy dostneme lineární konstrukci ST(σ) pro liovolnou fixní ecedu. Algoritmus:(Konstrukce A L podle Kärkkäinen Snderse[2]) 1.Redukujemeecedun1...n:vevstupnímslovujenejvýšenrůzných znků, tkže je stčí setřídit přečíslovt. 2.Definujemeslov σ 0, σ 1, σ 2 následovně: σ 0 [i]:= σ[3i],σ[3i+1],σ[3i+2] σ 1 [i]:= σ[3i+1],σ[3i+2],σ[3i+3] σ 2 [i]:= σ[3i+2],σ[3i+3],σ[3i+4] Všechn σ k jsouslovdélky n/3ndecedouvelikosti n 3.Dovolímesimírnězneužívtnotcipoužívtsymol σ k ijejichpřepis do ecedy původní. 3.Zvolámelgoritmusrekurzivněnslovo σ 0 σ 1,čímžzískáme A 01 L 01.(Suffixyslov σ 0 σ 1 odpovídjísuffixůmslov σ 0 σ 1.) 4.SpočítámepoleP 0 P 1,kteránámudouříkt,kdesevA 01 vyskytuje kterýsuffixslov σ 0 σ 1.Tedy A 01 [P 0 [i]]=i, A 01 [P 1 [i]]=i+ σ 0. Jinýmislovy, P 0 P 1 udoučástiinverznípermutceka 01.Všimněte si,žepltí P i [x] < P j [y]právětehdy,když σ i [x:]<σ j [y:],tkže suffixyslov σ 0 σ 1 odtétochvíleumímeporovnávtvčse O(1). 5.Vytvoříme A 2 (suffixovépolepro σ 2 ):Jelikož σ 2 [i:]=σ[3i+2:]= σ[3i+2]σ[3i+3:]=σ[3i+2]σ 0 [i+1:],odpovídálexikogrfické pořdísuffixů σ 2 [i:]pořdídvojic(σ[3i+2],p 0 [i+1]).tytodvojice ovšem můžeme setřídit dvěm průchody přihrádkového třídění. 6.Slijeme A 01 A 2 do A:slévámedvěsetříděnéposloupnosti,tkžestčí umět jejich prvky v konstntním čse porovnt: σ 0 [i:]<σ 2 [j:] σ[3i:]<σ[3j+2:] σ[3i]σ 1 [i:]<σ[3j+2]σ 0 [j+1:], σ 1 [i:]<σ 2 [j:] σ[3i+1:]<σ[3j+2:] σ[3i+1]σ[3i+2]σ 0 [i+1:]< σ[3j+2]σ[3j+3]σ 1 [j+1:]. Pokždé tedy porovnáme nejvýše dvě dvojice znků pk dvojici suffixůslov σ 0 σ 1,kčemužnámpomohoupole P 0 P 1. 7. Dopočítáme L: 8. PokudvAsousedísuffixslov σ 0,1 sesuffixemslov σ 0,1,sousedí tytodvsuffixyiva 01,tkžejejichLCPnjdemepřímovL. 4 2014-01-23
9. Setkjí-lisedvsuffixyslov σ 2,všimnemesi,že σ 2 [i:]=σ[3i+ 2:]=σ[3i+2]σ 0 [i+1:].lcp(σ 2 [i:],σ 2 [j:])jetedyuďto0 (pokudσ[3i+2] σ[3j+2]),neo1+3 LCP(σ 0 [i+1:],σ 0 [j+1:]), přípdnětotéžzvýšenéo1neo2,pokudsetrojznkyvσ 0 následujícípolcpzčástishodují.přitomlcp(σ 0 [p:],σ 0 [q:])spočítámepomocí L.JetototižminimumintervluvLmeziindexy P 0 [p]p 0 [q].tozjistímevkonstntnímčsepomocístruktury pro intervlová minim. 10. Pokudsesetkásuffixslov σ 0,1 sesuffixemslov σ 2,stčítytosuffixypřepstpodonějkov6.krokuprolémtímopětpřevést nvýpočetlcpdvousuffixůslov σ 0,1. Anlýz čsové složitosti: Třídění npoprvé trvá Sort(n, Σ), ve všech rekurzivních voláních už je lineární(trojice čísel velikosti O(n) můžeme třídit tříprůchodovým přihrádkovým tříděním s O(n) přihrádkmi). Z toho dostáváme: T(n)=T(2/3 n)+o(n), tedy T(n)=O(n). Ukkonenov inkrementální konstrukce Ukkonen popsl lgoritmus[3] pro konstrukci suffixového stromu ez dolrů, prcující inkrementálně: Zčne se stromem pro prázdné slovo postupně n konec slov přidává dlší znky přepočítává strom. Kždý znk přitom přidá v mortizovně konstntním čse. Pro slovo σ tedy dokáže sestrojit ST v čse O( σ ). Budeme předpokládt, že hrny vedoucí z jednoho vrcholu je možné indexovt jejich prvními písmeny to ezpečně pltí, pokud je eced pevná; není-li, můžeme si pomoci hešováním. Pozorování: Když slovo σ rozšíříme n σ, ST se změní následovně: 1. Všechny stávjící vrcholy stromu(včetně skrytých) odpovídjí podslovům slov σ.tjsouipodslovy σ,tkžeseudouncházetivnovémstromu. 2. Pokud β ylo větvící slovo, zůstne ndále větvící tedy vnitřní vrcholy ve stromu zůstnou. 3. Kždý nový suffix β vznikne prodloužením nějkého původního suffixu β. Přitom: Pokud yl β nevnořený suffix(čili yl reprezentovný listem), ni βneudevnořený.ztohovíme,želistyzůstnoulisty, pouze jim potřeujeme prodloužit nálepky. Ay to netrvlo příliš dlouho, zvedeme otevřené hrny, jejichž nálepk říká odpozice idokonce.listysetkoseepostrjísmy. Pokud βylvnořenýsuffix(tj.vnitřníčiskrytývrchol): Buďseβvyskytujevσ,tímpádemjetovnořený suffix nového slov strom není nutné uprvovt; 5 2014-01-23
neose βvσnevyskytuje tehdypronějmusíme zložit nový list s otevřenou hrnou přípdně inovývnitřnívrchol,podnímžudetentolistpřipojen. Víme tedy, co všechno je při rozšíření slov potře ve stromu uprvit. Zývá vyřešit, jk to udělt efektivně. Vnořené suffixy: Především potřeujeme umět rozpoznt, které suffixy jsou vnořené kterénikoliv.ktomusehodívšimnoutsi,ževnořenésuffixytvořísouvislýúsek: Lemm:Je-li αvnořenýsuffixslov σ βjesuffixslov α,pk βjevσ tké vnořený. Důkz:Veslověsigmsevyskytuje αxαypronějkédvrůznéznky xy.kždýztěchtovýskytůpřitomkončívýskytemslov β,jednou následovným x, podruhé y. Stčí si tedy zpmtovt nejdelší vnořený suffix slov σ. Tomu udeme říkt ktivní suffix udemehoznčit α(σ).liovolnýsuffix β σpkudevnořenýprávě tehdy, když β α(σ). Aktivní suffix tedy tvoří hrnici mezi nevnořenými vnořenými suffixy. Jk se tto hrnice posune, když slovo σ rozšíříme? N to je odpověď sndná: Lemm:Prokždé σ, pltí: α(σ)jesuffixem α(σ). Důkz: α(σ)iα(σ)jsousuffixyslov σ,protostčíporovntjejich délky.slovo β := α(σ)ezkoncového jevnořenýmsuffixemvσ, tkže β α(σ),tedytké α(σ) = β α(σ). Hrnice se tedy může posouvt pouze doprv, přípdně zůstt n místě. Toho lze sndno využít. Idelgoritmu:Udržujemesi α=α(σ)připřidáníznku zkontrolujeme,zd αjestálevnořenýsuffix.pokudno,nicsenemění,pokudne,přidámenovýlist přípdně tké vnitřní vrchol, α zkrátíme zlev o znk testujeme dál. Anlýz: Po přidání jednoho znku n konec slov σ provedeme mortizovně konstntní počet úprv stromu(kždá úprv slovo α zkrátí, po všech úprvách přidáme k α jediný znk). Tudíž stčí ukázt, jk provést kždou úprvu v(mortizovně) konstntním čse. K tomu potřeujeme šikovnou reprezentci slov α, která ude umět efektivně prodlužovt zprv, zkrcovt zlev testovt existenci vrcholu ve stromu. Definice:Referenčnípárproslovo α σjedvojice(π,τ),vníž πjevrcholstromu, τliovolnéslovoπτ= α.nvícvíme,že τ σ,tkžesi τstčípmtovtjko dvojici indexů ve slově σ. Referenční pár je knonický, pokud neexistuje hrn vedoucí z vrcholu π s nálepkou,kteráyylprefixemslov τ.(všimnětesi,žetkováhrnsepoznápodle toho,žeprvníznknálepkyseshodujesprvnímznkemslov τnálepknenídelší než slovo τ. Shodu osttních znků není nutné kontrolovt.) 6 2014-01-23
Pozorování: Ke kždému slovu α σ existuje právě jeden knonický referenční pár, kterýhopopisuje.tojezevšechreferenčníchpárůprototoslovotensnejdelším π (nejhluším vrcholem). Definice: Zpětná hrn ck(π) vede z vrcholu π do vrcholu, který je zkrácením slov π o jeden znk zlev.(nhlédneme, že tkový vrchol musí existovt: pokud je πvnitřnívrchol,pkjeslovo πvětvící,tkžekždýjehosuffixmusítkéýtvětvící, tím pádem musí odpovídt nějkého vrcholu.) Operce s referenčními páry: S referenčním párem(π, τ) popisujícím slovo α potřeujeme provádět následujicí operce: Přidáníznku nkonec:připíšeme nkonecslov τ.tojejistěreferenční pár pro α, le nemusí ýt knonický. Přitom můžeme sndno ověřit, zd se α ve stromu nchází, přípdně operci odmítnout. Oderáníznkuzezčátku:Pokud πneníkořenstromu,položíme π ck(π) zchováme τ. Pokud nopk je π prázdný řetězec, odeeremezτ jehoprvníznk(tolzeuděltvkonstntnímčse,protože τ je reprezentovné dvojicí indexů do σ). Převedení n knonický tvr: Oě předchozí operce mohou vytvořit referenční pár, který není knonický. Pokždé proto knonicitu zkontrolujeme přípdně pár uprvíme. Ověříme, zd hrn z π indexovná písmenem nenídostkrátkánto,yylprefixemslov τ.pokudje,tksepotéto hrně přesuneme dolů, čímž π prodloužíme τ zkrátíme, proces opkujeme. Jelikož tím pokždé τ zkrátíme kdykoliv jindy se τ prodlouží nejvýše o 1, mjí všechny převody n knonický tvr mortizovně konstntní složitost. Nyní již můžeme doplnit detily, získt celý lgoritmus nhlédnout, že prcuje v mortizovně konstntním čse. Algoritmus podroněji: 1.Vstup: α=α(σ)reprezentovnýjkoknonickýreferenčnípár(π,τ), Tsuffixovýstrompro σspolushrnmick,novýznk. 2. Zjistíme, jestli α je přítomen ve stromu, přípdně ho zložíme: 3. Pokud τ= ε:(α=πjevnitřnívrchol) 4. Vede-li z vrcholu π hrn s nálepkou zčínjící znkem, pk je přítomen. 5. Nevede-li, není přítomen, tk přidáme novou otevřenou hrnuvedoucízπdonovéholistu. 6. Pokud τ ε:(αjeskrytývrchol) 7. Njdemehrnu,ponížzπpokrčujeslovo τ (kterátoje, poznáme podle prvního znku slov τ). 8. Pokudvpopiscetétohrnypo τnásledujeznk,pkje α přítomen. 9. Pokud nenásleduje, tk neyl přítomen, čili tuto hrnu rozdělíme: přidáme n ni nový vnitřní vrchol, do nějž povede 7 2014-01-23
hrnspopiskou τznějzytekpůvodníhrnyotevřená hrn do nového listu. 10.Pokud αneylpřítomen,tk αzkrátímevrátímesenkrok2. 11. Nyní víme, že α již yl přítomen, tkže uprvíme referenční pár, y popisovl α. 12. Dopočítáme zpětné hrny(viz níže). 13.Výstup: α=α(σ)jkoknonickýreferenčnípár(π,τ), T suffixový strompro σjehozpětnéhrnyck. Zpětné hrny: Zývá dodt, jk nstvovt novým vrcholům jejich zpětné hrny. To potřeujeme jen pro vnitřní vrcholy(n zpětné hrny z listů se lgoritmus nikdy neodkzuje). Všimneme si, že pokud jsme zložili vrchol, odpovídá tento vrchol vždy součsnému αzpětnáhrnznějpovededozkráceníslov αoznkzlev,cožje přesně vrchol, který zložíme(neo zjistíme, že už existuje) v příští iterci hlvního cyklu. V dlší iterci ještě určitě neudeme tuto hrnu potřeovt, protože π vždy jen zkrcujeme, tk můžeme vznik zpětné hrny o iterci zpozdit. Výro zpětné hrny tedy ude tké trvt jen konstntně dlouho. Litertur [1] M. Burrows nd D. Wheeler. A lock-sorting lossless dt compression lgorithm. Technicl Report 124, Digitl Systems Reserch Center, 1994. [2] J. Kärkkäinen nd P. Snders. Simple liner work suffix rry construction. In Proc. 13th Interntionl Conference on Automt, Lnguges nd Progrmming. Springer Verlg, 2003. [3] E. Ukkonen. On-line construction of suffix trees. Algorithmic, 14(3):249 260, 1995. 8 2014-01-23