Sunteți pe pagina 1din 14

Potrivirea irurilor









Algoritmul ineficient
Algoritmul Rabin-Karp
Algoritmul Knuth-Morris-Pratt
Rezumat
Implementri sugerate
Probleme propuse
Soluiile problemelor

Capitolul

21

n cadrul acestui capitol vom prezenta modul n care se poate realiza cutarea unui
subir ntr-un ir.
Vom considera un ir de lungime N i vom verifica dac acesta conine un subir
de lungime M (M N). n cazul n care subirul apare n ir, vom determina poziia la
care ncepe acesta.
Vom ncepe cu un algoritm simplu, care va determina toate apariiile subirului, dar
care este ineficient. Vom continua cu doi algoritmi mult mai rapizi i anume algoritmul Rabin-Karp i algoritmul Knut-Morris-Pratt.

21.1. Algoritmul ineficient


Cea mai simpl modalitate de verificare a apariie unui subir ntr-un ir const n parcurgerea irului i, pentru fiecare poziie a acestuia, compararea subirului de lungime
M care ncepe la poziia respectiv cu subirul dat.

21.1.1. Prezentarea algoritmului


Datorit faptului c subirul are lungimea M, acesta va trebui s nceap la o poziie
cuprins ntre 1 i N M + 1. ncepnd cu poziiile mai mari dect N M + 1 irul iniial nu mai poate conine subiruri de lungime M, deci subirul nu poate aprea la
aceste poziii.
Ca urmare, pentru fiecare poziie cuprins ntre 1 i N M + 1 vom verifica dac,
ncepnd cu acea poziie, irul dat conine aceleai elemente ca i subirul.
Varianta n pseudocod a acestui algoritm este urmtoarea:

21. Potrivirea irurilor

285

Algoritm Potrivire(ir,subir):

{ ir irul n care se caut subirul }


{ subir subirul cutat }
N lungime(ir)
M lungime(subir)
pentru i 1, N M + 1 execut:
ok adevrat
j 0
ct timp ok i (j < M) execut:
dac iri+j subirj+1 atunci
ok fals
sfrit dac
sfrit ct timp
dac ok atunci
scrie 'Subirul apare la poziia ', i, '.'
sfrit dac
sfrit pentru
sfrit algoritm

Acest algoritm va funciona corect, indiferent de tipul irului i al subirului. Aadar, el poate fi aplicat indiferent de tipul elementelor coninute de ir i subir, atta
timp ct irul i subirul conin acelai tip de elemente. Ca urmare, vom putea folosi
acest algoritm pentru iruri de caractere, iruri de numere etc.

21.1.2. Analiza complexitii


Pentru fiecare dintre cele N M + 1 poziii vom compara cel mult M elemente (de
obicei mult mai puine deoarece, n majoritatea cazurilor, vom detecta relativ repede
faptul c subirul nu apare la poziia respectiv). Aadar, ordinul de complexitate al
unei verificri (pentru o anumit poziie) este O(M).
Datorit faptului c efectum N M + 1 astfel de comparaii, ordinul de complexitate al acestui algoritm este O((N M + 1) M) = O(M N M2 M) = O(M N M2).
Se observ c algoritmul va fi foarte rapid dac subirul are lungimea relativ mic
(conine puine elemente) sau relativ mare (conine un numr de elemente apropiat de
numrul de elemente al irului).
Durata timpului de execuie crete pe msur ce crete lungimea subirului, dar numai pn la un moment dat, dup care ncepe s scad.
Cazurile nefavorabile apar atunci cnd lungimea subirului este aproximativ egal
cu jumtate din lungimea irului. n aceast situaie ordinul de complexitate ar deveni:
N2
N2 N2

N N2
= O (N 2 )
= O
= O
O N

2
4
2
4
4

Ca urmare, pentru cazul cel mai defavorabil, avem un algoritm ptratic.

286

IV. Noiuni avansate

21.2. Algoritmul Rabin-Karp


