Sufix automat

Sufix automat
Engleză  sufix
automat  grafic de cuvinte aciclice direcționate

Sufix automat pentru abcbc
Tip de Index de subșiruri
Anul inventiei 1983
Autor Anselm Bloomer, Janet Bloomer, Andrzej Ehrenvecht , David Haussler , Ross McConnell
Complexitatea în simbolurile O
În cel mai rău caz
Clădire
Consumul de memorie
 Fișiere media la Wikimedia Commons

Suffix automaton ( în engleză  suffix automaton , directioned acyclic word graph ) este o structură de date care vă permite să stocați sub formă comprimată și să procesați informații asociate cu subșirurile unui șir dat. Reprezintă un automat finit determinist care acceptă toate sufixele unui cuvânt și numai ele și are cel mai mic număr posibil de stări dintre toate astfel de automate. Mai puțin formal, un automat sufix este un graf aciclic direcționat cu un vârf inițial distins unsimbolurilesunt etichetate cuarceși un set de vârfuri „finale”, concatenate , formează un sufix dat. Dintre toate graficele care satisfac această descriere, automatul sufix este cel care are cel mai mic număr posibil de vârfuri .

Automatul sufix a fost descris pentru prima dată de un grup de oameni de știință de la Universitatea din Denver și Colorado în 1983, ei au arătat, de asemenea, că dimensiunea automatului depinde liniar de lungime și au propus, de asemenea, un algoritm online pentru construirea acestuia cu un timp de rulare liniar . În lucrările ulterioare pe această temă, a fost descoperită o legătură strânsă între automatul sufix și arborele sufix , iar conceptul de automat sufix a primit diverse generalizări. Astfel, a fost introdus un automat sufix comprimat, obținut din cel original printr-o procedură similară cu cea aplicată unui sufix bor pentru a obține un arbore de sufix, precum și un automat sufix generalizat, care este construit pentru un set de cuvinte și acceptă cuvinte. care sunt sufixe ale cel puțin uneia dintre datele .

Cu ajutorul unui automat sufix, puteți rezolva în mod eficient probleme precum căutarea unui subșir într-un șir , determinarea celui mai mare subșir comun de două sau mai multe șiruri și altele .

Istorie

Conceptul de automat sufix a fost introdus de un grup de oameni de știință de la Universitatea Denver și Colorado Anselm Blumer, Andrzej Ehrenvecht , David Haussler , Ross McConnell și Janet Bloomer în 1983, deși au fost întâlnite structuri legate de acesta. mai devreme în lucrarea lui Peter Weiner [1] , Vaughn Pratt [2] și Anatoly Olesevich Slisenko [3] s-au dedicat algoritmilor pentru construirea arborilor sufixi . În aceeași lucrare, Bloomer și alții au arătat că un automat construit dintr-un cuvânt de lungime mai mare decât acesta nu conține mai multe stări și nu mai multe tranziții și au prezentat, de asemenea, un algoritm liniar pentru construirea unui automat [4] .

În 1983, Mu Tian Chen și Joel Seiferas au dezvoltat în mod independent un algoritm pentru construirea unui automat sufix care arată că algoritmul lui Weiner [1] propus în 1973 pentru construirea unui arbore sufix de cuvânt construiește și un automat sufix pentru cuvântul inversat ca structură auxiliară [5] . În 1987, Bloomer și alții, prin analogie cu un arbore de sufixe, au descris un automat sufix comprimat [6] obținut dintr-un automat sufix prin ștergerea stărilor non-finale cu un semigrad de rezultat egal cu unu, iar în 1997 Maxime Crochemore și Renaud Verin a dezvoltat un algoritm liniar pentru construcția lui directă [7] . În 2001, Shunsuke Inenaga și alții au dezvoltat un algoritm liniar online pentru construirea unui automat sufix comprimat [8] , precum și un algoritm liniar pentru construirea unui automat sufix comprimat pentru un set de cuvinte date de un arbore de prefix [9] .

