Sunteți pe pagina 1din 7

1. Cutarea informaiei textuale.

Specificul problemei :
a) Programarea algoritmului de cutare a modelului n text dup Metoda direct
Se considera urmatoarele declaratii:
var s:array [0..n-1] of char;
p:array [0..m-1] of char; {0 < m <=n}
Se cere sa se determine pozitia primei aparitii in sirul s a sirului ( modelului ) p.
In cautarea directa, modelul e "deplasat paralel" cu sirul, cu cite o pozitie, pina la gasirea lui sau pina cind numarul
pozitiilor netestate din sir e mai mic decit lungimea modelului.
b) Programarea algoritmului Knuth-Morris Pratt.
Algoritmul Knuth-Morris-Pratt reprezinta o metoda avansata de cautare a unui sir de caractere model(pattern)
P[0..m] intr-un sir de caractere sursa T[0..n], evident n>=m.
Construit pe functia-prefix (P), algoritmul este un exemplu clasic de programare dinamica, cu eficienta nu de
O(N*M), ci de O(N+M).
Spre deosebire de metodele liniare, algoritmul KMP propune ca deplasarea modelului P de-a lungul sursei T sa fie
efectuata cu un numar mai mari de pozitii si ca in acelasi timp sa se memoreze partea de text care coincide cu
modelul. Acest lucru ne va permite sa evitam comparatiile inutile si, astfel, va creste considerabil viteza de cautare.
Functia-prefix (P) determina prefixul maxim a lui P, care este, defapt, si sufixului lui P. Cum se aplica aceasta
functie si pentru ce?
Se aplica pentru a ne ajuta sa construim o matrice k a lungimilor acestor prefixe, dupa care vom putea determina
daca modelul se contine in sursa sau/si cu cite pozitii trebuie sa deplasam modelul spre dreapta pentru a cauta o
noua potrivire.
2. Grafuri.
a) Noiuni de baz. Modalitatea de prezentare n memoria calculatorului utiliznd diferite structuri de
date.
Un graf,poate fi definit ca fiid o colecie de noduri i arce.
Un graf este o pereche G = < V, M > , unde V este o multime de virfuri si nu poate sa fie vida , iar
M V*V este o multime de muchii. Doua virfuri unite printr-o muchie sunt adiacente.
Un drum este o succesiune de muchii Lungimea drumului este egala cu numarul muchiilor care il constituie.
Drum simplu drum in care nici un virf nu se repeat. Un ciclu este un drum care este simplu, cu exceptia primului si
ultimului virf care coincide. Graf aciclic este un graf fara cicluri.
Un subgraf a lui G este un graf <VM>, unde V<=V, iar M este formata de muchiile M care unesc virfuri din V.
Moduri de reprezentare:
-listarea efectiva a tuturor nodurilor si arcelor
-geometric(desen pe plan unde nodul-cerc, arce-sageti)
-matrice patratica booleana de dim. Egala cu nr de nod., in care o pozitie aij=1 daca exista arcul (xi,xj)
Si 0 in caz contrar
-noduri reprezentare de 2 ori
b) Programarea algoritmilor pentru determinarea drumului minim (maxim): Ford simplificat ( pentru grafuri
fr circuite).
c) Programarea algoritmilor de verificare a existen ei ciclurilor n grafuri. Programarea algoritmilor
pentru determinarea drumului minim : Dijkstra
Cutarea n adncime permite de asemenea verificarea simpl a existenei ciclurilor ntr-un graf. Astfel, un graf
conine un ciclu, dac i numai dac procedura CautInAdncime descoper o valoare diferit de zero n tabloul
marc. Aceast nseamn c se parcurge un arc care conduce la un nod care a mai fost vizitat, deci graful conine un
ciclu. n cazul grafurilor neorientate trebuie ns s se in cont de reprezentarea dubl a fiecrui arc, care poate
produce confuzii.
Pentru reprezentarea grafurilor prin pdure de arbori de cutare, liniile punctate sunt acelea care nchid ciclurile.
3. Arbori. Exemple de reprezentare:
a) Reprezentarea prin liste generalizate.
Se considera ca nodurile terminale sunt elemente atomice, iar nodurile de grad 1 sunt subliste. Deci, fie
arborele de mai sus scris sub forma :
A( B (E (K, L), F), C (G), D (H (M), I, J)) cu reprezentarea:
b) Reprezentare prin structuri nlnuite.
O manier important i util de implementare a arborilor generalizai este aceea de a crea pentru fiecare nod al
arborelui o list a fiilor si. Datorit faptului c numrul fiilor poate fi variabil, o variant potrivit de implementare o
reprezint utilizarea listelor nlnuite
Aceasta reprezentare are calitatea ca, atunci cnd conteaza ordinea descendentilor, ea poate surprinde structura
diferita. De exemplu:
structura x este diferita de structura x
x
x
/|\
/|\
vid y vid
y vid vid
Metodele de reprezentare expuse permit sa putem identifica legatura nod-descendent (succesor). Dar, exista aplicatii
n care este nevoie de legatura nod-predecesor. Asadar, pare utila reprezentarea arborelui sub forma nodului (data,
parent). Avnd adresa unui nod, se gasesc toti predecesorii, obtinndu-se o lista nlantuita