Algoritmul propus de Rabin i Karp pentru potrivirea irurilor folosete anumite noiuni de teoria numerelor, cum ar fi egalitatea a dou numere, modulo un al treilea.
Dei, pentru cel mai nefavorabil caz algoritmul are acelai ordin de complexitate ca
i algoritmul prezentat anterior, pentru cazul mediu algoritmul Rabin-Karp este mult
mai rapid.
n cadrul acestei seciuni vom prezenta noiunile teoretice care stau la baza algoritmului, vom descrie algoritmul i i vom analiza complexitatea.

21.2.1. Reprezentarea irurilor


Algoritmul Rabin-Karp consider fiecare element al irului ca fiind o cifr ntr-o anumit baz. n cazul n care irul conine cifre zecimale, vom lucra cu baza 10; dac
avem caractere ASCII, vom utiliza baza 256.
Se observ imediat o limitare important a acestui algoritm i anume, faptul c numrul elementelor distincte ale irului trebuie s fie relativ mic, pentru a putea alege o
baz i a codifica elementele n baza aleas. Aadar, dac avem n elemente distincte,
va trebui s lucrm cu o baz b n.
n cele ce urmeaz, pentru simplitate (dar fr a reduce generalitatea) vom presupune c irurile conin cifre zecimale, deci vom lucra cu baza 10.
Aadar, fiecare ir care conine k caractere poate fi considerat a fi un numr zecimal cu k cifre (ignorm situaia n care primele caractere reprezint cifra 0). De exemplu, irul "2457" poate fi codificat prin numrul 2.457 (dou mii patru sute cincizeci i
apte).

21.2.2. Verificarea potrivirilor


Fiind dat un subir P cu m elemente, vom nota prin p valoarea zecimal corespunztoare subirului. De asemenea, vom nota prin ts valoarea zecimal corespunztoare
subirului de lungime m din T care ncepe la poziia s + 1. Este evident faptul c vom
avea ts = p dac i numai dac subirul P se regsete n irul T la poziia s + 1.
Valoarea p poate fi calculat ntr-un timp O(m) folosindu-se schema lui Horner:
p = Pm + 10 (Pm-1 + 10 (Pm-2 + + 10 (P2 + 10 P1))).
Valoarea t0 poate fi calculat n mod analog pe baza primelor m elemente ale irului
T:
t0 = Tm + 10 (Tm-1 + 10 (Tm-2 + + 10 (T2 + 10 T1))).
Trebuie remarcat faptul c aceste formule sunt valabile doar pentru baza 10. Pentru
o baz oarecare b, valoarea p va fi calculat astfel:
p = Pm + b (Pm-1 + b (Pm-2 + + b (P2 + b P1))).
De exemplu, dac lucrm cu iruri de caractere ASCII, vom avea b = 256 i formula corect va fi:
p = Pm + 256 (Pm-1 + 256 (Pm-2 + + 256 (P2 + 256 P1))).

21. Potrivirea irurilor

287

Se observ acum c o valoare ts+1 poate fi calculat pe baza valorii ts foarte simplu,
folosind formula:
ts+1 = 10 (ts 10m-1 Ts+1) + Ts+m-1.
Prin scderea valorii 10m-1 Ts+1 se elimin prima cifr a numrului, prin nmulirea
cu zece se adaug cifra 0 la sfritul numrului, iar prin adunarea valorii Ts+m-1 cifra 0
este nlocuit cu cifra corect.
S considerm irul 2457 i subirul 13. Valoarea p va fi 13, iar valoarea t0 va fi 24.
Pe baza formulei anterioare vom obine:
t1 = 10 (24 102-1 2) + 5 = 10 (24 20) + 5 = 10 4 + 5 = 40 + 5 = 45.
Aadar, putem calcula n timp constant fiecare valoare ts i apoi o putem compara
cu valoarea p. Ca urmare, ordinul de complexitate al algoritmului va deveni O(n m +
m + m) = O(m + n). Iniial vom calcula valorile t0 i p, ambele ntr-un timp de ordinul
O(m). Ulterior, vom determina cele n m valori ts, ntr-un timp total de ordinul O(n
m).
Din nefericire, acest algoritm are un inconvenient i anume faptul c valorile p i ts
sunt numere foarte mari. Din acest motiv nu vom putea lucra efectiv cu astfel de valori
dect dac simulm operaii cu numere mari. Datorit faptului c aceste valori au m cifre, apare un factor suplimentar O(m), deci obinem un ordin de complexitate O(m n).