În lucrarea lor originală, Bloomer și colegii au definit structura pe care au descris-o ca un automat minim care recunoaște toate subșirurile (nu sufixele) unui cuvânt dat. Ei au numit această structură un grafic de cuvinte aciclice direcționate [ 4 ] .  Ulterior, acest nume a fost folosit și ca sinonim pentru un automat finit aciclic determinist - un automat minim care recunoaște un set finit arbitrar de cuvinte (nu constituie neapărat un set de sufixe sau subșiruri ale unui anumit șir) [10] [ 11] .

Notație

Când se descriu automate sufixe și fapte și teoreme înrudite, sunt adesea folosite notații din teoria limbajelor formale în general și teoria automatelor în special [12] :

Structura automată

Formal, un automat finit determinist este definit de un set de cinci elemente în care:

Cel mai adesea, în practică, automatele finite sunt reprezentate ca un grafic dirijat ( diagramă ) astfel încât [13] :

Într-un astfel de grafic, vârfurile și arcurile sunt identificate cu stări și, respectiv, tranziții ale automatului. Automatul acceptă un cuvânt dacă și numai dacă există o cale de la starea inițială la o stare finală , astfel încât dacă concatenăm simbolurile întâlnite pe această cale, obținem cuvântul . Setul de cuvinte pe care le acceptă un automat formează limbajul acestui automat [12] .

Stări automate

Contextul corect al unui cuvânt relativ la limbă se numește mulțime . Adică, acesta este un set de cuvinte , atribuindu-le cuvântului din dreapta, rezultă un cuvânt din limbă . Contextele corecte induc o relație naturală de echivalență pe mulțimea tuturor cuvintelor. Dacă un limbaj poate fi definit de un automat finit determinist, atunci pentru el există un automat unic, până la izomorfism , care are în același timp cel mai mic număr posibil de stări. Un astfel de automat este numit minim pentru un limbaj dat , teorema Myhill-Nerode ne permite să-l specificăm în mod explicit [14] [15] :

Un automat minim care recunoaște o limbă peste un alfabet poate fi dat după cum urmează:

  • Alfabetul rămâne neschimbat
  • Stările corespund contextelor corecte ale tuturor cuvintelor ,
  • Starea inițială corespunde contextului corect al cuvântului gol ,
  • Stările finale corespund contextelor corecte ale cuvintelor din limbă ,
  • Tranzițiile au forma , unde și .

Într-o astfel de notație, un automat sufix  este un DFA minim care acceptă cuvântul sufix language . Contextul corect al unui cuvânt în raport cu o limbă dată constă din cuvinte astfel încât  - sufix . Acest lucru ne permite să formulăm următoarea lemă, care definește o corespondență unu-la-unu între contextul corect al unui cuvânt și setul de poziții ale aparițiilor sale în subcuvânt [16] [17] :

Fie setul de poziții corecte ale aparițiilor în .

Între elementele seturilor și există următoarea corespondență unu-la-unu:

  • Dacă , atunci ;
  • Dacă , atunci .

De exemplu, pentru un cuvânt și subcuvântul său și . În mod informal, constă din cuvinte care urmează aparițiile până la sfârșitul cuvântului și  - de la pozițiile acestor apariții. În acest exemplu, elementul se potrivește cu cuvântul . În același timp, elementul corespunde cuvântului .

Din aceasta rezultă o serie de proprietăți structurale ale stărilor automatului sufix și cuvintele pe care le acceptă. Fie , atunci [17] :

Astfel, orice stare a automatului sufix acceptă un lanț continuu de sufixe imbricate ale celui mai mare șir din această stare [17] .

Extensia din stânga a unui șir este cel mai lung șir care are același context drept ca și . Lungimea celui mai lung șir acceptat de stat este notată ca . Este adevărat pentru el că [18] :

Extensia din stânga a unui șir poate fi reprezentată ca , unde este cel mai lung cuvânt, astfel încât orice apariție a unui cuvânt în este precedată de cuvânt .

O legătură de sufix de la o stare este un pointer către starea care conține cel mai mare sufix care nu este  acceptat de stat .

