ƒeské vysoké u ení technické v Praze Fakulta elektrotechnická Katedra po íta Diplomová práce Online konstrukce deterministického zásobníkového automatu pro indexování strom Bc. Ond ej Brynda Vedoucí práce: Doc. Ing. Jan Janou²ek, Ph.D. Studijní program: Elektrotechnika a informatika, strukturovaný, Navazující magisterský Obor: Výpo etní technika 1. kv tna 2011
iv
v Pod kování D kuji Doc. Ing. Janu Janou²kovi, Ph.D. za vedení této práce a v²em lidem, kte í m podporovali b hem mého studia.
vi
vii Prohlá²ení Prohla²uji, ºe jsem práci vypracoval samostatn a pouºil jsem pouze podklady uvedené v p iloºeném seznamu. Nemám závaºný d vod proti uºití tohoto ²kolního díla ve smyslu Ÿ60 Zákona. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o zm n n kterých zákon (autorský zákon). V Beroun dne 30. 4. 2011.............................................................
viii
Abstract This thesis deals with the pushdown automata which represent the full indexes of trees for subtrees and tree patterns. These machines accept all complete subtrees or all tree patterns. The goal is to design algorithms which constructs these machines without intermediate step of creating their nondeterministic versions. The inspiration for both algorithms is a similar algorithm from stringology, which is used for online construction of sux automaton. This and the two new proposed algorithms are described in the thesis and the run of new algorithms is presented on an example. Finally, the thesis presents a way of implementing these algorithms. Abstrakt Práce se zabývá zásobníkovými automaty, které reprezentují úplný index stromu. Tyto automaty p ijímají v²echny úplné podstromy nebo v²echny stromové vzorky. Cílem práce je navrhnout algoritmy, které by tyto automaty zkonstruovaly bez mezikroku vytvo ení jejich nedeterministické verze. Inspirací pro oba algoritmy je podobný algoritmus ze stringologie, který se pouºívá k online konstrukci suxového automatu. Tento i oba navrºené algoritmy jsou v práci popsány a u nových algoritm je jejich b h prezentován na p íkladu. Nakonec je popsán i moºný zp sob implementace uvedených algoritm. ix
x
Obsah 1 Úvod 1 2 Základní pojmy a algoritmy 3 2.1 Abeceda, strom, stromový vzorek......................... 3 2.2 Jazyk, kone ný a zásobníkový automat...................... 5 2.3 Suxový a faktorový automat........................... 7 2.4 Algoritmus online konstrukce suxového automatu............... 10 2.5 D leºité vlastnosti strom v prexové notaci................... 19 3 Zásobníkový automat p ijímající v²echny podstromy daného stromu 21 3.1 Konstrukce nedeterministického ZA p ijímajícího v²echny podstromy..... 21 3.2 Online konstrukce DZA p ijímajícího v²echny podstromy............ 25 3.2.1 Popis algoritmu............................... 27 3.2.2 P íklad online konstrukce......................... 30 4 Zásobníkový automat p ijímající stromové vzorky obsaºené v daném strom 39 4.1 Konstrukce NZA p ijímajícího stromové vzorky................. 39 4.2 Online konstrukce treetop automatu....................... 43 4.3 Online konstrukce DZA p ijímajícího stromové vzorky............. 44 4.3.1 P íklad online konstrukce......................... 54 5 Implementace 65 6 Testování 67 7 Záv r 71 A Seznam pouºitých zkratek 75 B Instala ní p íru ka 77 C Obsah p iloºeného CD 79 xi
xii OBSAH
Seznam obrázk 2.1 P íklad stromu t, pref(t) = a2 a2 a0 a0 a2 a0 b1 b0.............. 4 2.2 Vzorek p, pref(p) = a2 a0 S............................ 5 2.3 Nedeterministický kone ný suxový automat pro et zce x = a2 a2 a0 a0 a2 a0 b1 b0....................................... 8 2.4 Deterministická verze automatu z obrázku 2.3.................. 9 2.5 a) DAWG(aabab), b) gracké znázorn ní sux link.............. 11 2.6 P íklad p idávání nových p echod, a) DAWG(aab), b) p íslu²né sux linky. 13 2.7 Napojení sux linku, a) DAWG(aaba) b) p íslu²né sux linky......... 15 2.8 Situace p ed rozd lením stavu [3], a) nekompletní DAWG(aabab) b) sux linky 16 2.9 DAWG(aaaa) a sux linky (te kovan )...................... 17 2.10 Pomocný obrázek k d kazu sloºitosti algoritmu 2.1. a) ná rt situace v obecném kroku b) ná rt situace v dal²ím kroku...................... 18 3.1 Nedeterministický zásobníkový automat p íjímající v²echny podstromy stromu t, pref(t) = a2 a2 a0 a0 a2 a0 b1 b0....................... 22 3.2 Deterministický zásobníkový automat ekvivalentní NZA z obrázku 3.1.... 24 3.3 a) Situace p ed rozd lením stavu v, b) situace po rozd lení stavu....... 28 3.4 a) Automat pokud bychom nekontrolovali cpds, b) automat s kontrolou cpds. Sux linky jsou znázorn ny te kovan...................... 30 3.5 Kroky 0 aº 3 algoritmu 3.1............................. 31 3.6 Kroky 4 a 5 algoritmu 3.1............................. 33 3.7 Výsledné sux linky vytvo ené algoritmem 3.1.................. 35 3.8 Krok 6 algoritmu 3.1................................ 35 3.9 Krok 7 algoritmu 3.1................................ 36 3.10 Krok 8 algoritmu 3.1................................ 37 4.1 Strom z obrázku 2.1 dopln ný o p edstavu p echod na symbol S....... 40 4.2 Nedeterministický zásobníkový automat p ijímající v²echny stromové vzorky stromu z obr. 2.1.................................. 41 4.3 Deterministický zásobníkový automat p ijímající v²echny stromové vzorky stromu z obr. 2.1.................................. 42 4.4 Krok 0 aº 2 algoritmu 4.2............................. 54 4.5 Krok 3 algoritmu 4.2................................ 55 4.6 Krok 4 algoritmu 4.2................................ 56 4.7 Krok 5 algoritmu 4.2................................ 57 xiii
xiv SEZNAM OBRÁZK 4.8 Krok 6 algoritmu 4.2................................ 60 4.9 Krok 7 algoritmu 4.2................................ 61 4.10 Krok 8 algoritmu 4.2................................ 62 6.1 Sux linky v automatu pro strom s prexový zápisem a2 a2 a0 a1 a0 a1 a0. 68 6.2 DZA p ijímající stromové vzorky obsaºené ve stromu s prexovým zápisem a2 a2 a0 a1 a0 a1 a0................................ 70
Seznam tabulek 3.1 Pr b h výpo tu algoritmu 3.1........................... 38 4.1 Pr b h výpo tu algoritmu 4.2........................... 63 xv
xvi SEZNAM TABULEK
Kapitola 1 Úvod Mnoho struktur v na²em okolí je logicky uspo ádáno do stromu. Obecn se jedná o jakýkoliv systém, kde má kaºdý prvek práv jeden nad azený objekt. S takovýmto len ním se setkáváme denn jednak v b ºném ºivot, ale stejn tak i v po íta ových v dách jsou stromy asto vyuºívaná datová struktura. P íklady pouºití najdeme velmi snadno. Je to nap íklad ²iroce pouºívané XML, syntaktický strom v kompilátoru, hierarchie t íd a objekt v programovacím jazyce, r zná pouºití ve vyhledávacích, kompresních a jiných algoritmech a mnoho dal²ího. Vyhledávání výskytu podstrom a stromových vzork v daném stromu je tedy velmi d leºitá úloha. V dou, která se zabývá algoritmy pro vyhledávání ve stromech, je arbologie. Podobným oborem je stringologie, která se zabývá vyhledáváním v et zcích. Hlavní motivací arbologie je vyuºití dob e známých algoritm ze stringologie p i e²ení obdobných problém u strom. [1] Základním p edpokladem vyuºití princip ze stringologie je to, ºe na strom budeme nahlíºet jako na et zec. Toho lze docílit celkem snadno, nap íklad tak, ºe strom zapí²eme v prexové notaci. Potom platí, ºe podstrom zapsaný v prexové notaci je pod et zcem v prexovém zápisu celého stromu. Nicmén je z ejmé, ºe ne kaºdý pod et zec reprezentuje podstrom. [6] Z toho vyplývá, ºe je pot eba pouºít jiný model výpo tu neº jsou kone né automaty, které se pouºívají ve stringologii. V arbologii se místo kone ných automat pouºívají zásobníkové automaty. Stejn jako ve stringologii, tak i v arbologii je více zp sob, jak vyhledávat vzorky. Jedno ze základních d lení by mohlo být, zda p edzpracováváme vzorek nebo vlastní text. V této práci se zabývám jen moºností, kdy p edzpracováváme text (respektive strom), ve kterém vyhledáváme. Tento zp sob má výhodu v tom, ºe doba vyhledávání je pak lineárn závislá jen na délce vzorku a v bec nezávisí na délce textu. Automat, který vznikne p edzpracováním textu se nazývá indexovací. Druhým moºným d lením m ºe být to, jak indexovací automat vytvá íme. Prozatím známá metoda je vytvo it nejprve nedeterministickou verzi a pak automat zdeterminizovat. Zásobníkový automat sice nejde obecn zdeterminizovat vºdy, ale automaty vznikající v arbologii mají takové vlastnosti, které determinizaci umoº ují. Tento postup má tu výhodu, ºe je relativn názorný, ale nevýhoda je v tom, ºe je relativn zdlouhavý a proces determinizace je pom rn náro ný. Lep²í metoda pro praktické pouºité je takzvaná online konstrukce, kde automat vytvá íme postupn tak, jak teme vstupní text. Pro vyhledávání v et zcích je 1
2 KAPITOLA 1. ÚVOD algoritmus pro online konstrukci znám, nap íklad v [4] a [2]. P ínosem této práce by m lo být denování obdobného algoritmu i pro konstrukci automat indexujících stromy. Zbytek práce je organizován následovn. V následující kapitole 2 si denujeme základní pojmy z oblasti arbologie a stringologie, spole n s n kolika základními algoritmy. V kapitole 3 se budeme zabývat konstrukcí automat p ijímajících v²echny úplné podstromy daného stromu (Subtree PDA) a v kapitole 4 p edstavíme konstrukci automat p ijímajících v²echny stromové vzorky (Tree pattern PDA). Nakonec v kapitole 5 krátce popí²eme implementaci uvedených algoritm a její testování v kapitole 6.
Kapitola 2 Základní pojmy a algoritmy V této kapitole denujeme n kolik základních pojm pot ebných pro dal²í práci. Pojmy jsou denovány stejn jako v [6] [10] [7] [8]. 2.1 Abeceda, strom, stromový vzorek Abeceda je kone ná neprázdná mnoºina symbol. Ohodnocená abeceda je abeceda, kde má kaºdý symbol p i azenu jednozna nou kladnou aritu (ohodnocení). V dané abeced A ozna- ujeme ohodnocení symbolu arity(a). Mnoºina symbol s ohodnocením p je ozna ena A p. Prvky, které mají aritu 0, 1, 2...p ozna ujeme jako nulární (konstanty), unární, binární atd. P edpokládáme, ºe A obsahuje alespo jeden nulární symbol. V dal²ím textu se arita symbol ozna uje pomocí íslice za identikátorem symbolu, nap íklad zápisem a2 se rozumí binární symbol a. P i zápisu algoritm si m ºeme zápis arity(a2) p edstavit jako volání funkce, která vrací aritu daného symbolu, v tomto p ípad vrátí 2. Strom si denujeme pomocí pojm z teorie graf. Uspo ádaný orientovaný graf je dvojice (U, H), kde U je mnoºina uzl a H je lineárn uspo ádaná mnoºina hran, kde kaºdý prvek H má formu ((f, g 1 ), (f, g 2 ),..., (f, g n )), kde f, g 1, g 2...g n jsou uzly grafu a n 0. Tento zápis zna í, ºe z uzlu f vede n orientovaných hran do uzl g 1, g 2...g n v tomto daném po adí. Cesta délky n je sekvence uzl (f 1, f 2...f n ), n 1, z uzlu f do uzlu f n, pokud existuje hrana, která vede z f i 1 do f i pro v²echny 1 i n. Pokud navíc f 0 = f n pak se daná cesta nazývá cyklus. Uspo ádaný DAG (Direct Acyclic Graph) je uspo ádaný orientovaný graf, ve kterém neexistuje cyklus. Ozna ení uspo ádaného grafu G = (U, H) je zobrazení U do mnoºiny zna ek. Nap íklad ozna ení a f v dal²ím textu reprezentuje uzel f ozna ený symbolem a. M jme dán uzel f. Jeho výstupní stupe se rovná po tu r zných pár (f, r) H. Analogicky vstupní stupe uzlu f je po et r zných pár (g, f) H. Nyní jiº m ºeme denovat ozna ený, uspo ádaný, ohodnocený, ko enový strom nad abecedou A jako uspo ádaný DAG t=(u, H) s práv jedním speciálním uzlem, r U, který se nazývá ko en, takový ºe pro n j platí: r má vstupní stupe roven 0 3
4 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY v²echny ostatní uzly mají vstupní stupe 1 existuje práv jedna cesta z ko ene r do v²ech ostatních f U a f r kaºdý uzel f U je ozna en symbolem a A a výstupní stupe a f se rovná arity(a). Uzly, které jsou ozna eny nulárními symboly, se nazývají listy (nap íklad a0). Prexová notace pref(t) ozna eného, uspo ádaného, ohodnoceného, ko enového stromu je zápis stromu, který získáme aplikací následujícího algoritmu Krok rekurzivn na v²echny uzly daného stromu, po ínaje ko enem: Krok: Nech se tento krok týká uzlu a f. Jestliºe je a f list, pak vypi² a f a skon i. Jestliºe není a f list a jeho potomci jsou a f1, a f2...a fn, pak vypi² a f a postupn pouºij krok na a f1, a f2...a fn v tomto po adí. Zatím jsme denovali, co je to ozna ený, uspo ádaný, ohodnocený, ko enový strom nad abecedou A. V této práci se zabývám jen takovýmito stromy, takºe se na n budu odkazovat zjednodu²en pouze slovem strom. P íklad ozna eného, uspo ádaného, ohodnoceného, ko enového stromu je na obrázku 2.1. Ohodnocená abeceda je zde A = {a2, a1, a0, b1, b0}. Strom t = ({a2 1, a2 2, a0 3, a0 4, a2 5, a0 6, b1 7, b0 8 }, H), kde H je následující uspo ádaná mnoºina hran: ((a2 1, a2 2 ), (a2 1, a2 5 )) ((a2 2, a0 3 ), (a2 2, a0 4 )) ((a2 5, a0 6 ), (a2 5, b1 7 )) ((b1 7, b0 8 )) Obrázek 2.1: P íklad stromu t, pref(t) = a2 a2 a0 a0 a2 a0 b1 b0 Nyní máme denovaný strom, zbývá je²t denovat, co vlastn ve stromu hledáme. Stromový vzorek denujeme pomocí speciálního nulárního symbolu S, který neleºí v A. Ozna ený, uspo ádaný, ohodnocený, ko enový strom nad abecedou A {S} je stromový vzorek. Analogicky stromový vzorek v prexové notaci je zápis tohoto stromu pomocí jiº zmín ného algoritmu Krok. P edpokládáme, ºe stromový vzorek obsahuje alespo jeden symbol z A, to
2.2. JAZYK, KONEƒNÝ A ZÁSOBNÍKOVÝ AUTOMAT 5 znamená, ºe nap íklad samotné S není stromový vzorek (vyhledávací úloha by potom byla triviální). Stromový vzorek s alespo jedním symbolem S se nazývá ²ablona stromu. Stromový vzorek p obsahující k 0 symbol S je nalezen v daném stromu t v uzlu n, jestliºe ve stromu t existují podstromy t 1, t 2,..., t n (ne nutn stejné) takové, ºe strom p' získaný z p substitucí podstromu t i pro i-tý výskyt S v p, i = 1, 2,...,k, je rovný podstromu stromu t s ko enem v n. Uvaºujme strom t z obrázku 2.1 v prexové notaci zapsaný jako pref(t) = a2 a2 a0 a0 a2 a0 b1 b0 a stromový vzorek p nad abecedou A {S}, p = ((a2 9, a0 10, S 11 ), H), kde H je následující se azená mnoºina pár : ((a2 9, a0 10 ), (a2 9, S 11 )) Obrázek 2.2: Vzorek p, pref(p) = a2 a0 S Stromový vzorek p v prexovém zápisu pref(p) = a2 a0 S je zobrazený na obrázku 2.2. Vzorek p je nalezen ve strom t ve dvou výskytech. První výskyt je v uzlu a2 2 a druhý v a2 5. V literatu e je ob as vyhledávací problém denován také jako proces rozhodování, zda se daný vzorek v textu, respektive stromu, vyskytuje. Výsledkem je tedy odpov ano nebo ne. Tento rozdíl v²ak není úpln podstatný, protoºe obvykle algoritmy poskytují informace o výskytu a pozicích výskytu najednou nebo je lze n jakým zp sobem dodate n odvodit. Jak je zvykem v pracích podobného typu, rozd lím si problém nejprve na vzorky, které neobsahují symbol S, tedy hledání p esných podstrom daného stromu a poté budeme uvaºovat i vzorky se symbolem S (²ablony stromu). Nejprve je v²ak je²t pot eba denovat si n kolik pojm z teorie automat a jazyk, které nám poskytnou prost edky pro popis výpo tu pomocí kone ných a zásobníkových automat. 2.2 Jazyk, kone ný a zásobníkový automat Pojmy v této kapitole jsou op t denovány stejn jako v [6] [10] [7] [8]. Jazyk nad abecedou A je mnoºina et zc nad A. Zápis A ozna uje mnoºinu v²ech et zc nad A v etn prázdného et zce. Prázdný et zec je ozna ován ε. Zápis A + symbolizuje mnoºinu A bez prázdného et zce, tj. A + = A \{ε}. Symbolem x m ozna ujeme m z et zení symbolu x. ƒíslo m je celé kladné íslo v t²í nebo rovno nule, x 0 = ε, x 1 = x, x 2 = xx, atd. Nedeterministický kone ný automat (NKA nebo anglicky NFA) je p tice M = (Q,A, δ, q 0, F ), kde Q je kone ná mnoºina stav, A je vstupní abeceda, δ je zobrazení Q A do mnoºiny podmnoºin Q, q 0 Q je po áte ní stav a F Q je mnoºina koncových stav. Dvojici (q, w)
6 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY Q A nazveme kongurace kone ného automatu M. Kongurace (q 0, w) se nazývá po áte ní kongurace a (q, ε), kde q F, je koncová kongurace kone ného automatu M. Relaci M (Q A ) (Q A ) nazveme p echodem automatu M. Jestliºe p δ(q, a), pak (q, aw) M (p, w), pro libovolné w A. ekneme, ºe et zec w A je p ijat nedeterministickým kone ným automatem, pokud existuje posloupnost p echod (q 0, w) (q, ε) pro n jaké q F (z po áte ní kongurace do koncové kongurace).[5] Kone ný automat je deterministický (DKA, anglicky DFA) pokud δ(q, a) nemá více neº jeden prvek pro kaºdé q Q a a A. Kaºdý nedeterministický kone ný automat m ºe být p eveden na ekvivalentní (p ijímající stejný jazyk) deterministický kone ný automat. Procesu transformace na deterministický automat se íká determinizace, anglicky také d-subset construction. Algoritmus funguje tak, ºe konstruujeme stavy DKA jako podmnoºiny stav NKA a vybíráme jen ty stavy, které jsou v dané chvíli dostupné (tzn. existuje p echod mezi stavy v NKA). Tyto podmnoºiny nazýváme d-subsety a asto je zapisujeme do hranatých závorek ([ ]) namísto mnoºinového zápisu ({}). Mnoºina cílových stav (zna eno Q(a)) pro n jaké a A jsou v²echny q Q, takové, ºe q δ(p, a) pro v²echny p Q. Pokud pro v²echny dvojice symbol a, b A, a b, platí Q(a) Q(b) =, pak se automat nazývá homogenní. [5] Nedeterministický zásobníkový automat (NZA, anglicky PDA) je sedmice M = (Q,A, G, δ, q 0, Z 0, F ), kde Q je kone ná mnoºina stav, A je vstupní abeceda, δ je zobrazení z Q (A {ε}) G do mnoºiny kone ných podmnoºin Q G, q 0 Q je po áte ní stav, Z 0 G je po áte ní symbol na zásobníku a F Q je mnoºina kone ných (p ijímajících) stav. Trojice (q, w, x) Q A G je kongurace zásobníkového automatu. Podle zvyklostí budeme vrchol zásobníku psát vpravo. Po áte ní kongurace ZA je trojice (q 0, w, Z 0 ), kde w je vstupní et zec. P echod zásobníkového automatu je relace na mnoºin kongurací: (q, aw, αβ) (p, w, γβ), kdyº (p, γ) δ(q, a, α). K-tá mocnina relace se zna í k, tranzitivní uzáv r se zna í +, a je tranzitivní a reexivní uzáv r relace. [5] Zásobníkový automat je deterministický, pokud platí: 1. δ(q, a, γ) 1, pro v²echny q Q, a A {ε}, γ G 2. Je-li δ(q, a, α), δ(q, a, β) a α β, pak α není p íponou β a β není p íponou α 3. Je-li δ(q, a, α), δ(q, ε, β), pak α není p íponou β a β není p íponou α Zjednodu²en e eno, m ºeme se, podobn jako u kone ného automatu, vºdy jednozna n rozhodnout podle vstupního symbolu a obsahu zásobníku, jaký p echod v daném stavu ud lat. U zásobníkových automat neplatí obecn, ºe lze kaºdý nedeterministický ZA p evést na ekvivalentní deterministický. Moºné je to pouze ve speciálních p ípadech, jako jsou nap íklad ZA ízené vstupem. Zásobníkový automat ízený vstupem je takový automat, kde lze kaºdou zásobníkovou operaci jednozna n ur it pouze podle vstupního symbolu. Jazyk p ijímaný zásobníkovým automatem lze denovat dv mi zp soby. První moºnost je, ºe p ijímáme et zce p echodem do koncového stavu, tzn. ºe existuje posloupnost p echod z po áte ního stavu do koncového stavu a p itom nezáleºí na kone ném obsahu zásobníku. A druhá moºnost je, ºe p ijímáme et zce prázdným zásobníkem, potom existuje posloupnost p echod z po áte ního stavu do stavu, kde je obsah zásobníku roven ε. Ve druhém p ípad
2.3. SUFIXOVÝ A FAKTOROVÝ AUTOMAT 7 je mnoºina kone ných stav zásobníkového automatu prázdná. Oba druhy automat lze vzájemn p evést, coº je denováno nap íklad v [5]. V tomto textu jsou pouºívány, stejn jako v [6] [10], pouze zásobníkové automaty p ijímající prázdným zásobníkem. 2.3 Suxový a faktorový automat Suxové i faktorové automaty jsou vy erpávajícím zp sobem popsány nap íklad v [9], zde se omezím pouze na n kolik základních princip. Máme-li dán et zec s A, pak suxový automat zkonstruovaný pro et zec s p ijímá v²echny p ípony tohoto et zce. Analogicky faktorový automat p ijímá v²echny pod et zce daného et zce. P ijetí (vyhledání) pod et zce (nebo p ípony) probíhá v ase lineárním k délce pod et zce a v bec nezávisí na délce et zce s. ƒasová sloºitost je hlavní výhodou tohoto postupu, protoºe logicky délka pod et zce je men²í neº délka et zce. Nevýhodou je velikost vzniklého automatu. To lze áste n vyváºit pouºitím oracle automat, ale to není p edm tem této práce. Je²t bych poznamenal, ºe faktorový automat se li²í od suxového jen tím, ºe v²echny jeho stavy jsou koncové. V této práci se pouºívají jen suxové automaty. Tyto automaty se také ob as v anglické literatu e ozna ují jako DAWG (Direct Acyclic Word Graph). Suxový automat m ºeme zkonstruovat nap íklad pomocí algoritmu 3.10 z [9]. Vstupem je et zec x = a 1 a 2...a n nad abecedou A a výstupem je deterministický kone ný automat M = ({0, 1, 2,.., n},a, δ, 0, {0, n}) p ijímající v²echny suxy et zce x. Mnoºinu δ zkonstruujeme následovn : 1. δ(i 1, a i ) = i, pro v²echny i = 1, 2,..., n 2. δ(0, a) = i, pokud δ(i 1, a) = i, pro v²echny i = 2, 3,..., n A nakonec p evedeme zkonstruovaný nedeterministický automat na ekvivalentní deterministický. Jak je vid t, postup konstrukce tohoto automatu je relativn p ímo arý a názorný. Pravidla z bodu 1 nám umoºní p ijmout celý et zec a poté v bodu 2 p idáme p echody, které nám umoºní "p esko it"prexy et zce, takºe m ºeme p ijmout v²echny p ípony. Výsledný automat m ºe být nedeterministický, coº nastane, pokud se v et zci opakuje n jaký symbol, takºe pro praktické pouºití musíme automat je²t zdeterminizovat nebo pouºít n kterou techniku simulace NKA, nap. fail funkce, dynamické programování, bitový paralelismus ap. [9]. Uvaºujme nap íklad, ºe máme et zec x = a2 a2 a0 a0 a2 a0 b1 b0 nad abecedou A = {a2, a1, a0, b1, b0 } ( et zec je prexový zápis stromu t z obrázku 2.1, ale to te není d leºité). Nedeterministický kone ný automat p ijímající v²echny p ípony tohoto et zce, vzniklý pouºitím kroku 1 a 2 z p edchozího algoritmu, je na obrázku 2.3. Deterministická verze stejného automatu je na obrázku 2.4. V dal²ím textu se nám je²t hodí denovat termín páte automatu. Páte suxového (faktorového) automatu je nejdel²í souvislá posloupnost stav a p echod vedoucích z po áte ního stavu automatu M. Jinými slovy je to posloupnost stav a p echod, které projdeme, pokud máme na vstupu kompletní et zec, pro který je automat zkonstruován. Na obrázku 2.4 jsou to nap íklad stavy [0], [1,2,5], [2], [3], [4], [5], [6], [7], [8] a p echody mezi nimi.
8 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY Obrázek 2.3: Nedeterministický kone ný suxový automat pro et zce x = a2 a2 a0 a0 a2 a0 b1 b0
2.3. SUFIXOVÝ A FAKTOROVÝ AUTOMAT 9 Obrázek 2.4: Deterministická verze automatu z obrázku 2.3
10 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY 2.4 Algoritmus online konstrukce suxového automatu V minulé kapitole jsme si popsali, jak zkonstruovat suxový automat pro daný et zec. Nevýhodou popsaného postupu je to, ºe musíme automat determinizovat, coº je asov a pam ov náro né. Lep²í by bylo zkonstruovat b hem na ítání et zce rovnou deterministický automat. Tomuto postupu se íká online konstrukce. P i online konstrukci v kaºdém kroku, tak jak na ítáme vstupní et zec, upravujeme aktuální automat tak, aby odpovídal deterministickému automatu p ijímajícímu p ípony dosud na tené ásti et zce. Máme-li et zec x = a 1 a 2...a n, tak v i-tém kroku vytvo íme suxový automat pro et zec a 1 a 2...a i, i n. Jak uº bylo zmín no, i tyto algoritmy jsou známé ([4], [2], [3]), jen ne tak ²iroce jako p vodní algoritmus. Algoritmus uvedený v lánku [4] je sice upravený na pouºití pro degenerované et zce (na jedné pozici ve vstupním et zci m ºe být více symbol ), ale dal by se jednodu²e (vynecháním jednoho cyklu) upravit pro normální et zce. Tento algoritmus má v²ak tu nevýhodu, ºe si p ímo uchovává d-subsety v²ech stav, tedy v nejhor²ím p ípad (nap íklad p i et zci aaaa...) se musí v kaºdém kroku aktualizovat v²echny stavy a tak má algoritmus výslednou sloºitost O(n 2 ). Výhodou d-subset je známá vlastnost, ºe identikují konce výskytu daného pod et zce. Vzhledem k asymptotické sloºitosti algoritmu jsem nakonec zvolil algoritmus uvedený ve [2]. Podobný algoritmus je uveden i ve [3]. Algoritmus 2.1 je pseudokód algoritmu z [2] p epsaný do na²í pouºívané notace. V algoritmu 2.1 jsou stavy identikovány namísto mnoºiny symbol pomocí jen jednoho symbolu. Je tomu tak, protoºe, jak uº bylo zmín no, velikost dsubset (v [2] nazývány end-pos) je nelineární k délce et zce. To je také jeden z d vod, pro je determinizace automatu pam ov náro ná. Samoz ejm namísto dsubset je pot eba jiná dodate ná struktura, která by nám poskytla ekvivalentní informace. Pro online konstrukci je nap íklad d leºité v d t, z jakých stav musíme vést nové p echody, tj. jaké stavy odpovídají sux m aktuáln zpracované ásti et zce. Strukturou, která nám toto umoºní, je tzv. tabulka sux link. Význam sux link je nejlep²í demonstrovat na p íklad. Nejprve si ho v²ak denujme formáln. Hodnotu uzlu v - val(v) je nejdel²í et zec, který vytvo íme pomocí p echod z po áte ního stavu do uzlu v. Pak suf[v] se rovná uzlu w takovému, ºe val(w) je nejdel²í sux val(v), který se nerovná val(v) (vlastní sux). Obvykle se suf[q 0 ] rovná q 0 nebo jiné speciální hodnot (nil, null ap.). Hranu (v, suf[v]) nazýváme sux link a tabulka suf je tabulka sux link. Protoºe hodnota suf[v] je ost e men²í neº hodnota v, pak suf tvo í stromovou strukturu uzl. Díky tomu, ºe pro kaºdý uzel v denujeme práv jeden suf[v], tak pam ové nároky pro uloºení tabulky sux link jsou lineární k po tu uzl (na rozdíl od d-subset ). Podívejme se na obrázek 2.5, kde v ásti a) vidíme DAWG, neboli suxový automat, pro et zec aabab a v ásti b) gracké znázorn ní sux link. Pro názornost jsem ozna il stavy sou asn pomocí d-subset, aby bylo vid t, ºe nám ob konstrukce dávají stejné informace. Vezmn me si nap íklad stav [3], jehoº hodnota je et zec aab. Nejdel²í sux, krom aab, je et zec ab, coº je hodnota stavu [3,5] (p ipomínám, ºe hodnota je nejdel²í z et zc reprezentovaných daným stavem), existuje tedy sux link ze stavu [3] do [3,5]. Zárove vidíme, ºe pokud hodnota stavu [3,5] p edstavuje sux hodnoty stavu [3], tak to znamená, ºe výskyt obou et zc kon í na stejné pozici, tedy d-subset stavu [3,5] obsahuje jako svojí podmnoºinu d-subset stavu [3] (coº je vid t na první pohled). Toto pozorování nám dává vlastn návod,
2.4. ALGORITMUS ONLINE KONSTRUKCE SUFIXOVÉHO AUTOMATU 11 jak v p ípad pot eby sestavit d-subset daného stavu. Nap íklad kdybychom se pohybovali z daného stavu po sux lincích opa ným sm rem aº do stavu, který leºí na páte i a tyto stavy ozna ili jejich po adím na páte i (tak jako je to v p íkladu), tak d-subset onoho stavu je sjednocením d-subset stav na páte i (jak je vid t na p íkladu stav [3,5] a [1,2,4]). Pro úplnost se je²t podívejme na zbylé stavy. Stejná situace jako u stavu [3] je i u stavu [5], kde se op t jedná o sux ab. U hodnoty stavu [4] je nejdel²í sux jen et zec a, který odpovídá stavu [1,2,4]. Stav [2] má hodnotu aa, tedy nejdel²í sux je op t a a sux link vede do uzlu [1,2,4]. Uzel [3,5] má hodnotu ab, sux b sice v automatu existuje, ale sux link by sm oval do stejného uzlu, coº nelze, takºe z [3,5] vede sux link do [0]. U stavu [0] si m ºeme p edstavit, ºe reprezentuje sux ε, který je p íponou libovolného et zce. Obrázek 2.5: a) DAWG(aabab), b) gracké znázorn ní sux link Zbývá otázka, jak vlastn sux linky zkonstruovat a jak zmín né vlastnosti vyuºít p i online konstrukci suxového (nebo faktorového) automatu. Je tedy vhodná chvíle podívat se na algoritmus 2.1 a popsat si, jak funguje. Prvním krokem je inicializace algoritmu, kterou popisují ádky 1-3. Inicializace se skládá ze t í krok. Na prvním ádku denujeme prom nnou last, která p edstavuje poslední vytvo ený uzel na páte i automatu. V 0-tém kroku je to logicky stav 0, který vytvo íme na ádku 2 a p idáme do mnoºiny stav Q. Nakonec zbývá je²t inicializovat sux link stavu 0. Protoºe se jedná o po áte ní stav, tak suf[0] = nil, kde nil je na²e speciální hodnota, kterou nepouºijeme k ozna ení ºádného stavu.
12 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY Algoritmus 2.1 Online konstrukce suxového automatu (DAWG) Vstup: et zec x nad abecedou A, x = a 1 a 2...a n, n 1 Výstup: Deterministický suxový automat M = (Q,A, δ, 0, ) 1: last = 0 {inicializace automatu} 2: Q.add(last) 3: suf[last] = nil 4: for i = 1 to n do 5: newlast = novystav() {nový stav} 6: Q.add(newlast) 7: create solid δ(last, a i ) = newlast 8: w = suf[last] 9: while w nil and δ(w, a i ) do 10: create non-solid δ(w, a i ) = newlast {p idat p echody} 11: w = suf[w] 12: end while 13: v = δ(w, a i ) 14: if w = nil then 15: suf[newlast] = 0 16: else if δ(w, a i ) = v is solid then 17: suf[newlast] = v {dal²í výskyt et zce} 18: else 19: newnode = novystav() {rozd lení stavu} 20: Q.add(newnode) 21: update δ(w, a i ) = newnode solid 22: suf[newlast] = newnode 23: suf[newnode] = suf[v] 24: suf[v] = newnode 25: w = suf[w] 26: while w nil and δ(w, a i ) = v is non-solid do 27: update δ(w, a i ) = newnode {p esm rovat p echody} 28: w = suf[w] 29: end while 30: for each a in A do 31: create non-solid δ(newnode, a) = δ(v, a) {kopie odchozích} 32: end for 33: end if 34: last = newlast 35: end for Na ádku 4 za íná cyklus, kterým budeme postupn zpracovávat symboly ze vstupního et zce a podle nich p íslu²ným zp sobem aktualizovat automat. Pro kaºdý vstupní symbol nejprve vytvo íme na páte i nový stav, který si uloºíme do prom nné newlast. K vytvo ení nových stav budeme pouºívat funkci novystav(), která jednodu²e vrátí nové unikátní pojmenování stavu. Funkci novystav() lze realizovat triviáln, nap íklad pomocí jednoduchého íta e, který vºdy automaticky zvý²í svojí hodnotu, takºe její pseudokód ani neuvádím.
2.4. ALGORITMUS ONLINE KONSTRUKCE SUFIXOVÉHO AUTOMATU 13 Následn nový stav uloºíme do mnoºiny stav Q ( ádek 6). Nový stav musíme je²t spojit s páte í tím, ºe vytvo íme p echod z last do newlast. P echod si navíc ozna íme jako "solid", coº znamená, ºe uº se v budoucnu nem ºe zm nit. Druhá moºnost, která se v pr b hu algoritmu vyskytne je "non-solid", tedy analogicky opa ný význam, tj. ºe v dal²ích krocích algoritmu se m ºe p echod zm nit. Tím máme páte automatu aktualizovanou a m ºeme pokra ovat dal²ím krokem ( ádek 8). Dal²í fází algoritmu je (na ádcích 8-12) vytvo ení nových p echod z n kterých stávajících stav do nového stavu - newlast. Pro lep²í pochopení se podívejme na obrázek 2.6, který zobrazuje situaci po t etím kroku vytvá ení DAWG(aabab), tedy DAWG(aab) a p íslu²né sux linky. V tomto p ípad uº nezna íme stavy pomocí d-subset, ale pouze pomocí po adí jak vznikly. ƒárkovan jsou ozna eny p echody, které v tomto kroku p idáme. Prom nná last má hodnotu [2] a newlast [3]. Obrázek 2.6: P íklad p idávání nových p echod, a) DAWG(aab), b) p íslu²né sux linky V cyklu na ádku 9 postupujeme po sux lincích, dokud nedojdeme do po áte ního stavu anebo dokud neobjevíme p echod na aktuální vstupní symbol. Uzly si p i azujeme do prom nné w. V tomto p ípad bude mít w nejprve hodnotu [1], pak [0] a nakonec nil. Kdyº si vzpomeneme na popis toho, jak pomocí sux link získat d-subsety stav, tak vlastn v²echny procházené stavy by obsahovaly v d-subsetu hodnotu z prom nné last (kdybychom stavy zna ili d-subsety a ne po adím, v jakém vznikají). Samoz ejm výjimkou je stav [0], coº je výjime ný p ípad, protoºe jeho d-subset sice neobsahuje last, ale musíme ho vºdy také uvaºovat, protoºe z n j musí vést p echody na v²echny symboly, které se v et zci vyskytují, coº je nejlépe vid t z p íkladu nedeterministické verze suxového automatu, viz obrázek 2.3. Na²t stí tomu odpovídá i to, ºe se ve stavu [0] "scházejí"v²echny sux linky, jelikoº, jak uº bylo zmín no, m ºeme si p edstavit, ºe [0] reprezentuje et zec ε, který je p íponou v²ech et zc. Kdyº tedy d-subsety v²ech stav obsahují last (v tomto p ípad 2), znamená to, ºe tam kon í výskyt v²ech et zc, které jsou hodnotami daných uzl. Dále víme, ºe za last je dal²í znak, nyní konkrétn b, kterým mají dané pod et zce pokra ovat. Takºe abychom
14 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY mohli p ijmout i pod et zce (suxy) prodlouºené o tento nový znak, musíme ve v²ech uzlech p idat p echod na tento vstupní symbol. V²echny nové p echody vedou do uzlu newlast. Sice bychom mohli vytvo it pro kaºdý p echod nový kone ný (a v tu chvíli zárove koncový) stav, ale bylo to zbyte né, protoºe tyto stavy by byly shodné jako newlast. Zárove to odpovídá tomu, ºe práv tento uzel p edstavuje nejdel²í sux (p ipome me, ºe páte je nejdel²í cesta v suxovém automatu) a ostatní cesty jsou jeho suxem. D leºité je poznamenat, ºe tyto p echody se mohou po ase zm nit, proto je ozna íme jako non-solid. Mnoºin uzl, které procházíme zmín ným cyklem, se íká pracovní cesta. Jak je vid t, cyklus m ºe skon it dv mi moºnými zp soby. M ºe nastat w = nil, to znamená, ºe jsme pro²li v²echny uzly na pracovní cest a z kaºdého jsme vytvo ili p echod. Mimo jiné to implikuje, ºe jsme museli vytvo it i p echod z po áte ního stavu [0], coº zna í, ºe se daný symbol je²t v automatu v bec nevyskytuje. Díky této informaci m ºeme nastavit suf[newlast] = [0]. Viz akce provedené na ádku 14 a 15 algoritmu 2.1. Toto je i situace, která nastane v p íkladu na obrázku 2.6. V opa ném p ípad, tj. kdyº w není nil, tak jiº existuje n jaký p echod na aktuální vstupní symbol z n jakého uzlu na pracovní cest. Jinými slovy, jiº je zaindexovaný n jaký krat²í pod et zec doposud zpracované ásti vstupního et zce. V tomto p ípad víme, ºe existuje uzel v = δ(w, a), kde a je aktuální symbol na vstupu a w je uzel na pracovní cest, do kterého jsme do²li. Nyní nastává klí ový bod algoritmu a to rozhodnout se, zda rozd lit stav v nebo ne. Lépe je v²e vid t op t z p íkladu. Nap íklad na obrázku 2.7 je znázorn n dal²í krok konstrukce automatu pro et zce aaba. V tomto p ípad se last = [3], takºe první hodnota w bude suf[last] = w = [0] ( ádka 8). Protoºe p echod z [0] na symbol a jiº existuje, neprob hne cyklus ani jednou a w z stane nastaveno na [0]. Uzel v se rovná δ([0], a) = [1]. Vidíme, ºe uzel v p edstavuje faktor a, který zárove odpovídá nejdel²ímu suxu aaba. To p esn odpovídá denici sux linku, takºe p idáme sux link suf[newlast] = v. Popsaná akce je na ádku 17. Kdyº se vrátíme k p edstav o tom, ºe pomocí sux link lze získat d-subsety, tak vlastn touto operací roz²í íme d-subset stavu v o dal²í výskyt et zce, který je hodnotou tohoto stavu (v p íkladu je to o výskyt a na pozici 4). M ºe se v²ak také stát, ºe uzel v p edstavuje více faktor (vede do n j více cest), ale ne v²echny tyto faktory jsou zárove suxy, takºe bychom vytvo ili sux link ²patn. V takovém p ípad je pot eba rozd lit uzel v. Podívejme se nap íklad na obrázek 2.8, který zobrazuje situaci t sn p ed rozd lením stavu v = [3] (tedy jsme p ed spu²t ním ádku 19). Do stavu [3] vedou hned t i cesty: b, ab, aab, ale cesta aab není suxem aaba. V tomto p ípad provedeme rozd lení stavu v = [3]. Operace rozd lení stavu se skládá z n kolika krok. Nejprve si uv domme, eho chceme vlastn docílit. V²echny cesty v automatu chceme zachovat, jenom pot ebujeme rozli²it cesty pro n které suxy. Uºite ná je op t p edstava roz²i ování d-subsetu. Kdybychom pouze nastavili sux link, tedy potaºmo p idali do d-subsetu stavu [3] dal²í výskyt (pozici 5), tak bych íkali, ºe se na oné pozici vyskytují v²echny faktory, které odpovídají cest do tohoto uzlu. Ale jak je vid t na p íkladu, tak pro pod et zec aab by toto neplatilo (nevyskytuje se na pozici 5). Namísto toho tedy vytvo íme nový stav, který bude odpovídat "krat²ím"sux m a stav [3] bude odpovídat jen et zci aab. Prvním krokem operace rozd lení stavu je vytvo ení nového uzlu - ádek 19 a samoz ejm jeho p idání do mnoºiny Q - ádek 20. Nový stav si ozna íme prom nnou newnode. Potom je pot eba p esm rovat existující p echody do nového
2.4. ALGORITMUS ONLINE KONSTRUKCE SUFIXOVÉHO AUTOMATU 15 Obrázek 2.7: Napojení sux linku, a) DAWG(aaba) b) p íslu²né sux linky stavu. To probíhá v cyklu na ádcích 26-29. Známým zp sobem procházíme uzly po pracovní cest, dokud nedojdeme na konec (w = nil) a zárove dokud existují p echody ozna ené non-solid vedoucí z práv zpracovávaného uzlu na aktuální vstupní symbol. Tato podmínka odpovídá tomu, ºe chceme p esm rovat jen p echody reprezentující aktuální sux. V p íklad na obrázku 2.8 takto p esm rujeme p echod z [0] na b. P echod z [1] na b jsme p esm rovali uº na ádku 21. Zbývá nám je²t vytvo it p echody vedoucí z nového stavu. Protoºe chceme zachovat v²echny cesty, které jsme m li p ed rozd lením stavu, p echody z nového stavu jsou prostou kopií p echod z p vodního stavu. Jediným rozdílem je, ºe jsou ozna eny jako non-solid. Tuto operaci znázor ují ádky 30-32 v algoritmu 2.1. V na²em p íkladu se jedná jen o p echod z [3] do [4] na a. Výsledný automat uº byl prezentován na obrázku 2.5 (v p ípad, ºe bychom pojmenovávali stavy podle po adí, tak by byl stav [1,2,4] ze zmín ného obrázku pojmenován pouze [1] a stav [3,5] bychom pojmenovali [6]). Abychom celou operaci úpln dokon ili, zbývá je²t aktualizovat p íslu²né sux linky. V algoritmu 2.1 se jedná o ádky 22-24, které jsme p i popisu algoritmu prozatím vynechali. Jak uº bylo zmín no, nový stav odpovídá sux m aktuáln zpracované ásti pod et zce, tedy i nejdel²ímu z nich (v na²em p ípad ab). Nastavíme tedy suf[newlast] = newnode ( ádka 22). Sux link nového stavu newnode povede do stejného stavu jako p vodní sux link p vodního stavu v (v tomto p ípad [0]) viz ádek 23. A nakonec nový sux link stavu v povede do newnode, protoºe jsme vytvo ili stav, který p edstavuje suxy faktoru, který je hodnotou stavu v. Tím pádem je nejdel²í sux zjevn hodnotou nového stavu - newnode ( ádek 24). Nap íklad v p ípad uzlu [3] reprezentujícího faktor aab, uzel newnode odpovídá sux m b a ab, tedy nejdel²í sux, který se nerovná aab je ab a sux link vede stavu, který
16 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY má tuto hodnotu tj. newnode ([3,5] nebo [6] podle toho jaké pouºíváme zna ení). Obrázek 2.8: Situace p ed rozd lením stavu [3], a) nekompletní DAWG(aabab) b) sux linky Tím je operace rozd lení stavu hotová a dostáváme se na poslední ádek (34), kde uº sta í pouze nastavit last = newlast pro dal²í pr chod cyklem s dal²ím symbolem ze vstupu. Nakonec bychom m li je²t vysv tlit, co znamená zna ení p echod solid a non-solid. V p edchozím textu jsme si ho denovali bez podrobností, jako ty, které se mohou zm nit a ty které ne. A navíc jsme se podle tohoto ozna ení p echodu rozhodovali, zda stav rozd lit nebo ne. Trochu matoucí je to, ºe název solid, popisuje hlavn moºné operace s p echodem, ale uº mén jeho vlastnosti. To se sice hodí v algoritmu, ale je to trochu mén názorné. Denujme si tedy toto zna ení p esn. Nejprve zave me funkce length(q), pro n jaký stav q, která vrací délku nejdel²ího faktoru, který je hodnotou uzlu q. Tedy obdobn jako jsme denovali hodnotu uzlu, jenom vracíme délku (po et symbol ). Potom p echod δ(p, a) = q je ozna en jako solid práv tehdy, kdyº length(q) = length(p) + 1. V opa ném p ípad je p echod ozna en jako non-solid. Jinými slovy p echody ozna ené jako non-solid tvo í v automatu "zkratky", zatímco p echody ozna ené solid jsou nejdel²í moºná cesta. Z toho plyne i pouºívaná vlastnost v algoritmu 2.1. Zatímco nejdel²í cestu uº zm nit (prodlouºit) nem ºeme, tak zkratky se mohou po ase zm nit (prodlouºit), jako se tomu stalo v p íklad z obrázku 2.8. Stav δ([1], b) = [3] je ozna ený non-solid, protoºe length([3]) = 3 a length([1]) = 1 tj. 3 1 + 1. V²imn me si, ºe t mto princip m odpovídá i postupné zna ení p echod p i jejich vytvá ení. Kdyº vytvá íme p echody na páte i tak jsou vºdy solid, zatímco kdyº postupujeme po sux lincích dál, vytvá íme vlastn vºdy zkratky. Stejn tak, kdyº kopírujeme odchozí p echody z nového rozd leného stavu, jsou to vlastn zkratky do dal²ích stav na páte i, respektive tvo í krat²í faktory neº ty, pokud se pohybujeme nap íklad po páte i. Tím jsme vlastn celkem podrobn popsali celý algoritmus online konstrukce DAWG.
2.4. ALGORITMUS ONLINE KONSTRUKCE SUFIXOVÉHO AUTOMATU 17 M ºeme tedy stru n zmínit jeho výhody a nevýhody. Nevýhodou je to, ºe nemáme v kaºdém kroku denovanou mnoºinu koncových stav. Ve své podstat je to d sledek toho, ºe místo d-subset pouºíváme sux linky. Uvaºujme nap íklad p íklad aaaa na obrázku 2.9. V kaºdém kroku jen p idáme sux link na p edcházející stav, tedy provedeme operaci s konstantní sloºitostí. Kdybychom m li ozna it v²echny koncové stavy, museli bychom projít celou pracovní cestu. V tomto p ípad bychom tedy pro²li v²echny stavy. Stejné by to bylo, kdybychom místo sux link pouºívali d-subsety. Museli bychom projít v²echny stavy a aktualizovat d-subset, protoºe v²echny pod et zce se vyskytují i na poslední pozici. Nevýhody by byly v tom p ípad hned dv. Jednak v kaºdém kroku i bychom museli ud lat i operací, takºe celkov by byla asová asymptotická sloºitost algoritmu O(n 2 ) a navíc pro uloºení d-subset bychom pot ebovali také nelineárním mnoºství pam ti. V p ípad, ºe pouºíváme sux linky, by platila jen první nevýhoda, protoºe pam ová náro nost jejich uloºení je lineární (pro kaºdý stav jeden sux link). Vzhledem k tomu, ºe se ani nevracíme po pracovní cest, tak neplatí ani druhá nevýhoda. Obrázek 2.9: DAWG(aaaa) a sux linky (te kovan ) To, ºe nemáme ozna ené koncové stavy je svým zp sobem d sledek toho, ºe nemáme ani nijak implicitn dané pozice výskyt et zc, jako je tomu v p ípad, ºe bychom udrºovali d-subsety. D vody jsou stejné jako v p edchozím p ípad. Na²t stí uº jsme na za átku kapitoly popsali, jak pomocí sux link získat pozice výskyt odpovídajících sux. Stejným zp sobem m ºeme dodate n zjistit i koncové stavy tak, ºe projdeme aktuální pracovní cestu. Pokud to ud láme jen jednou po skon ení hlavního for-cyklu, tak tím asymptotickou sloºitost algorimu nezvý²íme. V nejhor²ím p ípad je to n krok navíc, tedy n + n krok je stále asymptoticky O(n). Lineární asymptotická sloºitost O(n) je hlavní výhodou algoritmu 2.1. Pro je práv lineární, uº trochu napovídají p edchozí ádky, ale tuto vlastnost m ºeme odvodit i analýzou pseudokódu algoritmu. Inicializace je na první pohled konstantní. Poté následuje cyklus od 1 do n (délka et zce), který zpracovává vstupní et zec. Tomu se samoz ejm vyhnout nem ºeme, takºe hlavní otázkou je sloºitost operací uvnit tohoto cyklu. Uvnit cyklu jsou samé konstantní operace, aº na t i cykly - p idávání p echod, p esm rování p echod a kopie odchozích p echod. Poslední cyklus závisí pouze na po tu symbol v abeced, coº je konstanta, takºe tento cyklus nás trápit nemusí. Hor²í je situace s prvními dv ma cykly, které oba závisí na délce pracovní cesty. Na první pohled se m ºe zdát, ºe kdyº délka pracovní cesty m ºe být rovna délce p e tené ásti et zce (tedy v i-tém kroku má délku i), tak to znamená, ºe sloºitost algoritmu je O(n 2 ). Bylo v²ak dokázáno (více i mén názorn ), ºe tomu tak není a výsledná sloºitost je lineární, nap íklad v [2] a [3]. Inspirujme se nap íklad d kazem z [3] a popi²me si d kaz pro první cyklus. P edpokládejme, ºe máme et zec x a pro n j zkonstruovaný suxový automat M pro n jaký prex x. Zpracovanou ást et zce si ozna me w a p edpokládejme, ºe na vstupu je nyní n jaký symbol a. Dále si ozna me u, nejdel²í slovo, které je hodnotou uzlu w, který testujeme v podmínce
18 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY cyklu ( ádek 9). Uzel w získáme pomocí sux linku suf[last] ( ádek 8). V²imn me si, ºe u je sux w a ºe kone ná hodnota ua (poté co zastavíme cyklus) je suxem et zce wa, pokud je uzel w denován (není nil). et zec u je sux w, protoºe se na n j dostaneme sux linkem a skute nost, ºe ua je suxem et zce wa odpovídá ukon ovací podmínce - tj. zastavíme, kdyº p echod na a existuje. Dále si ozna me hodnotu k = w u. Schéma situace je na obrázku 2.10 a). Mimo jiné k zna í pozici výskytu u ve w. Obrázek 2.10: Pomocný obrázek k d kazu sloºitosti algoritmu 2.1. a) ná rt situace v obecném kroku b) ná rt situace v dal²ím kroku Nyní provedeme pozorování, ºe tím jak procházíme cyklem, tj. pohybujeme se po sux lincích blíºe po áte nímu stavu, tak se délka u sniºuje a tím pádem se naopak k zvy²uje ( w je v jednom kroku konstantní). Navíc potom co dokon íme pr chod cyklem, nastavíme sux link newlast (coº bude last v dal²ím kroku) na uzel, který odpovídá hodnot ua (uzel v v algoritmu). Sux link z newlast vede tedy nyní n kam do ásti, která byla ozna ena u (nebo je to p ímo ua). V p í²tím kroku za neme procházet cyklem práv od tohoto uzlu. Jelikoº délka u se bu sniºovala nebo se jeho délka nem nila, tak po áte ní hodnota k v dal²ím kroku (k i+1 ) je vºdy v t²í nebo rovna kone né hodnot v sou asném kroku. Poznámka: neznamená to, ºe kdyº u bude ε, tak uº nikdy nebude v t²í, protoºe k n mu m ºeme p idat aktuální symbol na vstupu (který jakoby "ukrojíme"z k) - vzhledem k tomu, ºe se ale sou asn prodlouºí w o jeden symbol, tak k z stane stejné (odpovídá to situaci, kdy p ijde sux, který
2.5. D LEšITÉ VLASTNOSTI STROM V PREFIXOVÉ NOTACI 19 jsme je²t neznali a pak z n j postupn vytvá íme del²í suxy). Situace je op t nazna ena na obrázku 2.10 b), který zna í situaci v následujícím kroku po p idání symbolu a v ásti obrázku a) (indexem i + i jsou ozna eny nové hodnoty prom nných). D sledkem popsaného principu je to, ºe ást et zce k díky sux linku p esko íme a u je to, co musíme teoreticky projít b hem cyklu. Pracovní cesta je tedy omezena prom nnou, která se neustále zv t²uje, tím pádem odpovídá celkový po et provedených iterací za v²echny pr b hy cyklu x. Podobn se dá postupovat i pro od vodn ní po tu krok druhého cyklu (p esm rování p echod ). Jiný pohled na d kaz m ºe být ten, ºe si p edstavíme, ºe chceme dosáhnout nejhor²ího p ípadu, tedy pracovní cesty délky rovné n. Ze za átku bychom tedy dostávali po ád stejný symbol, takºe sux linky by vedly z newlast do last. V tom p ípad ale neprovedeme t lo cyklu ani jednou. Musí p ijít dal²í symbol, jiný neº p edchozí, abychom pro²li celou pracovní cestu. Potom v²ak nastavíme sux link newlast na po áte ní stav a délka pracovní cesty uº nikdy nebude p es v²echny uzly. Je²t jednodu²eji si m ºeme lineárnost od vodnit tak, ºe po et p echod je lineárn závislý na délce et zce. Tedy abychom vytvo ili lineární po et p echod, musíme zavolat cyklus, který je vytvá í, lineárn -po et-krát. Co se tý e pr b hu algoritmu, v této kapitole jsme si popsali p edev²ím hlavní situace b hem jeho b hu. Kompletní p íklad bude uveden v následující kapitole 3. 2.5 D leºité vlastnosti strom v prexové notaci Nakonec této kapitoly se je²t podívejme na n které d leºité vlastnosti strom v prexové notaci, které uplatníme p i konstrukci zásobníkových automat. Z ejm nejd leºit j²í vlastnost prexového zápisu podstromu je to, ºe tento zápis je pod et zcem prexového zápisu stromu. Naopak v²ak neplatí, ºe kaºdý pod et zec prexového zápisu stromu je podstrom v prexovém zápisu. Tato vlastnost je zd vodn na nap íklad v [6], [10] tak, ºe pro daný et zec existuje n 2 pod et zc, ale jen n r zných podstrom (kaºdý uzel je ko enem podstromu). Abychom ov ili, zda je daný et zec skute n prexovým zápisem stromu, denujeme tzv. arity checksum. M jme et zec w = a 1 a 2..a m, m 1, nad ohodnocenou abecedou, pak arity checksum ac(w) = arity(a 1 ) + arity(a 2 ) +... + arity(a m ) m + 1. Práv tehdy, kdyº ac(w) = 0 a ac(w 1 ) 1 pro v²echny w 1, kde w = w 1 x, x ε, tak w je prexový zápis podstromu. Neformáln e eno, arity checksum p edstavuje po et uzl, které je pot eba je²t p e íst, aby byl strom kompletní. Druhá podmínka íká, ºe nesmí existovat prex et zce w, aby tento prex byl sám o sob stromem (tzn. nap íklad et zec w by byl zápis dvou strom v prexové notaci za sebou). Pojem arity checksum se nám bude hodit v dal²ích algoritmech. V automatech je arity checksum implementován pomocí zásobníkových operací, kde po et symbol na zásobníku reprezentuje aktuální arity checksum. Toto nám vlastn p ímo dává návod, jak sestavit zásobníkový automat p ijímající podstrom. Ve chvíli, kdy je arity checksum roven nule, jsme p e etli kompletní podstrom. To vysv tluje, pro pouºíváme zásobníkové automaty p ijímající prázdným zásobníkem. Dal²ím d sledkem je mimo jiné to, ºe výsledný automat bude mít mén p echod neº klasický suxový automat, protoºe n které p echody není moºno
20 KAPITOLA 2. ZÁKLADNÍ POJMY A ALGORITMY provést, kdybychom m li prázdný zásobník. Také tento fakt se musí zohlednit v následujících algoritmech.
Kapitola 3 Zásobníkový automat p ijímající v²echny podstromy daného stromu Zásobníkový automat p ijímající v²echny podstromy daného stromu se v anglické literatu e ([6], [10]) ozna uje jako subtree pushdown automata. Tento automat p ijímá v²echny úplné podstromy daného stromu zapsané v prexové notaci. V této kapitole si uvedeme jednak algoritmus pro konstrukci zásobníkového automatu p ijímajícího v²echny podstromy pomocí mezikroku vytvo ení nedeterministické verze automatu a pak také online algoritmus upravený, tak aby vytvo il odpovídající zásobníkový automat rovnou deterministický. Zásobníkové automaty p ijímající podstromy daného stromu jsou p edstaveny v [6]. Tyto ZA p edstavují úplný index stromu a deterministická varianta automatu vyhledává výskyt podstromu v ase lineárním k délce prexového zápisu podstromu a p itom v bec nezávisí na délce prexového zápisu p vodního stromu. Zásobníkové automaty p ijímající v²echny podstromy daného stromu p ijímají, jak uº bylo zmín no, prázdným zásobníkem, coº zna í, ºe jsme p e etli úplný podstrom.[10] D leºité vlastnosti prexového zápisu strom a podstrom jsem uº nazna il v p edchozí kapitole, nezbývá tedy neº uvést vlastní algoritmus. 3.1 Konstrukce nedeterministického ZA p ijímajícího v²echny podstromy Algoritmus je denovaný stejn jako v [10] a [6]. Vstupem algoritmu je strom t v prexové notaci pref(t) = a 1 a 2...a n, n 1 a výstupem je nedeterministický zásobníkový automat p ijímající v²echny podstromy daného stromu M = ({0, 1, 2,..., n},a, {S}, δ, 0, S, ) 1. pro v²echny stavy i, kde 1 i n, vytvo nový p echod δ(i 1, a i, S) = (i, S arity(a i) ) 2. pro v²echny stavy i, kde 2 i n, vytvo nový p echod δ(0, a i, S) = (i, S arity(a i) ) Automat vzniklý pomocí t chto krok pro strom z obrázku 2.1 je na obrázku 3.1. Pro znázorn ní zásobníkových operací je pouºita notace z [6], kde nap íklad zápis a2 S SS znamená p echod na symbol a2 a zásobníkovou operaci S SS. 21
22KAPITOLA 3. ZÁSOBNÍKOVÝ AUTOMAT P IJÍMAJÍCÍ V ECHNY PODSTROMY DANÉHO STROMU Obrázek 3.1: Nedeterministický zásobníkový automat p íjímající v²echny podstromy stromu t, pref(t) = a2 a2 a0 a0 a2 a0 b1 b0
3.1. KONSTRUKCE NEDETERMINISTICKÉHO ZA P IJÍMAJÍCÍHO V ECHNY PODSTROMY23 Jak je vid t výsledný automat má p esn stejné stavy a p echody jako odpovídající su- xový a faktorový automat (viz obrázek 2.3). P echody mají navíc denované zásobníkové operace, které jdou denované pomocí arity vstupního symbolu. Obsah zásobníku tedy koresponduje s arity checksum. Pro praktické pouºití je pot eba vzniklý nedeterministický automat zdeterminizovat. Kaºdý nedeterministický zásobníkový automat ízený vstupem lze p evést na ekvivalentní determinický zásobníkový automat pomocí algoritmu, který je roz²í ením standardního algoritmu determinizace.[6] V algoritmu se pouºívá mnoºina cpds(q) (Contents of the PushDown Store), která pro kaºdý stav q obsahuje moºné obsahy zásobníku, kdyº se automat nachází práv ve stavu q. [10] Pomocí mnoºiny cpds(q) provádíme kontrolu, zda lze provést daný p echod, respektive zásobníkovou operaci s ním spojenou. Algoritmus determinizace vstupem ízeného zásobníkového automatu je op t denovaný stejn jako v [10] a [6]. Na vstupu je acyklický nedeterministický ZA M = ({0, 1, 2,..., n},a, {S}, δ, 0, S, ), kde je navíc po adí stav takové, ºe kdyº δ(p, a, α) = (q, β) pak p < q. Výstupem algoritmu je samoz ejm ekvivalentní deterministický ZA M = (Q,A, {S}, δ, 0, S, ). Postup je následující: 1. Na po átku je q 0 = [0], Q = {q 0 } a cpds(q 0 ) = {S} a [0] je neozna ený stav. 2. (a) Vyber neozna ený stav q' z Q' takový, ºe q' obsahuje nejmen²í moºné stavy q z Q, kde 0 q n. (b) Pokud je v cpds(q') n jaké S r, kde r 1 (tj. nap íklad S, SS, ale ne ε), tak pro kaºdý vstupní symbol a A prove : i. P idej p echod δ (p, a, α) = (q, β), kde q = {q : δ(p, a, α) = (q, β) pro v²echny p q }. (Jinými slovy, vytvo íme nový stav podle p echod, které jsou denovány ze stav, které jsou v d-subsetu q'. Takto denovaná mnoºina se práv nazývá d-subset stavu). ii. Pokud Q' je²t neobsahuje q, pak p idáme q do Q' a vytvo íme cpds(q ) =. iii. Do cpds(q) p idej v²echny ω takové, ºe δ(q, aγ) (q, ε, ω), kde γ cpds(q ) (Tedy p idáme moºné obsahy zásobníku, které mohou nastat po p echodu mezi stavy, kdyº víme, jaký je vstupní symbol a jaké jsou moºné stavy na zásobníku ve stavu, ze kterého vycházíme.) (c) Ozna q' jako ozna ený. 3. Opakuj krok 2 dokud v²echny stavy v Q' nejsou ozna ené. Kdyº si odmyslíme formát pravidel, je postup determinizace v podstat stejný jako u kone ných automat, aº na kontrolu v kroku (b) a úpravy mnoºiny cpds, hlavn v kroku iii. Podívejme se op t na p íklad stromu t, pref(t) = a2 a2 a0 a0 a2 a0 b1 b0, z obrázku 2.1. Nedeterministická verze je na obrázku 3.1 a ekvivalentní deterministická je na obrázku 3.2. P i konstrukci vzniknou následující mnoºiny cpds: cpds([0]) = {S} cpds([3, 4, 6]) = {ε} cpds([6]) = {S} cpds([1, 2, 5]) = {SS} cpds([3, 6]) = {S} cpds([7]) = {S} cpds([2]) = {SSS} cpds([4]) = {ε, S} cpds([8]) = {ε} cpds([3]) = {S, SS} cpds([5]) = {SS}