21.2.3. Utilizarea aritmeticii modulare


Din fericire, exist o posibilitate de a elimina numerele mari. Practic, valorile p i ts
vor fi calculate modulo o valoare q. De obicei, pentru valoarea q este ales un numr
prim astfel nct valoarea b q (10 q pentru baza 10) s poat fi reprezentat n memorie.
Folosind aritmetica modular vom putea calcula valorile p i ts modulo q ntr-un
timp total de ordinul O(m + n). Pentru a determina valoarea ts+1 pe baza valorii ts vom
folosi formula:
ts+1 = rest[10 (ts x Ts+1) + Ts+m-1 / q],
unde prin x am notat restul mpririi ntregi a valorii 10m 1 la q.
Formula general de calcul (pentru o baz oarecare b) este:
ts+1 = rest[b (ts x Ts+1) + Ts+m-1 / q],
unde x reprezint restul mpririi ntregi a valorii bm 1 la q.
Folosind aritmetica modular eliminm inconvenientul numerelor mari, dar apare o
nou problem: n cazul n care avem p = ts (modulo q), nu este obligatoriu s avem i
p = ts. Putem deduce doar faptul c exist o valoare ntreag d astfel nct p = ts + d q.
Totui, avantajul principal l constituie faptul c dac avem p ts (modulo q),
atunci, cu siguran, vom avea p ts.
Aadar, putem folosi comparaia modular ca un test euristic. n cazul n care testul
eueaz, deducem imediat c subirul nu poate aprea n ir la poziia s + 1. Dac testul nu eueaz, va trebui s verificm dac nu avem o aa numit fals potrivire. Pen-

288

IV. Noiuni avansate

tru aceasta vom compara efectiv subirul P cu subirul din T care ncepe la poziia s +
1.
Teoretic, testul respectiv ar putea fi necesar la fiecare pas. Ordinul de complexitate
al testului este O(m) deci, n cazul cel mai nefavorabil, ajungem la ordinul de complexitate O((n m) (m + n)) = O(n2 m2).
Practic, dac valoarea q este bine aleas (un numr prim ct mai mare) ansa apariiei unei false potriviri este foarte redus (1 / q). De aceea, numrul comparaiilor efectuate inutil datorit unor false potriviri va fi de aproximativ (n m + 1) / q.
Aadar, pentru cazul mediu, algoritmul va funciona n timp liniar.

21.2.4. Prezentarea algoritmului


n continuare vom prezenta versiunea n pseudocod a algoritmului pentru cazul general n care se utilizeaz baza de numeraie b.
Algoritm Rabin_Karp(ir,subir,b,q):
{ ir irul n care se caut subirul }
{ subir subirul cutat }
{ b baza de numeraie utilizat }

{ q valoarea folosit pentru calculele n }


{ aritmetica modular }
N lungime(ir)
M lungime(subir)
x Ridicare_la_putere_modulo_n_eficient(b,M - 1,q)

{ se utilizeaz algoritmul prezentat n capitolul 20 }


p 0
t0 0
pentru i 1, M execut:
p rest[(b p + subiri) / q]
t0 rest[(b t0 + iri) / q]
sfrit pentru
pentru s 0, N - M execut:
dac p = ts atunci
ok adevrat
j 0
ct timp ok i j < M execut:
dac irs+j+1 subirj+1 atunci
ok fals
sfrit dac
sfrit ct timp
dac ok atunci
scrie 'Subirul apare la poziia ', s + 1, '.'

21. Potrivirea irurilor

289

sfrit dac
sfrit dac
ts+1 rest[(b (ts irs+1 x) + irs+M+1) / q]
sfrit pentru
sfrit algoritm

21.2.5. Timpul de execuie estimat