În această notație, putem spune că statul ia exact toate sufixele care sunt mai lungi decât și nu mai lungi decât . În plus, următoarele sunt adevărate [18] :

Legăturile sufixelor formează un arbore , care poate fi specificat în mod explicit după cum urmează:

  1. Vârfurile corespund expansiunilor din stânga tuturor subșirurilor ,
  2. Muchiile conectează vârfuri astfel încât și .

Legătura cu arborele sufixului

Un arbore de prefix (sau un alezaj ) este un arbore orientat spre rădăcină, ale cărui arcuri sunt marcate cu simboluri astfel încât sănu iasă mai mult de un arc din orice vârf al acestui arbore , etichetat cu un simbol dat. Unele vârfuri din arborele de prefix sunt etichetate. Se spune că un arbore de prefix definește un set de cuvinte definite de căi de la rădăcina arborelui până la vârfurile etichetate. Astfel, arborii de prefix sunt un tip special de automată finită, dacă considerăm rădăcina ca stare inițială, iar vârfurile etichetate ca stări finale [19] . Sufixul bor al unui cuvânteste un arbore de prefix care definește limba sufixelor acestui cuvânt. Un arbore de sufix este un arbore obținut dintr-un orificiu de sufix printr-o procedură de compresie, în care muchiile succesive sunt lipite între ele dacă între ele există un vârf nefinal, al cărui grad este 2 [18] .

Prin definiție, un automat sufix poate fi obținut prin minimizarea unui alezaj sufix. În plus, un automat sufix comprimat poate fi obținut atât prin minimizarea unui arbore sufix (presupunând că simbolurile alfabetului sunt cuvinte de pe marginile arborelui), cât și prin comprimarea unui automat convențional [8] . Totuși, pe lângă legătura evidentă dintre automatul sufix și arborele sufix al aceluiași șir, se poate stabili și o oarecare corespondență între automatul sufix al unui șir și arborele sufix al unui șir inversat [20] .

Similar contextelor din dreapta, se pot introduce contexte din stânga și extensii din dreapta corespunzătoare celor mai lungi șiruri având un context din stânga dat, precum și o relație de echivalență . Dacă luăm în considerare extensiile corecte cu privire la limbajul prefixului șirului , atunci putem obține că [18] :

Arborele sufixului unui șir poate fi specificat în mod explicit după cum urmează:

  • Vârfurile corespund extensiilor drepte ale tuturor subșirurilor ,
  • Muchiile corespund unor triple astfel încât și .

Aici, triplul înseamnă că șirul de la la este scris pe margine .

Din care rezultă că arborele legăturilor sufixelor pentru un automat cu șir și arborele sufixului unui șir sunt izomorfe [20] :

Structuri de sufixe ale cuvintelor abbcbc și cbcbba 

Similar extensiilor din stânga, o lemă structurală [18] poate fi formulată și pentru extensiile din dreapta :

Extensia dreaptă a unui șir poate fi reprezentată ca , unde este cel mai lung cuvânt, astfel încât orice apariție a lui în este imediat urmată de cuvânt .

Dimensiune

Într-un automat sufix, șirurile de lungime nu sunt mai mult decât stări și nu mai mult decât tranziții, iar aceste estimări sunt realizate pe șiruri și, respectiv , [16] . De asemenea, este posibil să se formuleze o afirmație mai puternică despre relația dintre numărul de stări și tranziții dintr-un automat: , unde și  sunt numărul de tranziții și, respectiv, de stări [17] .

Sufix maxim automate 

Clădire

Automatul sufix al unui șir se construiește prin construirea succesivă a cuvântului pentru care este construit. Inițial, există un automat banal construit pentru un cuvânt gol, iar apoi la fiecare pas se adaugă un simbol cuvântului curent, ceea ce presupune o rearanjare a stărilor și tranzițiilor automatului [21] .

Schimbarea statelor

