Algoritmul lui Thompson
În informatică, algoritmul lui Thompson este un algoritm de transformare a unei expresii regulate într-un automat finit nedeterminist(d) (AFN) echivalent. Acest AFN poate fi folosit pentru a valida șiruri de caractere(d) cu expresia regulată inițială.
Expresiile regulate și automatele finite nedeterministe sunt două reprezentări de limbaje formale. De exemplu, utilitarele de procesare de text(d) utilizează expresiile regulate pentru a descrie căutări după șabloane avansate, dar AFN-urile sunt mai potrivite pentru execuție pe un calculator. Prin urmare, acest algoritm este de interes practic, deoarece poate compila expresii regulate într-un AFN. Din punct de vedere teoretic, acest algoritm face parte din demonstrația faptului că ambele acceptă exact aceleași limbaje, limbajele regulate.
Un AFN poate fi făcut determinist prin construcția prin părți(d) și apoi poate fi minimizat(d) pentru a obține un automat optim corespunzător cu o expresie regulată dată. Cu toate acestea, un AFN poate fi și interpretat direct(d).
Algoritmul
[modificare | modificare sursă]Algoritmul se aplică recursiv prin divizarea unei expresii în subexpresiile sale constituente, din care se poate construi AFN-ul folosind un set de reguli.[1] Mai precis, de la o expresie regulată E, automatul obținut A cu ajutorul funcției de tranziție δ respectă următoarele proprietăți:
- A are exact o stare inițială q0, care nu este accesibilă din nicio altă stare. Adică, pentru orice stare q și orice simbol o, nu conține q0.
- A are exact o stare finală qf, din care nu se poate ajunge în nicio altă stare. Adică, pentru orice simbol a, .
- Fie c numărul de concatenări ale expresiei regulate E și s numărul de simboluri cu excepția parantezelor — adică |, *, a și ε. Atunci, numărul de stări ale lui A este 2s − c (liniar în dimensiunea lui E).
- Numărul de tranziții care ies din orice stare este de cel mult două.
- Deoarece un AFN cu m stări și cel mult e tranziții de la fiecare stare poate valida un șir de lungime n, într-un timp O(emn), un AFN Thompson poate efectua aplicarea șablonului în timp liniar, presupunând un alfabet de mărime fixă.[2]
Reguli
[modificare | modificare sursă]Următoarele reguli sunt descrise potrivit Aho et al. (1986),[3] p. 122. N(s) și N(t) sunt AFN-ul asociat subexpresiilor s și, respectiv, t.
Expresia vidă ε este convertită la
Un simbol a din alfabetul de intrare este convertit la
Expresia reuniune (alternanță) s|t este convertită la
Din starea q se trece prin ε fie la starea inițială a lui N(s), fie la cea a lui N(t). Stările lor finale devin stări intermediare în întreg AFN-ul și se reunesc prin intermediul a două ε-tranziții în starea finală al AFN-ului.
Expresia concatenare st este convertită la
Starea inițială a lui N(s) este starea inițială a întregului AFN. Starea finală a lui N(s) devine starea inițială a lui N(t). Starea finală a lui N(t) este starea finală a întregului AFN.
Expresia închidere Kleene s* este convertită la
O ε-tranziție conectează starea inițială și starea finală a AFN-ului cu sub-AFN-ul N(s) dintre ele. O altă ε-tranziție de la starea finală interioară la starea inițială interioară a lui N(s) permite repetarea expresiei s în funcție de operatorul Kleene star.
Expresia paranteză (s) este convertită la N(s).
Exemplu
[modificare | modificare sursă]Aici se prezintă două exemplu, unul mic și informal doar cu rezultatul, și unul mai mare cu o aplicare pas cu pas a algoritmului.
Exemplul mic
[modificare | modificare sursă]Imaginea de mai jos arata rezultatul rulării algoritmului Thompson pe expresia (ε|a*b). Ovalul roz oval corespunde lui a, cel turcoaz corespunde lui a*, cel verde corespunde lui b, cel portocaliu corespunde lui a*b, și cel albastru corespunde lui ε.
Aplicarea algoritmului
[modificare | modificare sursă](0|(1(01*(00)*0)*1)*)*
Ca un alt exemplu, imaginea arată rezultatul algoritmului Thompson aplicat pe expresia regulată (0|(1(01*(00)*0)*1)*)*
care reprezintă un set de numere binare care sunt multipli de 3: { ε, "0", "00", "11", "000", "011", "110", "0000", "0011", "0110", "1001", "1100", "1111", "00000", ... }.
Partea din dreapta sus arată structura logică (arborele de sintaxă) de exprimare, unde "." reprezintă concatenarea (presupusă a avea aritate variabilă); subexpresiile sunt numite a-q pentru referință. Partea stângă arată automatul finit nedeterminist care rezultă din algoritmul lui Thompson, cu stările entry (inițială) și exit (finală) a fiecărei astfel de subexpresii colorate în magenta și, respectiv, cyan. ε ca etichetă a tranziției este omis pentru claritate — tranzițiile neetichetate sunt, de fapt, ε-tranziții. Stările de intrare și ieșire corespunzătoare expresiei rădăcină q sunt starea inițială și, respectiv, finală a automatului.
Pașii algoritmului sunt după cum urmează:
q: | începe conversia expresei închidere Kleene | (0|(1(01*(00)*0)*1)*)*
| ||||||||
b: | începe conversia expresiei reuniune | 0|(1(01*(00)*0)*1)*
| ||||||||
a: | convertește simbolul | 0
| ||||||||
p: | începe conversia expresiei închidere Kleene | (1(01*(00)*0)*1)*
| ||||||||
d: | începe conversia expresiei concatenare | 1(01*(00)*0)*1
| ||||||||
c: | convertește simbolul | 1
| ||||||||
n: | începe conversia expresiei închidere Kleene | (01*(00)*0)*
| ||||||||
f: | începe conversia expresiei concatenare | 01*(00)*0
| ||||||||
e: | convertește simbolul | 0
| ||||||||
h: | începe conversia expresiei închidere Kleene | 1*
| ||||||||
g: | convertește simbolul | 1
| ||||||||
h: | încheie conversia expresiei închidere Kleene | 1*
| ||||||||
l: | începe conversia expresiei închidere Kleene | (00)*
| ||||||||
j: | începe conversia expresiei concatenare | 00
| ||||||||
i: | convertește simbolul | 0
| ||||||||
k: | convertește simbolul | 0
| ||||||||
j: | încheie conversia expresiei concatenare | 00
| ||||||||
l: | încheie conversia expresiei închidere Kleene | (00)*
| ||||||||
m: | convertește simbolul | 0
| ||||||||
f: | încheie conversia expresiei concatenare | 01*(00)*0
| ||||||||
n: | încheie conversia expresiei închidere Kleene | (01*(00)*0)*
| ||||||||
o: | convertește simbolul | 1
| ||||||||
d: | încheie conversia expresiei concatenare | 1(01*(00)*0)*1
| ||||||||
p: | încheie conversia expresiei închidere Kleene | (1(01*(00)*0)*1)*
| ||||||||
b: | încheie conversia expresiei reuniune | 0|(1(01*(00)*0)*1)*
| ||||||||
q: | încheie conversia expresiei închidere Kleene | (0|(1(01*(00)*0)*1)*)*
|
Un automat determinist minim echivalent este afișat mai jos.
Relația cu alți algoritmi
[modificare | modificare sursă]Algoritmul lui Thompson este unul din multiplii algoritmi pentru construirea de AFN-uri din expresii regulate;[4] un algoritm mai vechi fusese dat de McNaughton și Yamada.[5] Spre deosebire de cel al lui Thompson, algoritmul lui Kleene(d) transformă un automat finit într-o expresie regulată.
Algoritmul lui Glușkov este similar celui al lui Thompson, cu eliminarea ε-tranzițiilor.
Referințe
[modificare | modificare sursă]- ^ Ken Thompson (). „Programming Techniques: Regular expression search algorithm”. Communications of the ACM. 11 (6): 419–422. doi:10.1145/363347.363387.
- ^ Xing, Guangming. „Minimized Thompson NFA” (PDF).
- ^ Alfred V. Aho(d), Ravi Sethi, Jeffrey Ullman(d): Compilers: Principles, Techniques and Tools.
- ^ Watson, Bruce W. (). A taxonomy of finite automata construction algorithms (PDF) (Raport tehnic). Eindhoven University of Technology(d). Computing Science Report 93/43.
- ^ R. McNaughton, H. Yamada (). „Regular Expressions and State Graphs for Automata”. IEEE Transactions on Electronic Computers. 9 (1): 39–47. doi:10.1109/TEC.1960.5221603. Mai multe valori specificate pentru
|DOI=
și|doi=
(ajutor)