Aa cum am afirmat anterior, ordinul de complexitate al algoritmului Rabin-Karp este
ptratic. Totui, pentru cazul mediu, ordinul de complexitate este liniar. Vom prezenta
n continuare modul n care poate fi determinat timpul de execuie estimat al algoritmului.
Vom nota cu v numrul potrivirilor corecte i prin q valoarea aleas pentru efectuarea operaiilor n aritmetica modular.
Numrul comparrilor efective va fi de cel puin v, deoarece o poziie corect se
determin doar pe baza unei astfel de comparri. Numrul falselor potriviri va fi O(n /
q) deoarece pentru fiecare poziie ansa apariiei unei false potriviri este 1 / q.
Aadar, numrul comparrilor efectuate va avea ordinul O(v + n / q). Calculul valorilor ts i p are ordinul de complexitate O(m + n), iar calculul valorii x are ordinul de
complexitate O(log m).
n concluzie, ordinul de complexitate va fi O(m + n) + O(log m) + O(v + n / q) =
O(m + n) + O(v + n / q).

21.3. Algoritmul Knuth-Morris-Pratt


Acest algoritm realizeaz potrivirea irurilor folosindu-se o funcie prefix. n cadrul
acestei seciuni vom prezenta aceast funcie i vom descrie modul n care aceasta
poate fi utilizat pentru a determina eficient apariiile unui subir ntr-un ir.

21.3.1. Funcia prefix


Aceast funcie se calculeaz pentru subirul ale crui apariii sunt cutate. Ea pstreaz informaii referitoare la potrivirea subirului cu deplasamente ale acestuia.
n cazul n care tim c primele q caractere ale subirului se potrivesc cu q caractere ale irului la o anumit poziie s + 1, funcia prefix va arta, pentru o poziie s, care
este cea mai mic poziie s', astfel nct primele k caractere ale subirului se pot potrivi
cu k caractere ale irului la poziia s + 1.
Cu alte cuvinte, funcia va determina poziia s' pentru care are sens s cutm potriviri avnd n vedere structura subirului cutat. n cel mai bun caz vom sri direct la
poziia s + q i vom elimina toate poziiile cuprinse ntre s + 1 i s + q 1. n orice
caz, indiferent care este valoarea determinat, datorit semnificaiei funciei prefix,
vom ti cu siguran c primele k caractere ale subirului se vor potrivi la poziia s' +
1.

290

IV. Noiuni avansate

Valorile funciei prefix pot fi precalculate, folosindu-se comparri ale subirului cu


el nsui. Aceast funcie este notat, de obicei, prin .
Valoarea q reprezint lungimea celui mai lung prefix al subirului care reprezint
un sufix pentru irul format din primele q caractere ale subirului.
Modul de calcul al funciei este descris n cele ce urmeaz:
Algoritm FunciePrefix(subir):

{ subirul pentru care se calculeaz funcia prefix }


M lungime(subir)
1 0
k 0
pentru q 2, M execut:
ct timp (k > 0) i (subirk+1 subirq) execut:
k k
sfrit ct timp
dac subirk+1 = subirq atunci
k k + 1
sfrit dac
q k
sfrit pentru
returneaz
sfrit algoritm

Exist o demonstraie a faptului c timpul de execuie al acestei funcii, n cazul n


care este implementat n modul prezentat, are ordinul de complexitate O(m). Demonstraia acestei afirmaii implic operaii matematice relativ complicate, motiv pentru
care nu o vom prezenta. Este important doar concluzia, i anume faptul c valorile
funciei prefix sunt calculate n timp liniar n funcie de lungimea subirului.

21.3.2. Prezentarea algoritmului


Folosind valorile prefix vom ti, la fiecare pas, numrul de poziii peste care putem
"sri" n siguran, fiind siguri c subirul nu se poate potrivi la poziiile respective.
Vom prezenta n continuare versiunea n pseudocod a algoritmului:
Algoritm KnuthMorrisPratt(ir,subir)
{ ir irul n care se caut subirul }
{ subir subirul cutat }
N lungime(ir)
M lungime(subir)
FunciePrefix(subir)
q 0

21. Potrivirea irurilor

291

pentru i 1, N execut:
ct timp (q > 0) i (subirq+1 iri) execut:
q q
sfrit ct timp
dac subirq+1 = iri atunci
q q + 1
sfrit dac
dac q = M atunci
scrie 'Subirul apare la poziia ', i - m, '.'
q q
sfrit dac
sfrit pentru
sfrit algoritm