După atribuirea unui nou caracter unui cuvânt, unele clase de echivalență se vor schimba. Fie  contextul corect al cuvântului în raport cu limba sufixului cuvântului . Apoi trecerea de la la la atribuirea unui simbol unui cuvânt este descrisă de următoarea lemă [17] :

Să fie câteva cuvinte peste un alfabet și să fie un simbol al acestui alfabet. Apoi, între contextele potrivite și cuvintele cu privire la limbile sufixelor cuvintelor și, respectiv, are loc următoarea relație:

  • dacă - sufix ;
  • in caz contrar.

Adică, atunci când un caracter este adăugat cuvântului curent, contextul corect al cuvântului se poate schimba numai dacă este un sufix de cuvânt . De aici rezultă că împărțirea tuturor cuvintelor în clase de echivalență cu privire la este o rafinare a împărțirii în clase de echivalență cu privire la . Cu alte cuvinte, dacă , atunci . În plus, atunci când adăugați următorul simbol la cuvânt, împărțirea va avea loc în cel mult două stări. În primul rând, starea care corespunde contextului drept gol (adică cea care ia limba cuvintelor care nu sunt incluse ca subcuvânt) va fi împărțită. Din această stare, va fi extrasă o nouă stare care conține întregul cuvânt , precum și toate sufixele acestuia care apar în dar nu au apărut în . În consecință, contextul corect al acestor cuvinte, care anterior era gol, va consta acum doar din cuvântul gol [17] .

Ținând cont de legătura dintre stările automatului sufix și vârfurile arborelui sufix, putem urmări și a doua stare, care se poate diviza atunci când este adăugat următorul simbol. Deoarece o tranziție de la -la cuvântul corespunde unei tranziții la - la un șir inversat, alocarea unui caracter unui șir corespunde cu adăugarea unui nou (cel mai lung) sufix la arborele de sufixe al șirului . În acest caz, nu apar mai mult de două vârfuri: unul dintre ele va corespunde întregului cuvânt , iar celălalt poate apărea în locul în care apare ramura din copac. Astfel, o stare nouă corespunde contextului corect al întregului șir , iar cealaltă (dacă există) poate corespunde doar referinței sufixului acelei stări. Aceste observații pot fi generalizate prin teorema [17] :

Lasă și . Fie, de asemenea , cel mai lung sufix care apare în , și fie extensia sa din stânga față de , adică cel mai lung subcuvânt al cuvântului astfel încât . Atunci următoarele sunt valabile pentru orice subcuvinte ale cuvântului :

  • Dacă și , atunci ;
  • Dacă și , atunci ;
  • Dacă și , atunci .

În special, dacă (de exemplu, când nu apare deloc în și ), divizarea celei de-a doua stări nu are loc [17] .

Pe lângă legăturile sufixe, în noul automat trebuie să se definească și stările finale. Din proprietățile structurale ale automatului rezultă că sufixele oricărui cuvânt sunt situate în așa fel încât dacă , atunci sufixele a căror lungime depășește , se află în , sufixele a căror lungime este mai mare decât , dar nu mai mare decât , se află în , și curând. Cu alte cuvinte, pentru orice sufix există un vârf în calea stării sufixului , care este dat de secvența . În consecință, dacă desemnăm starea care acceptă în prezent întregul șir ca fiind , atunci stările terminale (acceptând sufixe ) vor fi acele și numai acele stări care sunt incluse în calea sufixului [21] .

Schimbarea sărituri și legături sufixe

Orice modificare la adăugarea următorului caracter nu afectează mai mult de două stări noi, așa că modificările în tranzițiile automatului vor afecta, de asemenea, numai aceste stări. După atribuirea cuvântului , se formează o nouă stare și, eventual, o stare . Legătura sufixului de la va duce la , și de la  - la . Cuvintele de la apar doar ca sufixe, deci nu ar trebui să existe tranziții de la, iar tranzițiile care conduc la acesta trebuie să conducă după caractere de la sufixe cu o lungime de cel puțin . Statul este împărțit din , așa că tranzițiile din această stare le vor duplica pe cele din . Iar tranzițiile care conduc la acesta vor conduce prin simbol din stările corespunzătoare sufixelor de lungime mai mică decât și nu mai mică decât , deoarece mai devreme aceste tranziții au condus și au corespuns la partea separată a statului. Stările care acceptă aceste cuvinte pot fi identificate prin calea sufixului de stat [21] .

