Kursuse kodulehekülg
Viimati muudetud: 12.3.2003 kell 11.00
Loeng 2 - Regulaaravaldistega otsimine
- Mis on regulaaravaldised
- Kordus automaatide kohta
- Mittedeterministlikud automaadid (NFA)
- NFA Determiniseerimine
- Automaadi minimiseerimine
- Deterministlikud automaadid (DFA)
- Teisenduskaugus
Lisamaterjale
Esimeses loengus kirjeldasime täpset otsimist olukorras kus otsitav oli
kas üks konkreetne sõne või sõnede hulk. Nüüd üldistame otsmist nii et
otsitav on esitatud regulaaravaldisena.
Definitsioon Regulaaravaldised (RE) on
- ∅ on RE; ∅ on tühi sõnede hulk
- ε on RE; ε esitab hulka {ε}, ε on tühi sõne
- Iga a ∈ Σ on RE, a esitab hulka {a}
- Kui A ja B on RE ja L(A) ja L(B) on keeled mida need esindavad, siis on regulaaravaldised ka:
- (A + B), ühend, L(A + B) = L(A) ∪ L(B)
- (AB), konkatenatsioon, L(AB) = L(A)L(B)
- (A*), sulund, L(A*) = L(A)*
Ülesandepüstitus
- P1. Otsi kõikide L(A)-sse kuuluvate sõnede esinemised S-ist.
- P2. Kas S ∈ L(A)?
P1 lahendus: moodusta mittedeterministlik automaat MA nii et
L(MA) = L(Σ* A) ja otsi sellega S-is. Alati kui MA on lõppolekus
on leitud üks keele L(A) alamsõne lõpp-positsioon S-is.
P2 lahendus: moodusta MA nii et L(MA) = L(A). Sobita MA S peale.
P1 on P2 erijuht. Edaspidi vaatame vaid P2-e.
(A+B) võib esitada ka (A ∪ B) või (A|B)
Lõplikud automaadid (finite automaton) leiavad kasutust olukordades kus
arvutusprobleemid saavad olla vaid teatud lõplikus arvus olekutes.
Lõplikke automaate võib esitada mitmel eri kujul millest olekudiagrammid
(transition state diagrams).
DFA = Deterministic Finite Automaton
Definitsioon (DFA) Lõplik automaat (ingl. finite automaton) on viisik
M=( Q, Σ, δ, q0, F ), kus
- Q on automaadi olekute (ingl. states) lõplik hulk
- Σ on sisendtähestik (input alphabet)
- δ : Q × Σ → Q on automaadi üleminekuseos (siirdefunktsioon?) (transition function)
- q0 ∈ Q on automaadi algolek (initial state)
- F ⊆ Q on (aktsepteerivate) lõppolekute hulk (accepting final states)
Automaadi kasutamine:
- Samm - (q, aw ) |- (q' , w ) kui δ(q,a) = q', w ∈ Σ *
- Aktsepteeritav keel: L(M) = { w | ( q0 , w ) |- * (q, ε), q ∈ F }
Näide: märgiga täisarvu äratundmine
NFA = Nondeterministic Finite Automaton
Definitsioon (NFA) Mittedeterministlik lõplik automaat (ingl. nondeterministic finite automaton) on viisik
M=( Q, Σ, δ, q0, F ), kus
- Q on automaadi olekute (ingl. states) lõplik hulk
- Σ on sisendtähestik (input alphabet)
- δ : Q × Σ → P(Q) (NB!) on automaadi hulga kujul esitatud siirdefunktsioon
- q0 ∈ Q on automaadi algolek (initial state)
- F ⊆ Q on (aktsepteerivate) lõppolekute hulk (accepting final states)
Automaadi kasutamine:
- Samm - (q, aw ) |- (q' , w ) kui q' ∈ δ(q,a), a ∈ Σ ∪ { ε }, w ∈ Σ *
- Aktsepteeritav keel: L(M) = { w | ( q0 , w ) |- * (q, ε), q ∈ F }
Automaadi konstruktsioon:
Regulaarsest avaldisest mittedetermineeritud automaadi moodustamine (Meelis Roos) (kohalik)
Tekstist otsimine automaadiga MA
- Uurime kuidas jälgida NFA olekuid üheaegselt (alternatiiv -
determiniseeri NFA MA ja sobita vastavat DFA-d M'A ).
- Determiniseerimine võib kasvatada automaadi väga suureks,
|M'A| = O( 2 t ) kus t on MA olekute arv. Seega ei tasu
alati teha deterministlikku automaati, eriti kui S on lühike. M'A eelis on
O(|S|) otsimisaeg.
- Olgu Qi nende olekute hulk kus MA võib olla peale jada s[1..i] lugemist:
Qi = { q | (q0 , s1 ... sn ) |- * (q, ε) }
- Siis q ∈ Qi siis ja ainult siis kui leidub q' ∈ Qi-1 nii et
olekust q' saab olekusse q1 märgiga s[i] ja olekust q1 pääseb olekusse q nulli või enama
ε siirde abil.
NFA simuleerimine
Sisend: NFA MA=( Q, Σ, δ, q0, F ), Tekst S = s[1..n]
Väljund: Olekute jada Q0, Q1, ... Qn
NB: S ∈ L(MA) ainult kui F ⊆ Qn.
Jada queue ja hulgad Qi on alguses tühjad
1. for i = 0 to n do
2. märgi kõik q ∈ Q saavutamatuks
3. if i == 0 then Q0 = { q0 }; queue = { q0 }; märgi q0 saavutatuks
4. else
5. for q ∈ Qi-1 // Päris siirded s[i]-ga
6. for p ∈ δ(q, s[i])
7. if p pole veel saavutatud
8. Qi = Qi ∪ { p }
9. push( queue, p )
10. märgi p saavutatuks
11. while queue ≠ ∅
12. q = take( queue )
13. for p ∈ δ(q, ε ) // ε - siirded
14. if p pole veel saavutatud
15. Qi = Qi ∪ { p }
16. push( queue, p )
17. märgi p saavutatuks
|
Teoreem NFA simuleerimise ajaline keerukus on O( || MA || ⋅ n )
kus ||MA|| on MA olekute ja siirete kogusumma ja ||MA|| ≤ 6 |A|.
Tõestus - ühe sammu jooksul käsitletakse kõiki olekuid ja siirdeid vaid
üks kord, sest nad märgitakse kohe saavutatuks. Kokku sooritatakse samme
n tk. Automaadi suurus on varasemat konstruktsiooni kasutades ≤ 6 |A| kus |A| on
regulaaravaldise A pikkus.
Eesmärk on korvata ε-siirded ning jätta igast olekust iga märgiga vaid üks võimalik siire.
Esita kõikide algse automaadi mingil hetkel saavutatavate olekute hulgad uue automaadi
olekutena. Iga erinev hulgakombinatsioon defineerib uue oleku deterministlikus automaadis.
Automata for Matching Patterns
Handbook of Formal Languages
(kohalik)
Vt. ka soomekeelne konspekt
- kaks automaati mis tunnevad ära sama keele on ekvivalentsed
- Lõplik automaat on minimaalne kui see on väikseima olekute arvuga ekvivalentsete automaatide klassis
- Automaat kus on rohkem olekuid on redundantne
- Automaate moodustavad algoritmid ei tee alati minimaalset automaati
- Lihtsam on aru saada väikse mitteredundantse automaadi tööst
- Ilma asjata pole vaja hoida üleliigseid olekuid
- minimaalse automaadi töötlemine on efektiivsem
Automaadi minimiseerimine (koopia)
Tavaliselt konstrueeritakse kõigepealt regulaaravaldisest NFA ja siis see determiniseeritakse.
Saab ka otse - kasutades McNaughtoni ja Yamada konstruktsiooni et teha regulaaravaldisest otse DFA.
Näide: Vaatame avaldise re = (a &cup b)*aba teisendamist.
- Lisame lõpusümboli # : (a &cup b)*aba#
- Teeme avaldisele puu-kujulise esituse
- Lehed: re-s esinevad tähestiku sümbolid.
- Sisemised tipud - avaldises esinevad operaatorid (⋅ on konkatenatsioon)
- Nummerdame lehed vasakult paremale (unikaalne positsiooni number igale lehele)
- Positsiooni number on aktiivne kui järgmiseks võiks lugeda vastava märgi
- DFA olekud ja siirded tehakse otse puust: DFA olekule vastab alamhulk positsiooninumbreid mis on parajasti aktiivsed kui on loetud sisendi mingi algusosa.
- Näites on algolek {1,2,3) (kui veel pole midagi loetud sisendist)
- DFA sisaldab siirded q →a q', kus q' on positsiooninumbrid mis muutuvad aktiivseks kui q positsioonides loetaks märk a.
- Lõppolekud on need, mis sisaldavad # positsiooninumbrit
-
| olek | a | b |
| 123 (alg) | 1234 | 123 |
| 1234 | 1234 | 1235 |
| 1235 | 12346 | 123 |
| 12346 | 1234 | 1235 |
Teisenduskaugus on eraldi loengu teema. Olgu vaid öeldud, et
stringide y ja z vaheline teisenduskaugus on minimaalne arv
teisendusi mis tuleks teha ühele stringile (näiteks y) et saada teist
(z). teisendused on ühe tähe välja viskamine, ühe tähe juurde panemine,
või he tähe asendamine teisega.
ABC -> ABBC saadakse ühe B lisamisega,
ABC -> AC saadakse B eemaldamisega
ABC -> ABB saadakse C asendamisega B-ga.
Kõik stringid mis on genereeritavad näiteks ABC-st ühe
teisendusoperatsiooniga võiks üles lugeda ning nendest moodustada
lõpliku automaadi:
ABC => AB, AC, BC, AB[AB], A[AC]C, [BC]BC, AABC, ABAC, ABCA, BABC, ABBC,
ABCB, CABC, ACBC, ABCC
Järgmistes loengutes vaatleme teisenduskauguse arvutamise meetodeid ja ligikaudset
otsimist (vastavalt ette antud teisenduskauguse limiidile).
EOF