21.3.3. Analiza complexitii


Aa cum am afirmat anterior, ordinul de complexitate al operaiei de determinare a valorilor funciei prefix este O(m).
Dup determinarea acestei funcii, algoritmul KMP (Knuth-Morris-Pratt) efectueaz n pai (cte unul pentru fiecare poziie a irului). Cu excepia structurii repetitive n
cadrul creia se modific valoarea q, operaiile pentru fiecare pas se efectueaz n timp
constant.
Folosindu-se aceeai metod ca i n cazul algoritmului de determinare al funciei
prefix, se poate arta c ordinul de complexitate total al acestor operaii (pentru toi cei
n pai) va fi O(n).
n concluzie, ordinul de complexitate al algoritmului KMP este O(m + n).

21.4. Rezumat
n cadrul acestui capitol am prezentat trei modaliti prin care pot fi determinate apariiile unui subir ntr-un ir. Toi cei trei algoritmi determin toate apariiile, dar pot fi
uor modificai pentru a determina prima sau ultima apariie.
Am nceput cu un algoritm simplu, dar ineficient care poate fi utilizat pentru orice
tip de iruri. Am continuat cu algoritmul Rabin-Karp, un algoritm care impune anumite limitri pentru structura irurilor. Cu aceast ocazie am artat modul n care se utilizeaz aritmetica modular pentru mbuntirea timpului de execuie. Am artat c,
dei pentru cel mai nefavorabil caz timpul de execuie al algoritmului este ptratic,
pentru cazul mediu acesta devine liniar, motiv pentru care acest algoritm poate fi utilizat cu succes n majoritatea cazurilor.
n final, am prezentat algoritmul KMP care ruleaz n timp liniar n orice situaie.
Am introdus noiunea de funcie prefix i am artat modul n care aceasta se poate utiliza pentru a verifica apariiile unui subir ntr-un ir.

292

IV. Noiuni avansate

21.5. Implementri sugerate


Pentru a v nsui noiunile prezentate n cadrul acestui capitol v sugerm s realizai
implementri pentru:
1. determinarea tuturor apariiilor unui subir ntr-un ir de numere, folosind cel mai
uor de implementat algoritm;
2. determinarea tuturor apariiilor unui subir ntr-un ir de caractere, folosind cel mai
uor de implementat algoritm;
3. determinarea primei apariii a unui subir ntr-un ir de caractere, folosind o variant a aceluiai algoritm;
4. determinarea ct mai rapid a ultimei apariii a unui subir ntr-un ir de caractere,
folosind o variant a aceluiai algoritm;
5. determinarea tuturor apariiilor unui subir ntr-un ir de caractere, folosind algoritmul Rabin-Karp;
6. determinarea primei apariii a unui subir ntr-un ir de caractere, folosind algoritmul Rabin-Karp;
7. determinarea ultimei apariii unui subir ntr-un ir de caractere, folosind algoritmul Rabin-Karp;
8. determinarea tuturor apariiilor unui subir ntr-un ir de numere, folosind algoritmul KMP;
9. determinarea tuturor apariiilor unui subir ntr-un ir de caractere, folosind algoritmul KMP;
10.determinarea primei apariii a unui subir ntr-un ir de caractere, folosind algoritmul KMP;
11.determinarea ultimei apariii unui subir ntr-un ir de caractere, folosind algoritmul KMP.

21.6. Probleme propuse


n continuare vom prezenta enunurile ctorva probleme pe care vi le propunem spre
rezolvare. Toate aceste probleme pot fi rezolvate folosind informaiile prezentate n
cadrul acestui capitol. Cunotinele suplimentare necesare sunt minime.

21.6.1. Scooby Doo


Descrierea problemei
Scooby Doo a primit de ziua lui o brar mai ciudat. Aceasta este format din N
mrgele, dispuse circular. Pe fiecare dintre mrgele este desenat o liter a alfabetului
englez. Scooby a numerotat mrgelele de la 1 la N, iar acum le cere prietenilor s
spun cuvinte i ncearc s gseasc mrgeaua de la care ncepe cuvntul spus de
prieteni.

21. Potrivirea irurilor

293

