Utótag automata | |||||||
---|---|---|---|---|---|---|---|
angol utótag automata irányított aciklikus szógráf | |||||||
Utótag automata az abcbc -hez | |||||||
Típusú | Alkarakterlánc index | ||||||
Feltalálás éve | 1983 | ||||||
Szerző | Anselm Bloomer, Janet Bloomer, Andrzej Ehrenvecht , David Haussler , Ross McConnell | ||||||
Bonyolultság az O-szimbólumokban | |||||||
|
|||||||
Médiafájlok a Wikimedia Commons oldalon |
Suffix automaton ( angol suffix automaton , irányított aciklikus szógrafikon ) egy olyan adatstruktúra , amely lehetővé teszi egy adott karakterlánc részkarakterláncaihoz kapcsolódó információk tömörített formában történő tárolását és feldolgozását . Egy determinisztikus véges automatát képvisel, amely elfogadja a szó összes utótagját, és csak azokat, és az összes ilyen automata közül a lehető legkisebb számú állapottal rendelkezik. Kevésbé formálisan az utótag automata egy irányított aciklikus gráf , amelynek megkülönböztetett kezdeti szimbólumokkalmegíveivannakés „végső” csúcsaicsúcsa összefűzve egy adott utótagot alkotnak. Az összes gráf közül, amely megfelel ennek a leírásnak, az utótag-automata az, amelyiknek a lehető legkisebb számú csúcsa van .
Az utótag-automatát először a Denveri és Colorado Egyetem tudósainak egy csoportja írta le 1983-ban, és azt is kimutatták, hogy az automata mérete lineárisan függ a hosszától , és egy online algoritmust is javasoltak a felépítéséhez. lineáris futási idő . A témával kapcsolatos további munkák során az utótag-automaták és az utótagfák [⇨] között szoros összefüggést fedeztek , és az utótag-automata fogalma különféle általánosításokat kapott. Így bevezettek egy tömörített utótag-automatát, amelyet az utótag-bórhoz hasonló eljárással kaptunk az eredetiből, hogy utótagfát kapjunk, valamint egy általánosított utótag-automatát, amely szavak halmazára épül fel, és szavakat fogad el . amelyek az adatok legalább egyikének utótagjai .
Az utótag-automaták segítségével hatékonyan megoldhat olyan problémákat, mint egy részkarakterlánc keresése egy karakterláncban , két vagy több karakterlánc legnagyobb közös részkarakterláncának meghatározása és egyebek .
Az utótag-automata fogalmát a Denveri és Colorado Egyetem tudósainak egy csoportja vezette be Anselm Blumer, Andrzej Ehrenvecht , David Haussler , Ross McConnell és Janet Bloomer 1983-ban, bár találkoztak vele rokon szerkezetekkel. korábban Peter Weiner [1] , Vaughn Pratt [2] és Anatolij Olesevich Slisenko [3] utótagfák felépítésének algoritmusaival foglalkozott . Ugyanebben a munkában Bloomer és mások kimutatták, hogy egy ennél hosszabb szóból felépített automata nem tartalmaz több állapotot és nincs több átmenet, és bemutattak egy lineáris algoritmust is az automata felépítésére [4] .
1983-ban Mu Tian Chen és Joel Seiferas egymástól függetlenül kidolgozott egy utótag-automata felépítésére szolgáló algoritmust, amely kimutatta, hogy a Weiner-féle algoritmus [1] , amelyet 1973-ban javasoltak egy szóutótagfa felépítésére, egy utótag-automatát is készít a fordított szóhoz segédstruktúraként [ 5 ]. . 1987-ben Bloomer és mások egy utótagfával analógiával egy tömörített utótag-automatát [6] írtak le, amelyet egy utótag -automatából kaptak a nem végső állapotok törlésével , és 1997-ben Maxime Crochemore és Renaud Verin kifejlesztett egy lineáris algoritmust a közvetlen felépítéséhez [7] . 2001-ben Shunsuke Inenaga és mások kifejlesztettek egy lineáris online algoritmust tömörített utótag-automaták létrehozására [8] , valamint egy lineáris algoritmust egy előtagfa által adott szókészletre [9] tömörített utótag- automaták létrehozására .
Eredeti cikkükben Bloomer és munkatársai az általuk leírt szerkezetet egy minimális automataként határozták meg, amely felismeri egy adott szó összes részkarakterláncát (nem utótagját). Ezt a struktúrát irányított aciklikus szógráfnak nevezték [ 4 ] . Később ezt a nevet egy determinisztikus aciklikus véges automata szinonimájaként is használták - egy minimális automatát, amely felismer egy tetszőleges véges szavak halmazt (amely nem feltétlenül egy bizonyos karakterlánc utótagjainak vagy részkarakterláncainak halmazát alkotja) [10] [ 11] .
Az utótag-automaták és a kapcsolódó tények és tételek leírásakor gyakran használják a formális nyelvek elméletéből általában és különösen az automataelméletből származó jelöléseket [12] :
Formálisan egy determinisztikus véges automatát öt elemből álló halmaz definiál, ahol:
A gyakorlatban leggyakrabban a véges automatákat irányított gráfként ( diagramként ) ábrázolják úgy, hogy [13] :
Egy ilyen gráfban a csúcsokat és az íveket az automata állapotaival, illetve átmeneteivel azonosítjuk. Az automata akkor és csak akkor fogad el egy szót , ha van egy út a kezdeti állapotból valamilyen végső állapotba , így ha összefűzzük az ezen az úton talált szimbólumokat, akkor a szót kapjuk . Az automata által elfogadott szavak halmaza ennek az automatának a nyelvét alkotja [12] .
Egy szónak a nyelvhez viszonyított megfelelő kontextusát halmaznak nevezzük . Vagyis ez egy olyan szókészlet , amelyet a jobb oldali szóhoz rendelve egy szót kapunk a nyelvből . A helyes szövegkörnyezet természetes ekvivalencia-relációt indukál az összes szó halmazán. Ha egy nyelv definiálható valamilyen determinisztikus véges automatával, akkor számára létezik egy egyedi, egészen izomorfizmusig terjedő automata, amelynek egyidejűleg a lehető legkisebb állapota van. Egy ilyen automatát minimálisnak nevezünk egy adott nyelvhez , a Myhill-Nerode tétel lehetővé teszi, hogy kifejezetten megadjuk [14] [15] :
Egy nyelvet ábécén keresztül felismerő minimális automata a következőképpen adható meg:
|
Ebben a jelölésben az utótag automata egy minimális DFA, amely elfogadja az utótag nyelv szót . Egy szó megfelelő szövegkörnyezete egy adott nyelvhez viszonyítva olyan szavakból áll , hogy - utótag . Ez lehetővé teszi a következő lemma megfogalmazását, amely egy az egyben megfeleltetést definiál egy szó megfelelő kontextusa és az alszóban előforduló helyeinek halmaza között [16] [17] :
Legyen az előfordulások helyes pozícióinak halmaza -ben . A halmazok és a halmazok elemei között a következő egy az egyhez megfeleltetés van:
|
Például egy szó és annak alszava esetén , és . Informálisan olyan szavakból áll, amelyek az előfordulásokat a szó végéig követik, és - ezen előfordulások pozícióiból. Ebben a példában az elem megegyezik a szóval . Ugyanakkor az elem megfelel a szónak .
Ebből következik az utótag automata állapotainak és az általuk elfogadott szavaknak számos szerkezeti tulajdonsága. Legyen , akkor [17] :
Így az utótag-automata bármely állapota elfogadja ebből az állapotból a legnagyobb karakterlánc beágyazott utótagjainak valamilyen folytonos láncát [17] .
A karakterlánc bal oldali kiterjesztése az a leghosszabb karakterlánc , amelynek a jobb oldali kontextusa megegyezik a . Az állam által elfogadott leghosszabb karakterlánc hosszát a következővel jelöljük . Igaz rá, hogy [18] :
A karakterlánc bal oldali kiterjesztése a következőképpen ábrázolható: ahol a leghosszabb szó, amelyben a szó bármely előfordulását megelőzi a szó . |
Az állapotból származó utótag hivatkozás egy olyan állapotra mutató mutató, amely a legnagyobb utótagot tartalmazza , amelyet az állapot nem fogad el .
Ebben a jelölésben azt mondhatjuk, hogy az állapot pontosan minden olyan toldalékot vesz fel, amely hosszabb, mint és nem hosszabb, mint . Ezenkívül igaz a következő [18] :
Az utótag-hivatkozások egy fát alkotnak , amelyet a következőképpen lehet kifejezetten megadni: |
Az előtagfa (vagy furat ) egy gyökérorientált fa , amelynek ívei szimbólumokkal vannak megjelölve oly módon, hogyegy adott szimbólummal megjelölt csúcsából legfeljebb egy ív jön ki. Az előtagfa egyes csúcsai fel vannak címkézve. Az előtagfáról azt mondják, hogy a fa gyökerétől a címkézett csúcsokig tartó útvonalak által meghatározott szavak halmazát határozza meg. Így az előtagfák a véges automaták egy speciális fajtája, ha a gyökért tekintjük kiindulási állapotnak, a címkézett csúcsokat pedig végső állapotnak [19] . A szó utótagja bór egy előtag fa, amely meghatározza a szó utótagjainak nyelvét. Az utótagfa az utótag furatából tömörítési eljárással kapott fa, amelyben az egymást követő éleket összeragasztják, ha van közöttük egy nem végső csúcs, amelynek foka 2 [18] .
Definíció szerint utótag-automatát kaphatunk egy utótag furatának minimalizálásával . Ezenkívül tömörített utótag-automatát kaphatunk egy utótagfa minimalizálásával (feltételezve, hogy az ábécé szimbólumai a fa szélein lévő szavak), és egy hagyományos automata tömörítésével [8] . Azonban amellett, hogy nyilvánvaló kapcsolat van az utótag-automata és ugyanazon karakterlánc utótagfája között, egy karakterlánc utótag-automata és egy fordított karakterlánc utótagfája között is megállapítható némi megfelelés [ 20 ] .
A jobb oldali kontextusokhoz hasonlóan bevezethetünk bal oldali kontextusokat és jobb oldali kiterjesztéseket , amelyek megfelelnek az adott bal kontextussal rendelkező leghosszabb karakterláncoknak, valamint egy ekvivalencia relációt . Ha figyelembe vesszük a megfelelő kiterjesztéseket a karakterlánc előtag nyelvéhez képest , akkor azt kapjuk, hogy [18] :
Egy karakterlánc utótag fája kifejezetten a következőképpen adható meg:
Itt a hármas azt jelenti, hogy a -tól -ig karakterlánc a szélére van írva . |
Amiből az következik, hogy egy karakterlánc-automata utótag-hivatkozásainak fája és egy karakterlánc utótagfája izomorf [20] :
Az abbcbc és cbcbba szavak utótag szerkezetei |
---|
|
A bal oldali kiterjesztésekhez hasonlóan a jobb oldali kiterjesztésekhez is megfogalmazható egy szerkezeti lemma [18] :
A karakterlánc jobb oldali kiterjesztése a következőképpen ábrázolható: ahol a leghosszabb szó, így az in előfordulását közvetlenül a szó követi . |
Az utótag-automatákban a karakterláncok hossza nem több állapotnál és nem több átmenetnél, és ezeket a becsléseket karakterláncokon , illetve [16] értjük el . Az állapotok és az átmenetek száma közötti összefüggésre egy automatában erősebb állítás is megfogalmazható: , ahol és az átmenetek, illetve állapotok száma [17] .
Maximum utótag automaták |
---|
|
Egy karakterlánc utótag-automatája úgy épül fel, hogy egymás után felépítjük a szót, amelyre épül. Kezdetben egy üres szóra épül egy triviális automata, majd minden lépésben egy szimbólumot adunk az aktuális szóhoz, ami az automata állapotainak és átmeneteinek átrendezését vonja maga után [21] .
Miután új karaktert rendel egy szóhoz, néhány ekvivalenciaosztály megváltozik. Legyen a szó megfelelő szövegkörnyezete a szó utótagnyelvéhez képest . Ekkor a szimbólumnak egy szóhoz való hozzárendelésekor az átmenetet a -ról a következőre a következő lemma írja le [17] :
Legyen néhány szó egy ábécé fölött, és legyen ennek az ábécé valamilyen szimbóluma. Ezután a megfelelő kontextusok és a szavak között a szavak utótagjainak nyelvei tekintetében a következő kapcsolat jön létre:
|
Ez azt jelenti, hogy ha az aktuális szóhoz egy karaktert adunk , a szó megfelelő kontextusa csak akkor változhat meg, ha az egy szóutótag . Ebből az következik, hogy az összes szó felosztása ekvivalenciaosztályokba a tekintetében az ekvivalenciaosztályokba való felosztás finomítása a tekintetében . Más szóval, ha , akkor . Ezen túlmenően, amikor a következő szimbólumot adjuk a szóhoz, a felosztás legfeljebb két állapotban történik. Mindenekelőtt az üres jobb kontextusnak megfelelő állapot (vagyis annak, amelyik alszóként nem szereplő szavak nyelvét veszi fel) felosztásra kerül. Ebből az állapotból egy új állapot kerül kinyerésre, amely tartalmazza a teljes szót , valamint minden olyan utótagját, amely előfordul, de nem fordult elő -ban . Ennek megfelelően e szavak megfelelő szövegkörnyezete, amely korábban üres volt, most csak az üres szóból fog állni [17] .
Figyelembe véve az utótag-automata állapotai és az utótagfa csúcsai közötti kapcsolatot, nyomon követhetjük a második állapotot is, amely a következő szimbólum hozzáadásakor kettéválhat. Mivel a szó - to átmenet egy fordított karakterlánc to-to átmenetének felel meg, egy karakter hozzárendelése egy karakterlánchoz egy új (leghosszabb) utótag hozzáadásának felel meg a karakterlánc utótagfájához . Ebben az esetben legfeljebb két csúcs jelenik meg: az egyik a teljes szónak felel meg , a másik pedig ott jelenhet meg, ahol a fa ága található. Így az egyik új állapot a teljes karakterlánc megfelelő kontextusának felel meg , a másik pedig (ha van) csak az adott állapot utótag-hivatkozásának felelhet meg. Ezek a megfigyelések a [17] tétellel általánosíthatók :
Hagyjuk és . Legyen a leghosszabb utótag is , amely -ben előfordul , és legyen a bal oldali kiterjesztése a -hoz képest, vagyis a szó leghosszabb részszava , hogy . Ekkor a következő igaz a szó bármely részszavaira :
|
Különösen, ha (például amikor egyáltalán nem fordul elő és -ben ), a második állapot felosztása nem következik be [17] .
Az utótag hivatkozások mellett a végállapotokat is meg kell határozni az új automatában. Az automata szerkezeti tulajdonságaiból következik, hogy bármely szó utótagjai úgy helyezkednek el, hogy ha , akkor azok az utótagok , amelyek hossza meghaladja a -t , benne vannak , azok az utótagok, amelyek hossza nagyobb, mint , de nem nagyobb -ban , és hamar. Más szóval, bármely utótagnak van egy csúcsa az utótag állapotútjában , amelyet a sorozat ad meg . Ennek megfelelően, ha azt az állapotot, amely jelenleg a teljes karakterláncot elfogadja -nak jelöljük , akkor a terminális (utótagokat elfogadó ) állapotok azok és csak azok lesznek, amelyek az utótag elérési útjában szerepelnek [21] .
A következő karakter hozzáadásakor végzett változtatások legfeljebb két új állapotot érintenek, így az automata átmeneteinek változásai is csak ezeket az állapotokat érintik. A szóhoz való hozzárendelés után egy új állapot jön létre , és esetleg egy állapot is . A from utótag hivatkozás ide vezet , és innen - hova . A -ból származó szavak csak utótagként fordulnak elő , ezért ne legyenek átmenetek, és a hozzá vezető átmeneteknek karakterenként kell vezetniük a legalább hosszúságú utótagokból . Az állapot el van választva a -tól , így az ebből az állapotból való átmenetek megduplázzák az állapotot . A hozzá vezető átmenetek pedig szimbólummal fognak elvezetni a -nál kisebb és nem kisebb utótagoknak megfelelő állapotokból , mivel korábban ezek az átmenetek az állapot elválasztott részéhez vezettek és annak feleltek meg. Azokat az állapotokat, amelyek elfogadják ezeket a szavakat, az állapotutótag elérési útjával azonosíthatjuk [21] .
Utótag -automata felépítése az abcbc szóhoz | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
| ||||||||
|
| ||||||||
|
|
A fenti elméleti eredmények a következő algoritmushoz vezetnek, amely egy szimbólumot vesz és egy szóutótag-automatát szóutótag - automatává rendez át [21] :
Az ezt az algoritmust megvalósító eljárás a következő pszeudokóddal írható le:
függvény add_letter(x) : define p = utolsó hozzárendelés utolsó = új_állapot() hozzárendelés len(utolsó) = len(p) + 1 , amíg δ(p, x) meg nem határozzuk: hozzárendelés δ(p, x) = utolsó, p = link(p) define q = δ(p, x) if q = utolsó : link(utolsó) = q 0 else if len(q) = len(p) + 1 : link (utolsó) = q hozzárendelése else : define cl = új_állapot() hozzárendelés len(cl) = len(p) + 1 hozzárendelés δ(cl) = δ(q), link(cl) = link(q) hozzárendelni link(utolsó) = link(q) = cl míg δ(p, x) = q : δ(p, x) hozzárendelése = cl, p = link(p)Itt látható az automata kezdeti állapota, és egy olyan függvény, amely új állapotot ad az automatához. Feltételezzük, hogy , , és globális változóként tárolódnak.
A használt struktúráktól függően a fent leírt algoritmus determinisztikus változata megvalósítható memóriaidőben vagy memóriaidőben , feltéve, hogy a memóriafoglalás a -ben történik . Ugyanakkor a futási idő ilyen becsléséhez el kell végezni az algoritmus belső ciklusainak amortizációs elemzését . Ha figyelembe vesszük, hogy a paraméter hogyan változik az első ciklus első iterációja után , akkor láthatjuk, hogy szigorúan csökken a ciklus minden iterációjával. Sőt, ha az előző lépés utolsó iterációjában ez az érték egyenlő volt -vel , akkor a következő lépés második iterációjában ez az érték egyenlő lesz . Az, hogy egyetlen pillanatban sem haladja meg, és a ciklusok között ez a mennyiség csak eggyel nő, megadja a szükséges állítást. Hasonló elemzéssel kimutatható az algoritmus második ciklusának teljes végrehajtási idejének linearitása [21] .
Az utótag-automata szorosan kapcsolódik más utótag-struktúrákhoz és részstringindexekhez . Valamelyik karakterlánc utótag-automatájával lehetséges ennek a karakterláncnak az utótagfáját lineáris időben megszerkeszteni az automata tömörítésével és rekurzív bejárásával [22] . Hasonló transzformációk mindkét irányban lehetségesek egy karakterlánc utótag automata és egy fordított sztring utótag fa között [20] . Ezen kívül számos algoritmus-módosítást fejlesztettek ki, amelyek lehetővé teszik automata felépítését egy előtag fa által megadott karakterláncok halmazához [9] , tömörítést alkalmaznak rá [6] , struktúráját csúszóablak módban tartják [23] , és újraépítsd is, amikor karaktereket adsz hozzá mind a végétől, mind az elejétől [24] .
Mint fentebb említettük, egy közönséges utótag automatából tömörítéssel (a nem végleges állapotok eltávolításával, amelyekből pontosan egy átmenet vezet), valamint az utótagfa minimalizálásával kaphatunk tömörített utótag-automatát, ha feltételezzük, hogy az ábécé az élek fára írt szavak alkotják. Ezenkívül egy tömörített automata állapotai explicit módon leírhatók, hasonlóan ahhoz, ahogyan azt egy tömörítetlen automatánál tették. A kétirányú szókiterjesztés a leghosszabb szó , így minden előfordulást egy szó előz meg, és közvetlenül egy szó követi . A bal és a jobb oldali kiterjesztések szempontjából ez azt jelenti, hogy a kétirányú kiterjesztés a jobb oldali kiterjesztés bal oldali, vagy ennek megfelelően a bal oldali kiterjesztés jobb oldali kiterjesztése: . A kétoldali kiterjesztések tekintetében egy tömörített utótag-automatát a következőképpen írhatunk le [18] :
Egy szó tömörített utótag-automatája megadható a párral , ahol:
|
A kétirányú kiterjesztések egy ekvivalencia relációt generálnak, amely leírja a tömörített automata azonos állapota által elfogadott szavakat. Ez a reláció a reláció tranzitív lezárása , ami azt a tényt hangsúlyozza, hogy a tömörített utótag-automaták állapotai megszerezhetők mind az utótagfa-csúcsok összeragasztásával, amelyek egyenértékűek (utótagfa-minimalizálás), mind pedig az utótag-automaták olyan állapotainak ragasztásával, amelyek ekvivalensek a (tömörítő utótagú automata) [25] szempontjából . Ha a és szavaknak azonos a jobb oldali kiterjesztése, a és szavaknak pedig a bal oldali kiterjesztései , akkor az és a szavak összesítésében ugyanaz a kétoldali kiterjesztése. Ebben az esetben kiderülhet, hogy a és szavak nem ugyanazokkal a bal vagy jobb oldali kiterjesztéssel rendelkeznek. , és esetén a bal és jobb oldali kiterjesztések: , de és . Egyirányú kontextusok és kiterjesztések esetén az azonos ekvivalenciaosztályból származó szavak egymásba ágyazott előtagokból vagy utótagokból álló folyamatos láncot alkottak, és egyértelműen meghatározhatóak voltak az osztály legrövidebb és leghosszabb szavainak hossza alapján. A kétirányú kiterjesztések esetében csak annyit lehet biztosan mondani, hogy az azonos osztályból származó szavak az osztály leghosszabb szavának alszavai , egyébként pedig az osztályok meglehetősen bonyolult szerkezetűek lehetnek. Az ilyen ekvivalencia osztályok száma nem haladja meg a -t, ami azt jelenti, hogy egy hosszúságú karakterlánc tömörített utótagú automatának legfeljebb állapota lehet. Az átmenetek száma egy ilyen automatában nem haladja meg a [18] -ot .
Legyen adott egy szókészlet . Hasonlóan az egyetlen szóra épített automatához , tekinthetünk általánosított utótag-automatának, amely elfogadja azoknak a szavaknak a nyelvét, amelyek legalább egy szó utótagja a -ból . Ebben az esetben az automata állapotainak és átmeneteinek számára ugyanazok a korlátozások teljesülnek, amelyeket a fentiekben jeleztünk, ha a [25] -t adjuk meg . Maga a szerkesztési algoritmus lényegében hasonló az egysoros automata felépítésére szolgáló algoritmushoz, de a szónak megfelelő állapotra mutató mutató helyett a szóra való átlépéskor az add_letter függvény egy mutatót visz arra az állapotra, amely elfogadja a szó , ami arra utal, hogy az átmenet az aktuális szókészletből a halmazba történik . Az algoritmusban már szereplő főbb műveletek mellett külön elemezni kell azt az esetet, amikor a karakterlánc már jelen van a gépben - ebben az esetben előfordulhat, hogy fel kell osztani az azt elfogadó állapotot, hasonlóan a hogyan történt, amikor egyetlen szóra utótag hivatkozást képeztünk az algoritmusban [26] [27] .
Ennek az ötletnek a továbbfejlesztése volt egy utótag-automata felépítése arra az esetre, amikor a halmaz nem explicit formában, hanem előtag faként van megadva a csúcsokon. Mohry és mások kimutatták, hogy egy ilyen automata legfeljebb állapotokat tartalmaz, és méretében lineárisan építhető fel időben. Ugyanakkor egy ilyen automatában az átmenetek száma elérheti - például ha egy szókészletet tekintünk az ábécé felett , akkor ebből a halmazból a szavak teljes hossza a csúcsok számának nagyságrendje lesz. a megfelelő előtag fában egyenlő lesz -vel, az utótag-automatában pedig az állapotok és átmenetek sorrendje lesz. Maga az algoritmus, amelyet Mohri javasolt, nagyrészt megismétli az automata sztringek halmazából történő felépítésének általános algoritmusát, de ahelyett, hogy minden alkalommal hozzáfűzné egy szó karaktereit a halmazból az elejétől a végéig, az algoritmus bejárja az előtagfát a bejárási sorrendet szélességben , és abban a sorrendben rendeli hozzá a következő karaktereket, amelyben a bejárás során találkozik velük, ami garantálja az algoritmus amortizált lineáris futási idejét [28] .
Egyes tömörítési algoritmusokban , például az LZ77 -ben és az RLE -ben, hasznos lehet egy utótag-automatát vagy hasonló szerkezetet nem a teljes olvasott szóhoz, hanem csak az utolsó karakterekhez tárolni. Elsősorban az adattömörítési feladatok sajátosságai miatt merül fel ilyen igény, ahol a tömörített karakterláncok általában meglehetősen nagyok, és nem kívánatos a memóriahasználat. 1985-ben Janet Bloomer kifejlesztett egy algoritmust, amely támogatja az utótag automatát egy csúszó méretű ablakon , és a legrosszabb esetre és az átlagra fut , feltételezve, hogy a tömörítendő szó karakterei egymástól függetlenül és egyenletesen vannak elosztva . Ugyanebben a munkában kimutatták , hogy a becslés nem javítható - ha figyelembe vesszük, hogy a becslés alak több szavának összefűzésével nyert szavakat egy utótag automatára nem lehetséges [29] .
Úgy tűnik, ugyanez igaz az utótagfára is, mivel az utótagfa csúcsai megfelelnek a kibontott karakterlánc utótag-automatájának állapotainak. Ha azonban az utótagfában nincs külön csúcs minden utótaghoz, akkor nem lesznek ilyen éles ugrások, és lehetséges egy amortizált algoritmus felépítése, amely támogatja az utótagfát egy csúszó ablakon. Edward Fiala és Daniel Green [30] 1989-ben javasolt egy megfelelő algoritmust egy utótagfához, amely McCraith algoritmusán alapul, és támogatja egy új karakter jobb oldali hozzáadását és egy karakter törlését a bal oldalon, és 1996-ban kifejtette Ukkonen algoritmusának feltételei , Jesper Larsson [31] [32] . Ebben a tekintetben az a kérdés, hogy lehetséges-e egy tömörített automata gyors csúszóablaka fenntartani, amely egyesíti mind a közönséges utótag-automaták, mind az utótagfa egyes tulajdonságait, sokáig nyitva maradt. Erre a kérdésre 2008-ban nemleges választ kapott Martin Senft és Tomasz Dvorak, akik kimutatták, hogy ha az ábécé két vagy több karakterből áll, akkor a legrosszabb esetben az ablak egy karakterrel történő eltolásához szükséges amortizált idő a megfelelő sorrendben van. a [33] .
Ugyanakkor, ha az ablak pontos szélessége nem fontos, és csak az a cél, hogy olyan ablakot tartsunk fenn, amelynek szélessége nem haladja meg a -t, nagyságrendileg ez megtehető az Inenaga és munkatársai által javasolt közelítő algoritmussal. 2004. Az algoritmus sajátossága, hogy a szó mentén mozgó „ablak” változó hosszúságú, amely bármikor sem kisebb , sem több, mint , miközben a teljes futási idő lineáris marad [34] .
A karakterlánc utótag automata olyan problémák megoldására használható, mint például [35] [36] :
Itt érdemes megfontolni, hogy valamilyen karakterláncot akkor kell bevinni, amikor az automata már fel van építve és használatra kész.
Az utótag-automaták olyan alkalmazásokban is utat találtak, mint az adattömörítés [37] , a rögzített töredékekből származó zeneazonosítás [38] [39] és a genomi szekvencia-illesztés [40] .
Húrok | |
---|---|
Karakterlánc hasonlósági mértékek | |
Substring keresés | |
palindromák | |
Sorozat-igazítás | |
Utótag szerkezetek | |
Egyéb |
Formális nyelvek és formális nyelvtanok | |
---|---|
Általános fogalmak | |
Típus 0 | |
1. típus |
|
2. típus | |
3. típus |
|
elemzése |