Title: Sisteme de programe pentru timp real
1Sisteme de programepentru timp real
- Universitatea Politehnica din Bucuresti
- 2007-2008
- Adina Magda Florea
- http//turing.cs.pub.ro/sptr_08
- si curs.cs.pub.ro
2Capitole curs
- Prelucrarea sirurilor de caractere
- Criptografie si criptosisteme
- Retele neurale
- Algoritmi genetici
- Programare genetica
- Retele Bayesiene
- Invatare prin recompensa
3Informatii curs
- Pagina Web a cursului
- http//turing.cs.pub.ro/sptr_07
- Cursul se afla si pe curs.cs.pub.ro
- Notare
- Laborator 30
- Tema de casa de semestru 20
- Examen 50
- Minimum 6 prezente la laborator
4Curs Nr. 1
- Prelucrarea sirurilor de caractere
5Algoritmi de identificare a sirurilor de caractere
- Introducere
- Algoritmul cautarii directe
- Algoritmul Knuth-Morris-Prat
- Algoritmul Boyer-Moore
- Algoritmul Rabin-Karp
- Algoritmul deplaseaza-aduna
61 Introducere
- Identificarea (recunoasterea) sabloanelor in
siruri de caractere - sir a, lungime N
- sablon p, lungime M
- Fiind dat un sir de lungime N
- a a1a2a3...aN,
- si un sablon de lungime M
- p p1p2p3...pM,
- se cere sa se gaseasca multimea de pozitii
- i ? 1 ? i ? N-M1 a.i. aiai1aiM-1 p
7Introducere
- Prima aparitie / toate aparitiile
- Cum difera cautarea in sir a unui sablon de
cautarea unei chei - Algoritmul cautarii directe Cazul cel mai
nefavorabil timp proportional cu NM in multe
cazuri practice, timpule mediu este proportional
cu NM. - 1970 - S.A. Cook a demonstrat teoretic ca exista
un algoritm de identificare a sabloanelor cu
timpul cel mai nefavorabil proportional cu NM.
D.E. Knuth, J.H. Morris si V.R. Pratt au
construit un astfel de algoritm. - 1976 - R.S. Boyer si J.S. Moore au descoperit un
algoritm chiar mai rapid decat (2) in multe
aplicatii, deoarece examineaza in multe cazuri
numai o parte din caracterele textului. - 1980 - R.M. Karp si M.O. Rabin au observat ca
problema identificarii sabloanelor nu este mult
diferita de o problema standard de cautare si au
descoperit un algoritm care are virtual timpul
proportional cu MN.
82 Algoritmul cautarii directe
- int cautsablon1(char p, char a)
- int i 0, j 0 / i este pointerul in text
/ - int M strlen(p) / j este pointerul in
sablon/ - int N strlen(a)
-
- do
-
- while ((i lt N) (jltM) (aipj))
ij - if (jM) return i-M
- i- j-1
- j 0
- while (iltN)
- return i
-
9Algoritmul cautarii directe
- int cautsablon2(char p, char a)
- int i, j
- int M strlen(p)
- int N strlen(a)
-
- for (i0, j0 jltM iltN i, j)
- while (ai ! pj)
- i- j-1
- j 0
-
- if (jM)
- return i-M
- else
- return i
-
10Algoritmul cautarii directe
- Proprietate Algoritmul cautarii directe
necesita, in cazul cel mai nefavorabil, un numar
de maxim NM comparatii de caractere. - Timpul de rulare pentru cazul cel mai defavorabil
este proportional cu M(N-M1), si cum M ltlt N
obtinem valoarea aproximativa NM. - Cazul cel mai nefavorabil poate apare, de
exemplu, la prelucrarea imaginilor binare. - In multe aplicatii de prelucrare a textelor,
bucla interioara se executa rareori si timpul de
rulare este proportional cu NM.
113. Algoritmul Knuth-Morris-Pratt
- Idee
- startul fals al identificarii consta din
caractere deja cunoscute - a sir, i index in sir, N
- p sablon, j index in sablon, M
- Caz particular primul caracter din sablon nu mai
apare in sablon i - sir 1000001000000 a
- sablon 1000000 p
- j
- nu i i j 1 da nu se modifica i si j
0
12Caz general
- sir 1010100111 a
- sablon 10100111 p
- j4
- i trebuie decrementat. Cu cat?
- Se poate cunoaste aceasta valoare depinde de
caracterele din sablon - Daca nepotrivirea intre sir si sablon apare pe
pozitia j in sablon, si - Exista un k ? 0, j-1 pentru care
- p0 ... pk-1 pj-k ... pj-1
- atunci o posibila identificare intre sir si
sablon poate apare incepand cu caracterul din sir
ai-k si caracterul din sablon pj-k. - Pt sablon exemplu j 4, k2
- p0 p2-1 p4-2 p4-1, adica
p0 p1 p2 p3
13Caz general
- Trebuie cautat k maxim cu aceasta proprietate.
- Daca nu exista k cu ac. proprietatea atunci
cautarea se reia de la pozitia i si j0. - Daca exista un astfel de k atunci
- i i k, j 0 .
- Se calculeaza valorile unui vector nextj pt ?pj
?p (cu M elemente) - cu cat trebuie decrementat i la aparitia unei
nepotriviri pe pozitia j - nextj numarul maxim de caratere nr de la
inceputul sablonului care identifica cu ultimele
nr caractere din sablon pana la pozitia j-1
kmax cu proprietatea anterioara
14Vectorul next
- 10100111 next4 2
- j 4 Reluare cautare i i nextj,
j 0 - Cum se calculeaza nextj?
- Metoda informala, legata de implementare
- Metoda formala, bazata pe modelul formal al unui
automat finit determinist care recunoaste un
sablon intr-un sir, pentru un alfabet dat. - Se gliseaza o copie a primelor j caractere din
sablon peste sablon de la stanga la dreapta,
incapand cu primul caracter din copie suprapus cu
al doilea caracter din sablon - Se opreste glisarea daca (a) toate caracterele
suprapuse (pana la j-1) coincid sau (b) primul
caracter al copiei ajunge pe pozitia j.
15Vectorul next - exemplu
- j nextj sablon si copie sablon
- 1 0 10100111 0 potriviri
- 1
- 2 0 10100111 0 potriviri
- 10
- 10
- 3 1 10100111
- 101
- 101 1 potrivire
- 4 2 10100111
- 1010
- 1010 2 potriviri
- 5 0 10100111
- 10100
- 10100
- 10100 0 potriviri
- 10100
- 6 1 10100111
- 101001 1 potrivire
16Vectorul next
- Caracterele identice definesc urmatorul loc
posibil in care sablonul se poate identifica cu
sirul, dupa ce se gaseste o nepotrivire pe
pozitia j (caracterul pj). - Distanta cu care trebuie sa ne intoarcem in sir
este exact nextj, adica numarul de caractere
care coincid. - Este convenabil next0 -1.
- Cum facem sa nu ne intoarcem in sir?
- ai ! pj ? se reia de la i nextj si j
0 - Dar primele nextj caractere incepand de la
pozitia i nextj din sir primele nextj
caractere din sablon - ? i nemodificat si j nextj
17Exemplu
- i 4 ar trebui i 2 si j 0
- sir 1010100111 a
- sablon 10100111 p
- j4
- next4 2
- acelasi efect daca i nemodificat si j 2
- sir 1010100111 a
- sablon 10100111 p
18Algoritmul Knuth-Morris-Pratt
- int cautKMP(char p, char a)
- int i, j
- int Mstrlen(p)
- int Nstrlen(a)
-
- initnext(p)
- for (i0, j0 jltM iltN i, j)
- while ((jgt0) (ai ! pj))
- j nextj
- if (jM)
- return i-M
- else
- return i
-
- Obs Pt. j 0 si ai ! p0 este necesar ca
i, j 0 deci next0 -1
19Calculul vectorului next
- void initnext(char p)
- int i,j, Mstrlen(p)
-
- next0 -1
- for (i0, j-1 iltM i, j, nextij)
- while ((jgt0) (pi ! pj))
- jnextj
-
- Obs
- Dupa incrementarile i si j avem pi-j
pi-1 p0pj-1 - Identificarea efectueaza maxim MN comparatii de
caractere
20Algoritm pentru sablon fix
Caracterele din sirul de intrare total diferite
de cele din sablon sunt citite numai in s0, pe
tranzitia s0 ?p s0, p ?p0. Automatul citeste un
nou caracter de intrare numai pentru tranzitiile
la dreapta, i.e., daca caracterul din sir se
potriveste cu sablonul. Altfel automatul se
intoarce fara a citi un nou caracter (acesta
este motivul pentru care nu sunt etichetate si
tranzitiile la stinga).
21Algoritm pentru sablon fix
- int cautKMP1(char a)
- int i-1
-
- sm i
- s0 if (ai!1) goto sm i
- s1 if (ai!0) goto s0 i
- s2 if (ai!1) goto s0 i
- s3 if (ai!0) goto s1 i
- s4 if (ai!0) goto s2 i
- s5 if (ai!1) goto s0 i
- s6 if (ai!1) goto s1 i
- s7 if (ai!1) goto s1 i
- return i-8
-
22Caracteristici KMP
- Algoritmul KMP presupune precompilarea
sablonului, ceea ce este justificat daca M N,
adica textul este considerabil mai lung decat
sablonul - Algoritmul KMP nu decrementeaza indexul din
sir, proprietate folositoare mai ales pentru
cautarile pe suport extern - Algoritmul KMP da rezultate bune daca o
nepotrivire a aparut dupa o identificare partiala
de o anumita lungime. In cazul in care aceste
situatii sunt o exceptie, algoritmul nu aduce
imbunatatiri semnificative - Algoritmul KMP imbunatateste timpul cazului cel
mai nefavorabil (NM), dar nu si timpul mediu.
234 Algoritmul Boyer-Moore
- Potrivit daca intoarcerea in text nu este
dificila
- UN EXEMPLU DE CAUTARE RAPIDA
- UTARE
- UTARE
- UTARE
- UTARE
- UTARE
24Algoritmul Boyer-Moore
- Vectorul skip se defineste pentru fiecare
caracter din alfabet - arata, pentru fiecare caracter din alfabet, cat
de mult se sare (se deplaseaza sablonul la
dreapta) in sir daca acest caracter a provocat
nepotrivirea - rutina initskip initializeaza skip
- skipindex(pj) M-j-1, j0,M-1 pentru
caracterele din sablon - skipindex(c) M pentru restul de caractere din
alfabet
25Algoritmul Boyer-Moore
- int caut_BM(char p, chara)
- int i, j, t
- int Mstrlen(p), N strlen(a)
- initskip(p)
-
- for (iM-1, jM-1 jgt0 i--, j--)
- while (ai!pj)
- t skipindex(ai)
- i (M-j gt t) ? M-j t
- if (i gt N) return N
- j M-1
-
- return i1
-
26Algoritmul Boyer-Moore
- Combinarea a doua metode pentru a afla exact cu
cat trebuie deplasat la dreapta sirul metoda
prezentata si metoda vectorului next din
algoritmul Knuth-Morris-Prat, in varianta de la
dreapta la stinga, pentru ca apoi sa se aleaga in
skip cea mai mare valoare. - In conditiile acestei modificari, este valabila
urmatoarea proprietate. - Proprietate Algoritmul Boyer-Moore face cel
mult MN comparatii de caractere si foloseste N/M
pasi, daca alfabetul nu este mic si sablonul este
scurt.
275. Algoritmul Rabin-Karp
- Idee
- Considera textul ca fiind o memorie mare si
trateaza fiecare secventa de M caractere a
textului ca o cheie intr-o tabela de dispersie
(hash). - Trebuie sa calculam functia de dispersie pentru
toate secventele posibile de M caractere
consecutive din text si sa verificam daca
valorile obtinute sunt egale cu functia de
dispersie a sablonului. - Artificiu pt. a nu tine toata tabela de dispersie
in memorie.
28Calculul functiei hash
- h(k)k mod q, unde k este numarul de caractere
din sir, iar q (dimensiunea tabelei) este un
numar prim mare. - q poate fi chiar foarte mare deoarece tabela hash
nu se stocheaza in memorie - Functia de dispersie pentru pozitia i din text se
calculeaza pe baza valorii acestei functii pentru
pozitia i-1 - Se transforma grupuri de M caractere in numere,
prin impachetare ca reprezentare intr-o anumita
baza - Aceasta corespund la a scrie caracterele ca
numere in baza d, unde d este numarul de
caractere posibile din alfabet.
29Calculul functie hash
- O secventa de M caractere consecutive
aiaiM-1 corespunde - y aidM-1 ai-1dM-2 aiM-1
- Presupunem ca stim valoarea lui h(y) y mod q.
- Deplasarea in text cu o pozitie la dreapta
corespunde inlocuirii lui y cu - y1 (y - aidM-1)d aiM
- Consideram d32 (sau orice multiplu de 2
corespunzator) - Cum facem sa nu memoram valorile functiei hash
pentru toate grupurile de M caractere din sir?
30Calculul functiei hash pt. y1 pe baza lui y
- Se cunoaste ca
- (a b) mod q (a mod q b mod q) mod q
- (a b) mod q (a (b mod q)) mod q
- Se doreste sa se arate ca
- (a0 x a1) mod q ((a0 mod q) x a1) mod
q - Demonstratie
- (a0 x a1) mod q ((a0 x) mod q a1 mod
q) mod q - (x (a0 mod q)) mod q a1 mod q mod q
((a0 mod q) x a1) mod q - Noul sir impachetat y1 se obtine din y astfel
(slide precedent) - y1 (y - ai dM-1) d aiM
- Cum se calculeaza y1 mod q pe baza lui y
- y1 mod q ((y ai dM-1) d
aiM) mod q - ( (y ai dM-1) mod q d aiM) mod q
31Algoritmul Rabin-Karp
- int caut_RK(char p, char a)
- int i long int dM1, h10, h20
- int Mstrlen(p), Nstrlen(a)
- for (i1 iltM i) dM (ddM) q
- // calculeaza d(M-1)mod q in dM
- for (i0 iltM i)
- h1 (h1d index(pi))q
- // functia hash pt sablon
- h2 (h2d index(ai))q
- // functia hash pt text
-
- for (i0 h1!h2 i)
- h2 (h2 dq - index(ai)dM)q
- // dq se adauga pt a mentine expresia gt0
- h2 (h2 d index(aiM))q
- if (i gt (N-M)) return N
-
- return i
yi1 mod q ( yi d ai1) mod q
y1 mod q ( (y ai dM-1) mod q d
aiM) mod q
32Caracteristici RK
- Algoritmul Rabin-Karp are destul de probabil o
complexitate timp liniara. - Algoritmul are timpul proportional cu NM, dar
el gaseste doua siruri cu valori de dispersie
egale. - In aceste conditii, trebuie sa comparam sablonul
cu cele M caractere din sir, pentru cazul
coliziunilor. - Deci, din punct de vedere teoretic, acest
algoritm ar putea sa fie tot O(NM), in cazul cel
mai defavorabil, in care toate sabloanele gasite
ar fi coliziuni ? putin probabil, deoarece q este
mare in practica, algoritmul foloseste NM pasi. - Daca sablonul se cauta de mai multe ori, el
poate fi considerat o cheie, iar textul poate fi
organizat in stucturi eficiente de cautare, cum
ar fi arbori binari, tabele de dispersie, etc.
336. Algoritmul deplaseaza-aduna
- Idee
- Algoritmul reprezinta starea cautarii ca un
numar, si fiecare pas in cautare (identificare)
este descris printr-un numar de operatii
aritmetice si logice - Acest lucru este posibil daca numerele folosite
sunt suficient de mari pentru a putea reprezenta
toate starile posibile in cursul rularii
34Algoritmul deplaseaza-aduna
- Se poate generaliza usor la urmatoarele cazuri
- 1. Dont care symbols, deci identificarea cu
orice caracter pe o pozitie - 2. Identificarea cu un caracter dintr-o clasa de
caractere (un interval) - 3. Identificarea cu un caracter din complementul
unei clase. - 4. Identificarea cu un numar dat K de nepotriviri
- 5. Identificarea mai multor sabloane in paralel.
35Ipoteze
- a - sirul (de lungime N) in care se executa
cautare - p - sablonul (de lungime M)
- i - index in sablon
- j - index in text
- Se foloseste un vector cu M componente, care
reprezinta cele M posibile stari in cautare
indexul i indica starea intre pozitiile 1i ale
sablonului si pozitiile (j-i1)j ale textului - M comparatoare de siruri care ruleaza in paralel
si citesc concurent aceeasi pozitie din sir
36Ipoteze
- starei - p1pi ? aj-i1 aj
- sji, i1,M multime de stari dupa citirea
caracterului j din sir - sji numarul de nepotriviri intre
- p1pi si aj-i1 aj
- Apare identificare daca
sjM 0
37Exemplu
sji numarul de nepotriviri intre p1pi si
aj-i1 aj
- Pozitia j-1 de cautare in text se calculeaza
sj-1i
- Sablonul ababc (M5)
- Sir cbbabababcaba
j-1
38Exemplu
- Se avanseaza in text la pozitia j se calculeaza
sji
j
39Exemplu
- Se avanseaza in text la pozitia j se calculeaza
sji
j
40Definitii
- Se defineste Tx pentru ? x ? ?
- Tix 0 daca pi x, i1,M
- 1 in caz contrar
- (prin compararea fiecarui caracter x din alfabet
cu p0pM) - Se observa relatia
- sji sj-1i-1 Tiaj i1,M
- Identificarea apare daca sjM 0
- Cuvant w
- b biti necesari pentru a reprezenta o stare
41Definitii
- Vector de stari reprezentat ca un numar in baza
2b - Pentru identificare exacta b 1
- sji 0 daca p0..pi aj-i1..aj
- 1 in caz contrar
- sjM 0 atunci starej lt 2M-1
42Definitii
- Actualizare la citirea unui nou caracter
- deplasez vect. de stari cu b pozitii la stanga
avans cu 1 pozitie in text - actualizez starile pe baza lui T si fac o
operatie potrivita - starej (starej ltlt b) op Taj
- Obs Operatia nu trebuie sa produca transport pt.
sji care sa afecteze sji1 - Pentru b1 op sau logic
43Definitii
- Reprezint T tot ca un numar in baza 2b
- unde, ? x, ?(cond) 1 daca cond adevarata
- 0 in caz contrar
- Exemplu
- b1, ? a, b, c, d p ababc
- Ta 11010 Tb 10101
- Tc 01111 Td 11111
- starea initiala este 11111
44Exemplu
- Sablon ababc
- Sir a b d
a b a b a b c - Tx 11010 10101 11111 11010 10101
.. - Stare 11110 11101 11111 11110
11101 . - (11111)
- starej-1 ltlt b Taj starej
45Algoritmul deplaseaza-aduna
- define CUVANT 32
- define B 1
- define MAXSIM 128
- In variabila lim vom calcula 2B(M-1)
46Algoritmul deplaseaza-aduna
- int caut_shadd(char p,char a)
- unsigned int state, lim, first, initial
- unsigned int TMAXSIM
- int i, j, matches, Mstrlen(p), Nstrlen(a)
- if(MgtCUVINT)
- printf("\n Error Utilizati dim. sablonltdim.
cuvint\n") - return -1
-
- / preprocesare /
- for(i0 iltMAXSIM i) Ti0
- lim0
- for(i0,j1 iltM i,jltltB)
-
- Tpi j
- lim j
-
- lim (limgtgtB)
47Algoritmul deplaseaza-aduna - continuare
- / cautare /
- matches0 initial 0 firstp0
- i0
- while (iltN)
-
- while(iltN ai!first) i
- stateinitial
- do
-
- state(stateltltB) Tai
- if (stateltlim)
- matches / identificare pe poz i-M1
/ - i
- while(state!initial)
-
- return matches
-
48Caracteristici
- Este nevoie de bM? biti suplimentari de
memorie si daca bM ? w, atunci este nevoie de
? cuvinte de memorie suplimentare. - Construirea tabelei T se face intr-un timp
proportional cu - Complexitatea cautarii, pentru cazul cel mai
nefavorabil si pentru cazul mediu este - unde
-
- este timpul necesar calculului unui numar
constant de operatii cu intregi de Mb biti,
folosind un cuvint de lungime w biti. - In practica (sabloane de 32 sa 64 biti), timpul
mediu si cel mai nefavorabil este O(N).
49Extinderea algoritmului la identificarea claselor
de sabloane
- x
-
- x1x2xn - clasa
- x1 sau x1x2xn - complement
50Extinderea algoritmului la identificarea claselor
de sabloane
- Exemplu a, b, c, d.
- Sablonul Aabbbd se potriveste peste
(sub)sirurile Abaca, abcda, dar nu si peste abbac
sau ababb. - Doua dimensiuni lungimea M a sablonului si
dimensiunea descrierii sablonului, notata cu M1.
51Extinderea algoritmului la identificarea claselor
de sabloane
-
- Exemplu a, b, c, d.
- Sablonul este ababbabc.
- M 5 si M1 15.
- Ta 11000 Tb 10011
- Tc 11101 Td 01101
52Algoritmul pt calculul lui T
- valinit ? 111...111 (w biti)
- for i 1 to M do
- if pi or pi este un complement
- then valinit ? valinit 1110i111
- endfor
- for i 1 to ? do
- Txi ? valinit
- endfor
- for i 1 to M do
- foreach x ? pi do
- if pi este un complement
- then Tx ? Tx 0001i000
- else Tx ? Tx 1110i111
- endforeach
- endfor
52
53Implementarea calculului lui T
- void tinit(char p)
- unsigned int TMAXSYM, initval, mask1
- int i0, M0, M1strlen(p)
- / calculeaza initvallt-initval 111..0i..111 /
- initval0
- while(iltM1)
- M
- if(pi'')initvalmask
- else if(pi'')initvalmask
- while(pi!EOS
- pi!'') i
- else if(pi'')
- while(pi!EOS pi!'')i
- maskltltBi
-
53
54Implementarea calculului lui T - continuare
- / calculeza Txilt-initval pentru fiecare xi din
alfabet/ - for(i0iltMAXSYMi)Tiinitval
- / Actualizeaza Tx, cu x din sablon /
- i0 mask1
- while(iltM1)
- if(pi'') while(pi!'')
Tpimask - else if(pi'')
- while(pi!'') Tpimask
- else Tpimask
- i maskltltB
-
54
55Identificarea cu max k nepotriviri
- Fiecare stare individuala poate fi reprezentata
printr-un numar de maxim O(logM) biti. - - daca sjM ? k, am gasit o identificare cu
maximum k nepotriviri - - operatorul op este adunarea
- - Deoarece ne intereseaza numai k nepotriviri,
este suficient sa alegem - b suplog2(k1) 1
- Problema transportului un bit de transport
(overflow) pt fiecare stare
55
56Identificarea cu max k nepotriviri
- - Obtinerea unei noi stari
- starej1(starej ltlt b) Txj1
- - Conditia de identificare cu max k nepotriviri
- sjM overfj lt (k1) 2b(M-1)
- Starea initiala se considera 00000, iar
overflow-ul initial b1 b1b1 - Cazul
- Sablonul ababc
- Alfabetul a, b, c, d
- T construit anterior
- k 2, b 3 (b suplog2(k1) 1)
56
57Exemplu
- Sablonul ababc
- Alfabetul a, b, c, d
- T construit anterior
- k 2, b 3
- starea initiala 00000
- overflow initial 44444
sir a b d a b Tx 11010 10101 11111 11010 10101
stare 11010 20201 13121 02220 32301 overf 44440
44400 44000 40000 00000
sir a b a b c Tx 11010 10101 11010 10101 01111
stare 30020 10301 10020 10301 00121 overf 04000
40000 04000 40000 04000
57
58Algoritmul pentru max k nepotriviri
- mask ? 1Mb0012b001b00
- lim ? (k1) ltlt (M-1)b
- stare ? 0 overf ? mask
- for i 1 to N do
- stare ? (stare ltlt b) Tai
- overf ? (overf ltlt b) (stare mask)
- stare ? stare mask
- if (stareoverf) lt lim
- then identificare la pozitia i-M1
- endfor
58