Construirea unui automat sufix pentru cuvântul abcbc 
∅ → a
Când primul simbol este adăugat, o singură stare nouă este creată în automat. În mod similar, o singură frunză este adăugată arborelui sufix.
a→ab
Sunt trase noi tranziții din toate stările finale, deoarece noul simbol nu a mai fost întâlnit înainte. Din același motiv, într-un arbore de legături sufixe, noul nod este suspendat de la rădăcină.
ab → abb
Starea 2 ia cuvintele ab și b , dar numai b va deveni un sufix, astfel încât acel cuvânt este alocat stării 4. În arborele sufix al cuvântului extins, aceasta corespunde împărțirii muchiei care duce la vârful 2.
abb → abbc
Noul simbol nu a mai fost văzut până acum, se efectuează tranziții către el din toate cele finale. O nouă frunză este adăugată arborelui de legături sufixe suspendate de rădăcină.
abbc → abbcb
În starea 4, există doar cuvântul b și este un sufix, deci nu are loc nicio divizare. În consecință, în arborele legăturilor sufixelor, o nouă frunză este suspendată de vârful 4.
abbcb → abbcbc
Starea 5 acceptă cuvintele abbc , bbc , bc și c , dar numai ultimele două sunt sufixe ale noului cuvânt, deci sunt separate într-o stare separată 8. În consecință, în arborele legăturilor sufixe, muchia care duce la vârful 5 este împărțită.


Algoritm pentru construirea unui automat

Rezultatele teoretice de mai sus conduc la următorul algoritm, care ia un simbol și rearanjează un automat sufix de cuvânt într-un automat sufix de cuvânt [21] :

  1. Este acceptat un număr de stare corespunzător întregii linii ;
  2. Când se adaugă un simbol , numărul este stocat în variabilă , iar numărul noii stări corespunzător cuvântului este scris în ;
  3. Din stările corespunzătoare sufixelor se aplică treceri la . Pentru a face acest lucru, calea sufixului este ocolită până când este întâlnită o stare din care există deja o tranziție de-a lungul ;
  4. Acțiunile ulterioare corespund unuia dintre cele trei cazuri:
    1. Dacă pe întreaga cale de sufix nu există nicio tranziție de la nicio stare la , atunci nu a fost întâlnită anterior în și legătura sufixului de la duce la ;
    2. Dacă tranziția prin a fost găsită și duce de la o stare la alta astfel încât , atunci nu este nevoie să se despartă și este suficient să se tragă o legătură sufixă de la la ;
    3. Dacă , atunci cuvintele din statul a căror lungime nu depăşeşte trebuie separate într - o stare separată ;
  5. Dacă la pasul anterior a fost selectată o stare separată , atunci tranzițiile și legătura sufixului de la aceasta ar trebui să le dubleze în , în timp ce va deveni o legătură sufix comună a stărilor și ;
  6. Salturile care au condus la cuvintele potrivite cu lungimea nu mai mare de , sunt redirecționate către . Pentru a face acest lucru, puteți continua să urmați calea sufixului până când găsiți o stare, tranziția de la care nu duce la .

Procedura care implementează acest algoritm poate fi descrisă prin următorul pseudocod:

funcția add_letter(x) : define p = last assign last = new_state() assign len(last) = len(p) + 1 până când δ(p, x) este definit: atribui δ(p, x) = last, p = link(p) define q = δ(p, x) if q = last : atribuie link(ultim) = q 0 else if len(q) = len(p) + 1 : atribui link(last) = q else : define cl = new_state() atribuiți len(cl) = len(p) + 1 atribuiți δ(cl) = δ(q), link(cl) = link(q) atribuiți link(last) = link(q) = cl while δ(p, x) = q : atribuiți δ(p, x) = cl, p = link(p)