Date de intrare
Prima linie a fiierului de intrare SCOOBY.IN conine un ir de litere ale alfabetului
englezesc, reprezentnd literele desentate pe mrgele. Cea de-a doua linie conine un
alt ir de litere ale alfabetului englezesc care reprezint un cuvnt pe care Scooby l
caut pe brar.
Date de ieire
Fiierul de ieire SCOOBY.OUT va conine o singur linie pe care se va afla un singur
numr, reprezentnd numrul de ordine al mrgelei de la care ncepe cuvntul cutat.
n cazul n care cuvntul nu se afl pe brar, valoarea acestui numr va fi 1.
Restricii i precizri
1 N 5000;
cuvntul cutat va conine cel mult N litere;
cuvntul cutat poate aprea pe brar de mai multe ori; n acest caz se poate
alege oricare dintre poziiile la care ncepe cuvntul;
se va face distincie ntre literele mici i literele mari.
Exemple
SCOOBY.IN
ScoobyDoobyDoo
Doo

SCOOBY.OUT
7

SCOOBY.IN
abcd
dabc

SCOOBY.OUT
4

SCOOBY.IN
AlphaBetaGamma
Beta

SCOOBY.OUT
-1

Timp de execuie: 1 secund/test

21.6.2. Venus
Descrierea problemei
n timpul tratativelor, n urma crora se va stabili cine are dreptul de a coloniza satelitul Titan, ambasadorul venusian a primit un mesaj codificat care prea s fi fost trimis
de ctre Guvernul Planetar de pe Venus.

294

IV. Noiuni avansate

Evident, el trebuie s verifice dac mesajul este autentic i dup aceea s aplice un
algoritm de decodificare foarte simplu. Dac mesajul este autentic, atunci el va conine, ntr-un anumit loc, o semntur pe care venusianul o cunoate.
Dup identificarea semnturii, ea va fi eliminat din mesaj, iar restul mesajului va
fi destul de uor de citit. Litera 'a' va fi nlocuit de litera 'z', litera 'b' va fi nlocuit de litera 'y' i aa mai departe.
Va trebui s verificai dac mesajul este autentic i, n caz afirmativ, s determinai
mesajul scris de venusieni.
Date de intrare
Prima linie a fiierului de intrare VENUS.IN conine mesajul care pare a fi sosit de la
guvernul venusian. Cea de-a doua linie a fiierului va conine semntura care trebuie
s apar n mesaj.
Date de ieire
Fiierul de ieire VENUS.OUT va conine mesajul decodificat, dac acesta este autentic
sau doar caracterul '*' n caz contrar.
Restricii i precizri
1 N 5000;
semntura va conine cel mult N 2 litere;
semntura poate aprea n mesaj o singur dat;
mesajul conine doar litere mici ale alfabetului englezesc.
Exemple
VENUS.IN
wvenusz
venus

VENUS.OUT
da

VENUS.IN
titanevmfh
titan

VENUS.OUT
venus

VENUS.IN
renunta
venus

VENUS.OUT
*

Timp de execuie: 1 secund/test

21. Potrivirea irurilor

295

21.6.3. Parole
Descrierea problemei
Se consider un ir de caractere ASCII de lungime N, i mai multe iruri care
reprezint parole. O parl este valid dac i numai dac ea apare ca subsecven a
irului dat. Va trebui s determinai numrul parolelor valide.
Date de intrare
Prima linie a fiierului de intrare PAROLE.IN conine irul de caractere ASCII. Cea
de-a doua linie a fiierului va conine numrul K al parolelor care trebuie verificate.
Fiecare dintre urmtoarele K linii va conine cte o parol.
Date de ieire
Fiierul de ieire PAROLE.OUT va conine o singur linie pe care se va afla numrul
parolelor valide.
Restricii i precizri
1 K 1000;
1 N 500;
o parol va conine cel mult N caractere.
Exemplu
PAROLE.IN
AlphaBetaGamma
10
Alpha
Beta
Gamma
Delta
aBe
aGa
alpha
beta
gamma
delta

PAROLE.OUT
5

Timp de execuie: 1 secund/test

296

IV. Noiuni avansate

21.7. Soluiile problemelor


