Utótag automata

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
Legrosszabb esetben
Épület
Memória fogyasztás
 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 .

Történelem

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] .

Jelölés

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] :

Automata szerkezet

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] .

Az automata állapotok

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:

  • Az ábécé változatlan marad
  • Az állapotok megfelelnek minden szó megfelelő kontextusának ,
  • A kezdeti állapot az üres szó megfelelő kontextusának felel meg ,
  • A végső állapotok megfelelnek a nyelvből származó szavak megfelelő kontextusának ,
  • Az átmenetek alakja , hol és .

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:

  • Ha , akkor ;
  • Ha , akkor .

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:

  1. A csúcsok megfelelnek az összes részkarakterlánc bal oldali kiterjesztésének ,
  2. Az élek olyan csúcsokat kötnek össze , hogy és .

Kapcsolat az utótagfával

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:

  • A csúcsok megfelelnek az összes részsztring megfelelő kiterjesztésének ,
  • Az élek olyan hármasoknak felelnek meg , hogy és .

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 .

Méret

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 

Épület

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] .

Változó államok

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:

  • if - utótag ;
  • másképp.

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 :

  • Ha és , akkor ;
  • Ha és , akkor ;
  • Ha és , akkor .

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] .

Ugrás és utótag hivatkozások módosítása

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
Az első szimbólum hozzáadásakor egyetlen új állapot jön létre az automatában. Hasonlóképpen egyetlen levél kerül hozzáadásra az utótagfához.
a→ab
Minden végső állapotból új átmenetek rajzolódnak ki, mivel az új szimbólummal korábban nem találkoztunk. Ugyanezen okból az utótaghivatkozások fájában az új csomópont felfüggesztésre kerül a gyökérből.
ab → abb
A 2. állapot felveszi az ab és b szavakat , de csak a b lesz utótag, így ez a szó a 4. állapothoz lesz hozzárendelve. A bővített szó utótagfájában ez a 2. csúcshoz vezető él felhasadásának felel meg.
abb → abbc
Az új szimbólumot még nem látták, az összes véglegesről áttérnek rá. Egy új levél kerül a gyökérre felfüggesztett utótag hivatkozások fájába.
abbc → abbcb
A 4. állapotban csak a b szó van, és ez egy utótag, így nem történik hasadás. Ennek megfelelően az utótaghivatkozások fájában egy új levél felfüggesztésre kerül a 4. csúcsról.
abbcb → abbcbc
Az 5. állapot elfogadja az abbc , bbc , bc és c szavakat , de csak az utolsó kettő utótagja az új szónak, ezért külön 8-as állapotba különülnek el. Ennek megfelelően az utótaghivatkozások fájában az 5. csúcshoz vezető él felhasad.


Automata felépítésének algoritmusa

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] :

  1. A teljes sornak megfelelő állapotszám támogatott ;
  2. Amikor egy szimbólumot adunk hozzá , a szám a változóban tárolódik , és a szónak megfelelő új állapot számát írjuk be ;
  3. Az utótagoknak megfelelő állapotokból a -be átmenetek rögzítésre kerülnek . Ehhez az utótag elérési útját a rendszer kihagyja mindaddig, amíg nem találkozik olyan állapottal, amelyből már van átmenet .
  4. A további műveletek a három eset egyikének felelnek meg:
    1. Ha a teljes utótag útvonalon nincs átmenet egyik állapotból sem , akkor korábban nem találkoztunk vele, és az utótag hivatkozása az utótagból ide vezet ;
    2. Ha az átmenetet megtaláltuk, és állapotból állapotba úgy vezet, hogy , akkor nem kell felosztani , elég egy utótag hivatkozást húzni -ból -be ;
    3. Ha , akkor az állapotból származó szavakat , amelyek hossza nem haladja meg , külön állapotba kell választani ;
  5. Ha az előző lépésben külön állapotot választottunk , akkor az átmeneteknek és az abból származó utótag hivatkozásnak meg kell duplikálnia azokat -ban , miközben az és állapotok közös utótag hivatkozásává válik ;
  6. Azok az ugrások, amelyek a szóhoz vezettek, de egyező szavakkal nem hosszabbak, mint , a következőre kerülnek átirányításra . Ehhez továbbra is követheti az utótag útvonalát , amíg nem talál egy állapotot, amelyből az átmenet nem vezet a -hoz .

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.

Számítási összetettség

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] .

Változatok és általánosítások

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] .

Tömörített utótag automata

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:

  • az automata állapotok halmaza;
  • - az automata átmeneteinek halmaza.

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 .

Utótag automata karakterláncok halmazához

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] .

Tolóablak

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] .

Alkalmazások

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] .

Jegyzetek

  1. ↑ 1 2 Weiner, 1973
  2. Pratt, 1973
  3. Szliszenko, 1983
  4. ↑ 1 2 Blumer et al., 1984 , p. 109-110
  5. Chen, Seiferas, 1985 , p. 97
  6. ↑ 12 Blumer et al., 1987 , p. 578
  7. Crochemore, Verin, 1997 , p. 192
  8. ↑ 1 2 Inenaga et al., 2005 , pp. 156-158
  9. ↑ 1 2 Inenaga et al., 2001 , p. egy
  10. Perrin, 1990 , p. tíz
  11. Sgarbas et al., 2003 , p. 2
  12. ↑ 1 2 Crochemore, Hancart, 1997 , pp. 3-6
  13. Serebryakov et al., 2006 , p. 50-54
  14. Rubcov, 2019 , p. 89-94
  15. Hopcroft, Ullman, 1979 , pp. 65-68
  16. ↑ 12 Blumer et al., 1984 , pp. 111-114
  17. ↑ 1 2 3 4 5 6 7 8 Crochemore, Hancart, 1997 , pp. 27-31
  18. ↑ 1 2 3 4 5 6 7 Inenaga et al., 2005 , pp. 159-162
  19. Rubinchik, Shur, 2018 , pp. 1-2
  20. ↑ 1 2 3 Fujishige et al., 2016 , pp. 1-3
  21. ↑ 1 2 3 4 5 Crochemore, Hancart, 1997 , pp. 31-36
  22. Parashchenko, 2007 , p. 19-22
  23. Blumer, 1987 , p. 451
  24. Inenaga, 2003 , p. egy
  25. ↑ 1 2 Blumer et al., 1987 , pp. 585-588
  26. Blumer et al., 1987 , pp. 588-589
  27. Blumer et al., 1987 , p. 593
  28. Mohri et al., 2009 , pp. 3558-3560
  29. Blumer, 1987 , pp. 461-465
  30. Fiala, Greene, 1989 , p. 490
  31. Larsson, 1996
  32. Brodnik, Jekovec, 2018 , p. egy
  33. Senft, Dvorak, 2008 , p. 109
  34. Inenaga et al., 2004
  35. Crochemore, Hancart, 1997 , pp. 39-41
  36. Crochemore, Hancart, 1997 , pp. 36-39
  37. Yamamoto et al., 2014 , p. 675
  38. Crochemore et al., 2003 , p. 211
  39. Mohri et al., 2009 , p. 3553
  40. Faro, 2016 , p. 145

Irodalom

Linkek