Aici  , este starea inițială a automatului și  este o funcție care adaugă o nouă stare automatului. Se presupune că , , și sunt stocate ca variabile globale.

Complexitate computațională

În funcție de structurile utilizate, o versiune deterministă a algoritmului descris mai sus poate fi implementată în timp de memorie sau în timp de memorie , presupunând că alocarea memoriei are loc în . În același timp, pentru a obține o astfel de estimare a timpului de rulare, este necesar să se efectueze o analiză de amortizare a ciclurilor interne ale algoritmului. Dacă luăm în considerare modul în care parametrul se modifică după prima iterație a primei bucle, putem vedea că scade strict cu fiecare iterație a buclei. Mai mult, dacă la ultima iterație a pasului precedent această valoare a fost egală cu , atunci la a doua iterație la pasul următor această valoare va fi egală cu . Că nu depășește în niciun moment de timp și că între cicluri această cantitate crește doar cu unul, dă afirmația necesară. O analiză similară poate arăta liniaritatea timpului total de execuție al celui de-al doilea ciclu al algoritmului [21] .

Variații și generalizări

Automatul sufixului este strâns legat de alte structuri de sufixe și indici de subșiruri . Având un automat sufix al unui șir, este posibil să se construiască un arbore sufix al acestui șir în timp liniar prin compresie și parcurgere recursivă a acestui automat [22] . Transformări similare în ambele direcții sunt posibile între un automat cu sufix de șir și un arbore de sufix de șir inversat [20] . În plus, au fost dezvoltate o serie de modificări ale algoritmului care permit construirea unui automat pentru un set de șiruri date de un arbore de prefix [9] , să-i aplice compresie [6] , să-și mențină structura într-un mod de fereastră glisantă [23] , și, de asemenea, reconstruiți atunci când adăugați caractere atât de la sfârșit, cât și de la începutul șirului [24] .

Automat sufix comprimat

După cum am menționat mai sus, un automat sufix comprimat poate fi obținut dintr-un automat sufix obișnuit prin compresie (eliminând stările care nu sunt finale și din care duce exact o tranziție), precum și prin minimizarea arborelui sufix, dacă presupunem că alfabetul este format din cuvinte scrise pe marginile arborelui. În plus, stările unui automat comprimat pot fi descrise în mod explicit, similar modului în care a fost făcut pentru un automat necomprimat. O extensie de cuvânt cu două sensuri este cel mai lung cuvânt , astfel încât orice apariție în este precedată de un cuvânt și imediat urmată de un cuvânt . În ceea ce privește extensiile din stânga și din dreapta, aceasta înseamnă că extensia bidirecțională este extensia din stânga a extensiei din dreapta sau, echivalent, extensia din dreapta a extensiei din stânga: . În ceea ce privește extensiile bilaterale, un automat cu sufix comprimat poate fi descris după cum urmează [18] :

Automatul sufixului comprimat al unui cuvânt poate fi dat de perechea , unde:

  • este ansamblul stărilor automatelor;
  • - un set de tranziții ale automatului.

Extensiile în două sensuri generează o relație de echivalență care descrie cuvintele acceptate de aceeași stare a automatului comprimat. Această relație este o închidere tranzitivă a relației , care subliniază faptul că stările unui automat sufix comprimat pot fi obținute atât prin lipirea vârfurilor arborelui sufixelor care sunt echivalente din punct de vedere al (minimizarea arborelui sufixului), cât și prin lipirea stărilor unui automat sufix care sunt echivalente din punct de vedere al (comprimare sufix automat) [25 ] . Dacă cuvintele și au aceleași extensii la dreapta, iar cuvintele și  au extensiile din stânga, atunci în agregat cuvintele și au aceeași extensie bilaterală. În acest caz, se poate dovedi că cuvintele și nu au aceleași extensii la stânga sau la dreapta. În cazul lui , și extensiile din stânga și din dreapta sunt: ​​, dar și . În cazul contextelor și extensiilor unidirecționale, cuvintele din aceeași clasă de echivalență formau un lanț continuu de prefixe sau sufixe imbricate și puteau fi determinate în mod unic de lungimile celor mai scurte și mai lungi cuvinte din clasă. În cazul extensiilor în două sensuri, se poate spune doar cu siguranță că cuvintele din aceeași clasă sunt subcuvinte ale celui mai lung cuvânt din această clasă, iar în caz contrar clasele pot avea o structură destul de complexă. Numărul total de astfel de clase de echivalență nu depășește , ceea ce implică faptul că un automat sufix comprimat al unui șir de lungime va avea cel mult stări. Numărul de tranziții într-un astfel de automat nu depășește [18] .

