Documente Academic
Documente Profesional
Documente Cultură
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
Initializare: Vnou = {x}, unde x este un nod arbitrar (punct de plecare) din V, E nou= {}
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)
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
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:
( 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
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