Vom prezenta acum soluiile problemelor propuse n cadrul seciunii precedente. Pentru fiecare dintre acestea va fi descris metoda de rezolvare i va fi analizat complexitatea algoritmului prezentat.

21.7.1. Scooby Doo


La prima vedere problema se reduce la determinarea poziiei la care apare un subir
ntr-un ir. Totui, se observ imediat c exist posibilitatea ca subirul s nceap spre
sfritul irului i s continue la nceputul acestuia. S presupunem c lungimea subirului cutat este M. Pentru a evita problema descris este suficient ca, la sfritul irului, s adugm primele M 1 caractere ale irului. n aceste condiii problema se reduce la determinarea poziiei la care apare un ir format din M elemente ntr-un ir
format din M + N 1 elemente.
Pentru a rezolva problema este suficient s utilizm un algoritm rapid de potrivire a
irurilor.
Analiza complexitii
Datele de intrare constau n dou iruri de caractere formate din N, respectiv M,
elemente. Ca urmare, ordinul de complexitate al operaiei de citire a datelor este O(N
+ M).
n continuare va trebui s adugm M 1 caractere la sfritul primului ir,
operaie al crei ordin de complexitate este O(M).
Vom aplica acum un algoritm de potrivre a irurilor; dac se folosete algoritmul
KMP, ordinul de complexitate al operaiei este O(N + M 1 + M) = O(N + M),
deoarece cutm un subir format din M elemente, ntr-un ir format din N + M 1
elemente.
Datele de ieire constau ntr-un singur numr, ordinul de complexitate al operaiei
de scriere a acestora fiind O(1).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei probleme este O(N + M) + O(M) + O(N + M) + O(1) = O(N + M).

20.7.2. Venus
Pentru a vedea dac mesajul este autentic, va trebui doar s verificm apariia unui
subir ntr-un ir. Dac subirul apare, l vom elimina i apoi vom realiza decodificarea mesajului pe baza regulii descrise n enun.
Practic, nu va trebui s eliminm subirul, ci doar s memorm poziia la care ncepe acesta i s ignorm secvena corespunztoare n momentul n care realizm transformrile.

21. Potrivirea irurilor

297

Analiza complexitii
Datele de intrare constau n dou iruri de caractere formate din N, respectiv M
elemente. Ca urmare, ordinul de complexitate al operaiei de citire a datelor este O(N
+ M).
Vom folosi un algoritm de potrivre a irurilor; dac utilizm algoritmul eficient
(KMP), ordinul de complexitate al operaiei este O(N + M).
Pentru a scrie datele de ieire va trebui doar s parcurgem irul, s verificm dac
poziia curent face parte din semntur i, dac nu, s scriem n fiierul de ieire
caracterul decodificat. Aceast operaie are ordinul de complexitate O(N).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei probleme este O(N + M) + O(N + M) + O(N) = O(N + M).

21.7.3. Parole
Problema se reduce la verificarea existenei mai multor subiruri ntr-un ir dat. Vom
lua n considerare fiecare subir i vom aplica un algoritm de potrivire a irurilor pentru a verifica dac subirul face sau nu parte din ir. Pe parcursul verificrilor vom
numra subirurile care fac parte din ir (parolele valide) i n final vom scrie acest
numr n fiierul de ieire.
Analiza complexitii
Datele de intrare constau ntr-un ir format din N caractere i alte K iruri de dimensiuni diferite. Dac notm prin S suma total a dimensiunilor celor K iruri, atunci ordinul de complexitate al operaiei de citire a datelor este O(N + S).
Vom aplica algoritmul KMP pentru fiecare dintre cele K iruri. Dac lungimea unui
subir este si, atunci pentru un subir vom avea ordinul de complexitate O(N + si).
Ordinul de complexitate al ntregii operaii de verificare are forma:
K

O(N + s ) = O( K N + S ) ,
i=1

deoarece avem:
K

s
i=1

=S.

Datele de ieire constau ntr-un singur numr, ordinul de complexitate al operaiei


de scriere a acestora fiind O(1).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei probleme este O(N + M) + O(M) + O(N + M) + O(1) = O(N + M).

S-ar putea să vă placă și