Un arbore este o structur de date ierarhizat


n care elementele structurii, numite noduri, suntlegate ntre ele prin rela ii de tip tata-fiu. Nodul f r nici un
predecesor(tat) este numit rdcin ,iar nodul care nu are nici un succesor(fiu) este numit frunz.Gradul unui nod
este numrul de fii pe care i are acel nod. Nodurile care au grad zero se numesc frunz sau noduri terminale.
Gradul unui arbore este valoarea maxima a gradelornodurilor sale, sau, cu atte cuvinte, gradul unui arbore este egal
cu numrul maxim de fii pe care iare un nod.
4. Arbori. Specificul programrii problemei. Programarea algoritmilor care determin arborele de cost
minim ntr-un graf dup algoritmii:
a) Algoritmul PRIM,
b) Algoritmul KRUSCAL.
Un arbore este o structur de date ierarhizat
n care elementele structurii, numite noduri, suntlegate ntre ele prin rela ii de tip tata-fiu. Nodul f r nici un
predecesor(tat) este numit rdcin ,iar nodul care nu are nici un succesor(fiu) este numit frunz.Gradul unui nod
este numrul de fii pe care i are acel nod. Nodurile care au grad zero se numesc frunz sau noduri terminale.
Gradul unui arbore este valoarea maxima a gradelornodurilor sale, sau, cu atte cuvinte, gradul unui arbore este egal
cu numrul maxim de fii pe care iare un nod.
lgoritmul lui Kruskal este una dintre metodele cunoscute de rezolvare a problemei determinrii arborelui parial de cost
minim. Paii acestui algoritm sunt urmtorii:
-se alege nti muchia de cost minim,
-se adaug repetat muchia de cost minim nealeas anterior i care nu formeaz cu precedentele un ciclu,
-se vor alege n-1 muchii.
Algoritmul Prim incrementeaz mrimea unui arbore, pornind de la un nod, pn cnd sunt incluse toate nodurile.

Intrare: Un graf conex ponderat cu nodurile V i muchiile E.

Initializare: Vnou = {x}, unde x este un nod arbitrar (punct de plecare) din V, E nou= {}

repet pn cnd Vnou=V:

Alege muchia (u,v) din E de cost minim astfel nct u este n V nou i v nu e (dac exist mai multe
astfel de muchii, se alege arbitrar)

Se adaug v la Vnou, (u,v) la Enou

Ieire: Vnou i Enou descriu arborele parial de cost minim