Sufix automat pentru un set de șiruri

Să fie dat un set de cuvinte . Similar unui automat construit pe un singur cuvânt , putem considera un automat sufix generalizat care acceptă limbajul cuvintelor care sunt sufixul a cel puțin unui cuvânt din . În acest caz, pentru numărul de stări și tranziții ale acestui automat, toate aceleași restricții care au fost indicate mai sus vor fi satisfăcute dacă punem [25] . Algoritmul de construcție în sine este în esență similar cu algoritmul pentru construirea unui automat pentru o linie, dar în loc de un pointer către starea corespunzătoare cuvântului , atunci când trece la cuvântul , funcția add_letter va lua un pointer către starea care acceptă cuvânt , implicând că trecerea are loc de la setul curent de cuvinte la setul . În plus față de principalele acțiuni care sunt deja incluse în algoritm, va fi necesar să analizați separat cazul în care șirul este deja prezent în mașină - în acest caz, este posibil să trebuiască să împărțiți starea care îl acceptă, similar cu cum s-a întâmplat când se formează o legătură sufixă în algoritm pentru un singur cuvânt [26] [27] .

O dezvoltare ulterioară a acestei idei a fost construirea unui automat sufix pentru cazul în care mulțimea este specificată nu într-o formă explicită, ci ca un arbore de prefix pe vârfuri. Mohry și alții au arătat că un astfel de automat conține cel mult stări și poate fi construit în timp liniar în dimensiunea sa. În același timp, numărul de tranziții într-un astfel de automat poate ajunge  - de exemplu, dacă luăm în considerare un set de cuvinte peste alfabet , atunci lungimea totală a cuvintelor din acest set va fi de ordinul , numărul de vârfuri în arborele de prefix corespunzător va fi egal cu , iar în automatul sufix va exista o ordine a stărilor și tranzițiilor. Algoritmul însuși, propus de Mohri, repetă în mare măsură algoritmul general pentru construirea unui automat dintr-un set de șiruri de caractere, dar în loc să adauge de fiecare dată caracterele unui cuvânt din mulțime de la început până la sfârșit, algoritmul străbate arborele de prefix în ordinea parcurgerii în lățime și atribuie următoarele caractere în acea ordine, în care le întâlnește în timpul parcurgerii, ceea ce garantează un timp de rulare liniar amortizat al algoritmului [28] .

Fereastra glisantă

În unii algoritmi de compresie, cum ar fi LZ77 și RLE , poate fi util să stocați un automat sufix sau o structură similară nu pentru întregul cuvânt citit, ci doar pentru ultimele caractere. În primul rând, o astfel de nevoie apare din cauza specificului sarcinilor de comprimare a datelor, unde șirurile comprimate sunt de obicei destul de mari și utilizarea memoriei este nedorită. În 1985, Janet Bloomer a dezvoltat un algoritm care acceptă un automat sufix pe o fereastră de dimensiuni glisante și rulează pentru cel mai rău caz și medie, presupunând că caracterele din cuvântul care urmează să fie comprimat sunt distribuite independent și uniform . În aceeași lucrare s -a arătat că estimarea este de neîmbunătățit - dacă luăm în considerare cuvintele obținute prin formaconcatenarea mai multor cuvinte de pentru un sufix automat este imposibil [29] .