5. Arbori binari. Operaii asupra arborilor binari.
Un arbore binar este un arbore n care fiecare vrf are cel mult doi descendeni fcndu-se distincie
ntre descendentul drept i descendentul stng al fiecrui vrf.
Caracteristici:
fiecare element este numit nod;
primul element dintr-un arbore se numete rdcin;
celelalte noduri formeaz fiecare cte un arbore; aceti arbori se numesc subarbori;
ntr-un arbore exist noduri crora nu le mai corespund subarbori; un astfel de nod se numete nod
terminal sau frunz;
un nod rdcin este numit nod tat; rdcina unui subarbore se numete nod fiu;
rdcina unui arbore se afl pe nivelul 0; dac un nod are nivelul m atunci fii lui au nivelul
nivel se nelege poziia ocupat fa de nodul rdcin;

m + 1, prin

prin nlimea arborelui nelegem nivelul cel mai mare al nodurilor terminale.
Un arbore binar n care fiecare nod care nu este terminal are exact doi d```
numete arbore binar complet.
Structura de baza a unui arboe binar:
SAS
SAD

subarborele stng (binar)


subarborele drept (binar)

escendeni se

Operatii curente:
selectia cmpului de date dintr-un nod si selectia descendentilor;
inserarea unui nod;
stergerea unui nod.
6. Strategii de traversare a arborilor binari:
a) Traversarea n Preordine: prelucrare n ordinea: rad, SAS, SAD;
b) Traversarea n Inordine: prelucrare n ordinea: SAS, rad, SAD;
c) Traversarea n Postordine: prelucrare n ordinea: SAS, SAD, rad.
Traversarea consta n "vizitarea" tuturor nodurilor unui arbore ntr-un scop anume, de exemplu, listare,
testarea unei conditii pentru fiecare nod, sau alta prelucrare. O traversare realizeaza o ordonare a nodurilor
arborelui (un nod se prelucreaza o singura data).
Exemplu de traversare:

a
/
\
b
c
/ \
\
d
e
f
/ \
g
h

preordine : A B D E G H C F
inordine : D B G E H A C F
postordine : D G H E B F C A
7. Arbori binari de cutare (BST).
a) Tabelele Hashing.
Vom considera o multime "atomi". Pentru fiecare element din aceasta multime avem: a atomi, este
definita o functie numita cheie de cautare: key(a) k cu proprietatea ca doi atomi distincti au chei diferite
de cautare: a1 a2 key(a1) key(a2).
Un arbore binar de cautare este un arbore T ale carui noduri sunt etichetate cu atomii continuti la un
moment dat n dictionar.
T = (V, E) , V = n. (n atomi n dictionar)
Considernd r V (radacina arborelui), Ts subarborele stng al radacinii si Td subarborele
drept al radacinii, atunci structura acestui arbore este definita de urmatoarele proprietati:
1) un nod x Ts atunci key(data(x)) < key(data(r));
2) x Td atunci key(data(x)) > key(data(r));
3) Ts si Td sunt BST.
b) Funcii: Search, Insert, Delete. Exemple de programe.
Un dictionar este o colectie S de atomi pentru care se definesc operatiile:
insert(S,a) insereaza atomul a n S daca nu exista deja;
delete(S,k) sterge atomul cu cheia k din S daca exista;
search(S,k) cauta atomul cu cheia k n S si-l returneaza sau determina daca nu este.
Search:
search(rad,k) // rad . pointer la radacina arborelui
{ // k . cheia de cautare a arborelui cautat
if (rad = 0) then return NULL
else
if key (data (rad)) > k then
return search (lchild (rad))
else
if key (data (rad)) < k then
return search (rchild (rad))
else return rad
}
Insert:
Se va crea un nod n arbore care va fi plasat la un nou nod terminal. Pozitia n care trebuie plasat acesta
este unic determinata n functie de valoarea cheii de cautare.
insert(rad,a) // rad - referinta la pointerul la radacina // arborelui
{
if (rad= 0) then rad= make_nod(a)
else if key (data (rad)) > key(a) then insert(lchild(rad),a)
else if key (data(rad)) < key(a)then
insert (rchild (rad),a)
}
Delete:

delete(rad,k) // rad referinta la pointer la radacina


{ // k - cheia de cautare a atomului care trebuie sters de noi
if rad = 0 then
return // nodul cu cheia k nu se afla n arbore
else if key(data(rad)) > k then delete(lchild(rad),k)
else if key(data(rad)) < k then delete(rchild(rad),k)
else delete_root(rad)
}
c) Detaarea celui mai mic ( celui mai mare nod) din arborele BST.
Pentru a gasi cel mai mare nod dintr-un arbore binar de cautare, se nainteaza n adncime pe ramura dreapta pna
se gaseste primul nod care nu are descendent dreapta. Acesta va fi cel mai mare.
remove_greatest(rad) //rad -referinta la pointer la
//radacina: un pointer la
radacina de poate
//fi modificat de catre functie
{
if rchild (rad)= 0 then
| p= rad
| rad= lchild (rad)
|_ return(p)
else
return (remove_greatest (rchild(rad)))
}
d) Crearea unui BST pornind de la secvena de atomi. (a1, a2, ..an)
gen_BST (va fi n programul principal)
| rad= 0
| for i= 1 to n
| insert (rad, ai)
Calculam complexitatea medie a generarii BST:
n

Complexitatea n cazul cel mai defavorabil este:

( i )=O( n2)
i=1

Notam cu T(k) - numarul de comparatii mediu pentru crearea unui BST pornind de la o secventa de k
elemente la intrare. Ordinea celor k elemente se considera aleatoare.
Pentru problema T(n) avem de creat secventa (a1 a2 ... an) cu observatia ca a1 este radacina arborelui.
T(n)= (n - 1) + val.med.SAS + val.med.SAD
8. Arbore binar de cutare dinamic echilibrat (AVL). Transformarea structurii arborelui dup nserare
pentru a conserva proprietatea de arbore binar echilibrat:
a) Imaginea oglind a rotaiei dreapta - stnga.
Un arbore binar este echilibrat daca si numai daca, pentru fiecare nod din arbore, diferenta dintre adncimile
SAS si SAD n modul este 1.
Exemple:
a
a
/ \
/ \
b
c
b
c
/ \
/ \
/ \
\
d
e f
g
d e
f
/ \
g
h
arbore binar
arbore binar
complet echilibrat
echilibrat
Adncimea unui arbore echilibrat cu n noduri este O(ln n).
Fie arborele echilibrat
A
/ \
B T 3 h = depth(T1) = depth(T2) = depth(T3)
/ \
T 1 T2
Consideram arborii T1, T2, T3 echilibrati. Insernd un nod prin rotatie simpla, rezulta structurile rotit simplu la
dreapta si rotit simplu la stnga imaginea oglinda a rotatiei dreapta:
A
/ \
B T3

/ \
T 1 T2

A
/ \
T3 B
/ \
T 2 T1

a) nserarea prin rotaii duble.


Caz 2: Inserarea se face prin rotatii duble:
A
/ \
B T3
/ \
T 1 T2

rotatie dubla
la dreapta
Fie primul caz:

A
/ \
T3 B
/ \
T 2 T1

rotatie dubla
la stnga

A
/ \
B
T3
/ \
este BST: T1 < B < T2 < A < T3
T1 T2
9. Structuri de date elementare i abstracte. Exemple ( pe baza elementelor din teoria grafurilor). - Vezi
referat din lecia 6.
Structuri de date elementare
Liste
O lista este o colectie de elemente de informatie (noduri) aranjate ntr-o
anumita ordine. Lungimea unei liste este numarul de noduri din lista. Structura
corespunzatoare de date trebuie sa ne permita sa determinam ecient care este
primul/ultimul nod n structura si care este predecesorul/succesorul unui nod dat
(daca exista). Iata cum arata cea mai simpla lista, lista liniara:
capul
listei
coada listei

O stiva este o lista liniara cu proprietatea ca operatiile de inserare/extragerea nodurilor se fac n/din coada
listei. Daca nodurile A, B, C sunt inserate ntr-o stiva n aceasta ordine, atunci primul nod care poate
sters/extras este C.In mod echivalent, spunem ca ultimul nod inserat este singurul care poate sters/extras.
Din acest motiv, stivele se mai numesc si liste LIFO (Last In First Out).
O coada este o lista liniara n care inserarile se fac doar n capul listei, iar stergerile/extragerile se fac doar
din coada listei. Din acest motiv, cozile se mai numesc si liste FIFO (First In First Out).
Un graf este o pereche G =< V , M >, unde V este o multime de varfuri, iar M V V este o multime de
muchii. O muchie de la virful a la virful b este notata cu perechea ordonata (a, b), daca graful este orientat, si
cu multimea {a, b},daca graful este neorientat.
Un arbore este un graf neorientat, aciclic si conex. Sau, echivalent, un arbore este un graf neorientat n
care exista exact un drum ntre oricare doua varfuri.
Heap-uri
Structuri de multimi disjuncte
Structuri de date abstracte
Abstractizarea datelor reprezinta d e f a p t c o n c e n t r a r e a a s u p r a esentialului , ignorind detaliile (sau altfel
spus, conteaza ce nu cum). Stapinirea aplicatiilor complexe se obtine prin descompunerea in module.
Un modul trebuie sa e simplu, cu complexitatea ascunsa in interiorullui,si sa aiba o interfata simpla care sa permita
folosirea lui fara a cunoaste implementarea. O structura de date abstracta e s t e u n
modul consta n d d i n date si operat ii .Datele sunt ascunse n interiorul
modulului si pot accesate prin intermediuloperatiilor. Structura de date este abstract a deoarece este cunoscuta
numai interfata structurii, nusi implementarea (operatiile sunt date explicit, valorile sunt denite implicit, prin intermediul
operatiilor)
Minimizarea timpului mediu de asteptare
O singura statie de servire (procesor, pompa de benzina etc) trebuie sa satisfaca cererile a n clienti. Timpul de servire
necesar fiecarui client este cunoscut in prealabil: pentru clientul i este necesar un timp ti, 1 i n. Dorim sa
minimizam timpul total de asteptar
(timpul de asteptare pentru clientul i)
ceea ce este acelasi lucru cu a minimiza timpul mediu de asteptare, care este T/n. De exemplu, daca avem trei clienti
cu t1 = 5, t2 = 10, t3 = 3, sunt posibile sase ordini de servire. In primul caz, clientul 1 este servit primul, clientul 2
asteapta pana este servit clientul 1 si apoi este servit, clientul 3 asteapta pana sunt serviti clientii 1, 2 si apoi este
servit. Timpul total de asteptare a celor trei clienti este 38.
1 2 3
5+(5+10)+(5+10+3)
= 38
1 3 2
5+(5+3)+(5+3+10)
= 31
2 1 3
10+(10+5)+(10+5+3)
= 43
2 3 1
10+(10+3)+(10+3+5)
= 41

3 1 2
3+(3+5)+(3+5+10)
= 29 optim
3 2 1
3+(3+10)+(3+10+5)
= 34
Algoritmul greedy este foarte simplu: la fiecare pas se selecteaza clientul cu timpul minim de servire din multimea de
clienti ramasa. Vom demonstra ca acest algoritm este optim. Fie
I = (i1 i2 ... in)
o permutare oarecare a intregilor {1, 2, ..., n}.
Arbore parial de cost minim[modific | modific sursa]
Dac graful este ponderat (fiecare muchie a sa este asociat cu o valoare numeric numit cost), se pune
problema determinrii unui arbore parial pentru care suma costurilor muchiilor s fie minim.
Pentru un graf conex pot exista mai muli arbori pariali de cost minim, dar costul arborelui par ial de cost minim este
univoc.
Pentru a determina arborele parial de cost minim asociat unui graf se poate folosi Algoritmul lui Prim, dac graful
este memorat sub form de matrice de adiacen, sau Algoritmul lui Kruskal, dac graful este memorat prin lista de
muchii.
De n -1 ori :
se determina cel mai apropiat nod (neadaugat inca la arbore) de arborele partial construit si muchia de cost minim
min
Se marcheaza pentru nod: t[nod]=s[nod]
Se adauga min la cost : cost=cost+min
Se marcheaza nod ca fiind adaugat la arbore: s[nod]=0
Se actualizeaza datele :

Daca distanta de la i la arbore (a[i][s[i]]) este mai mare decat distanta de la i la nodul nod tocmai adaugat la
arbore (a[i][nod]) se modifica potentialul ascendent pentru i: s[i]=nod
Divide et impera

este dat de urmtoare relaie de recuren: 0 0 ( ) ( ), (1), ( ) O n daca n n b n a T O


daca n n T n k Teorem: Dac n>n0 atunci: Algoritmii divide et impera au o bun comportare n timp, dac
dimensiunile subproblemelor n care se mparte subproblema snt aproximativ egale. Dac lipsesc fazele de
combinare a soluiilor, viteza acestor algoritmi este i mai mare (ex. cutarea binar). n majoritatea cazurilor,
descompunerile njumtesc dimensiunea problemei, un exemplu tipic reprezentndu-l sortarea prin interclasare.
t(n) { O(1) daca n<=n0
aT(n/b)+O(n pow k),daca n >n0
Backtracking
Aceast tehnic poate fi utilizat pentru rezolvarea problemelor de cutare. Cutarea
efectuat este exhaustiv, putnd fi folosit pentru generarea tuturor soluiilor posibile.
Se folosete n rezolvarea problemelor care ndeplinesc simultan urmtoarele condiii:
Soluia lor poate fi pus sub forma unui vector V = x1x2x3 . xn, cu
x1A1 . Xn An
Mulimile A1, A2, An sunt mulimi finite, iar elementele lor se afl ntr-o
ordine bine stabilit
Nu se dispune de o metod de rezolvare mai rapid
La ntlnirea unei astfel de probleme suntem tentai s generm toate elementele
produsului cartezian A1 A2 . An. Aceasta nu este totui o rezolvare foarte
rezonabil. Timpul de execuie este att de mare, nct poate fi considerat infinit.
Dac de exemplu dorim s generm toate permutrile unei mulimi, genernd
produsul cartezian, am putea obine 1,1,1,.1, pentru ca apoi s constatm c nu am
obinut o permutare (cifrele nu sunt distincte), dei chiar de la a 2-a cifr se poate observa
c cifrele nu sunt distincte.
Tehnica Backtracking are la baz un principiu extrem de simplu: se construiete
soluia pas cu pas. Dac se constat c pentru o anumit valoare nu se poate ajunge la
soluie, se renun la acea valoare i se reia cutarea din punctul unde am rmas
root(P): return the partial candidate at the root of the search tree.
reject(P,c): return true only if the partial candidate c is not worth completing.
accept(P,c): return true if c is a solution of P, and false otherwise.
first(P,c): generate the first extension of candidate c.
next(P,s): generate the next alternative extension of a candidate, after the extension s.
output(P,c): use the solution c of P, as appropriate to the application.
Dijkstra
Se creeaz o list cu distane, o list cu nodul anterior, o list cu nodurile vizitate i un nod curent.
Toate valorile din lista cu distane sunt iniializate cu o valoare infinit, cu excep ia nodului de start, care este setat cu
0.
Toate valorile din lista cu nodurile vizitate sunt setate cu fals.
Toate valorile din lista cu nodurile anterioare sunt iniializate cu -1.
Nodul de start este setat ca nodul curent.
Se marcheaz ca vizitat nodul curent.
Se actualizeaz distanele, pe baza nodurilor care pot fi vizitate imediat din nodul curent.
Se actualizeaz nodul curent la nodul nevizitat care poate fi vizitat prin calea cea mai scurt de la nodul de start.

Se repet (de la punctul 6) pn cnd toate nodurile sunt vizitate.