S-ar părea că același lucru ar trebui să fie valabil și pentru arborele sufix , deoarece vârfurile arborelui sufix corespund stărilor automatului sufix al șirului desfășurat. Cu toate acestea, dacă un vârf separat pentru fiecare sufix nu este alocat în arborele de sufixe, atunci nu vor exista astfel de salturi ascuțite și este posibilă construcția unui algoritm amortizat care să susțină arborele sufixului pe o fereastră glisantă. Un algoritm corespunzător pentru un arbore sufix, bazat pe algoritmul lui McCraith și care sprijină adăugarea unui nou caracter în dreapta și ștergerea unui caracter în stânga, a fost propus în 1989 de Edward Fiala și Daniel Green [30] , iar în 1996 a fost expus în termenii algoritmului lui Ukkonen de Jesper Larsson [31] [32] . În această privință, întrebarea dacă este posibil să se mențină o fereastră de alunecare rapidă pentru un automat comprimat, care combină unele proprietăți atât ale unui automat sufix obișnuit, cât și ale unui arbore de sufix, a rămas deschisă multă vreme. Un răspuns negativ la această întrebare a fost obținut în 2008 de Martin Senft și Tomasz Dvorak, care au arătat că, dacă alfabetul este format din două sau mai multe caractere, atunci timpul amortizat necesar pentru deplasarea ferestrei cu un caracter în cel mai rău caz este de ordinul din [33] .

În același timp, dacă lățimea exactă a ferestrei nu este importantă și scopul este doar menținerea unei ferestre a cărei lățime nu depășește , în ordinea mărimii, acest lucru se poate face cu algoritmul aproximativ propus de Inenaga și colab. 2004. O caracteristică a algoritmului este că „fereastra” care se mișcă de-a lungul cuvântului are o lungime variabilă, care în orice moment nu este nici mai mică, nici mai mare decât , în timp ce timpul total de rulare rămâne liniar [34] .

Aplicații

Automatul sufix de șir poate fi folosit pentru a rezolva probleme precum [35] [36] :

Aici merită să luați în considerare faptul că se introduce un șir atunci când automatul a fost deja construit și este gata de utilizare.

Automatele sufixelor și-au găsit drumul în aplicații precum compresia datelor [37] , identificarea muzicii din fragmente înregistrate [38] [39] și potrivirea secvenței genomice [40] .

Note

  1. ↑ 1 2 Weiner, 1973
  2. Pratt, 1973
  3. Slisenko, 1983
  4. ↑ 1 2 Blumer și colab., 1984 , p. 109-110
  5. Chen, Seiferas, 1985 , p. 97
  6. ↑ 12 Blumer și colab., 1987 , p. 578
  7. Crochemore, Verin, 1997 , p. 192
  8. ↑ 1 2 Inenaga et al., 2005 , pp. 156-158
  9. ↑ 1 2 Inenaga și colab., 2001 , p. unu
  10. Perrin, 1990 , p. zece
  11. Sgarbas și colab., 2003 , p. 2
  12. ↑ 1 2 Crochemore, Hancart, 1997 , pp. 3-6
  13. Serebryakov și colab., 2006 , p. 50-54
  14. Rubtsov, 2019 , p. 89-94
  15. Hopcroft, Ullman, 1979 , pp. 65-68
  16. ↑ 12 Blumer și colab., 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. Parașcenko, 2007 , p. 19-22
  23. Blumer, 1987 , p. 451
  24. Inenaga, 2003 , p. unu
  25. ↑ 1 2 Blumer et al., 1987 , pp. 585-588
  26. Blumer et al., 1987 , pp. 588-589
  27. Blumer și colab., 1987 , p. 593
  28. Mohri și colab., 2009 , pp. 3558-3560
  29. Blumer, 1987 , pp. 461-465
  30. Fiala, Greene, 1989 , p. 490
  31. Larsson, 1996
  32. Brodnik, Jekovec, 2018 , p. unu
  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 și colab., 2003 , p. 211
  39. Mohri și colab., 2009 , p. 3553
  40. Faro, 2016 , p. 145

Literatură

Link -uri