Documente Academic
Documente Profesional
Documente Cultură
1. Ce este un algoritm?................................................................................................................................1
2. Ce este o instanţă a unei probleme?.......................................................................................................1
3. Ce este pseudocodul?..............................................................................................................................1
4. Ce înseamnă studierea eficienţei unui algoritm?.....................................................................................1
5. Cum se defineşte operaţia de sortare?....................................................................................................2
6. Când spunem despre o metodă de sortare că este stabilă şi când spunem că ea este “in situ”?............2
7. Prezentaţi principiul şi pseudocodul algoritmului de sortare prin inserţie..............................................2
8. Care sunt principiile şi în ce condiţii se poate aplica metoda Divide and Conquer?................................3
9. Prezentaţi principiul şi pseudocodul algoritmului de sortare prin interclasare.......................................3
10. Ce este un heap şi ce proprietăţi îndeplinesc elementele lui?...............................................................5
11. Prezentaţi şi explicaţi algoritmul de transformare a unui şir de intrare într-un heap şi algoritmul de
creare a unui heap.......................................................................................................................................5
12. Prezentaţi şi explicaţi algoritmul de sortare utilizând un heap..............................................................6
13. Prezentaţi principiul şi algoritmul sortării rapide...................................................................................7
14. Prezentaţi şi explicaţi algoritmul de partiţionare a unui şir în cazul sortării rapide (ambele variante,
inclusiv cel cu alegerea aleatoare a elementului pivot)...............................................................................8
15. Ce sunt tehnicile de programare?..........................................................................................................9
16. Principiile programării dinamice............................................................................................................9
17. Prezentaţi şi explicaţi algoritmul recursiv al tăierii barei de oţel.........................................................10
18. Prezentaţi şi explicaţi algoritmul tăierii barei de oţel utilizând metoda top-down din programarea
dinamică....................................................................................................................................................11
19. Prezentaţi şi explicaţi algoritmul tăierii barei de oţel utilizând metoda bottom-up din programarea
dinamică cu memorarea mărimilor bucăţilor ce vor fi tăiate....................................................................11
20. Prezentaţi şi explicaţi algoritmul bottom-up de determinare a costurilor înmulţirii unui şir de matrici.
.................................................................................................................................................................. 12
21. Prezentaţi şi explicaţi algoritmul recursiv de afişare a parantezării optime pentru un produs de n
matrici.......................................................................................................................................................13
22. Principiile metodei greedy...................................................................................................................13
23. Prezentaţi cum se utilizează metoda greedy în cazul problemei selecţiei activităţilor........................14
24. Prezentaţi şi explicaţi algoritmul recursiv greedy de selecţie a activităţilor........................................14
25. Prezentaţi şi explicaţi varianta greedy iterativă a algoritmului de selecţie a activităţilor....................15
26. Care sunt paşii pe care îi vom utiliza într-o strategie greedy?.............................................................15
27. Principiile şi algoritmul metodei backtracking.....................................................................................16
28. Prezentaţi şi explicaţi algoritmul nerecursiv de rezolvare a problemei damelor.................................18
1
29. Ce este un tip de date şi ce este un tip abstract de date (ADT Abstract Data Type)?..........................19
30. Ce este o listă, cum se poate implementa o listă şi ce avantaje şi dezavantaje are fiecare modalitate
de implementare?.....................................................................................................................................19
31. Prezentaţi şi explicaţi algoritmii de căutare, inserare în capul listei şi stergere într-o listă înlănţuită. 20
32. Prezentaţi şi explicaţi algoritmul de căutare respectiv inserare într-o listă dublu înlănţuită circulară cu
santinelă....................................................................................................................................................21
33. Ce este o stivă şi care sunt procedurile de depunere şi extragere dintr-o stivă?.................................22
34. Ce este o coadă şi care sunt procedurile de depunere şi extragere dintr-o coadă?............................23
35. Ce este o tabelă direct adresabilă şi care sunt operaţiile într-o tabelă direct adresabilă?..................24
36. Ce este o tabelă de dispersie, ce este o funcţie de dispersie, ce sunt şi cum se rezolvă coliziunile?...25
37. Prezentaţi şi explicaţi procedurile de inserare şi căutare într-o tabelă de dispersie............................26
38. Ce este un arbore binar de căutare?...................................................................................................27
39. Prezentaţi modalitătile de traversare a unui arbore binar şi algoritmii pentru fiecare din această
modalitate.................................................................................................................................................27
40. Prezentaţi şi explicaţi algoritmii iterativ respectiv recursiv de căutare într-un arbore binar de căutare.
.................................................................................................................................................................. 28
41. Prezentaţi şi explicaţi algoritmii de căutare a minimului, a maximului şi a succesorului într-un arbore
binar de căutare........................................................................................................................................29
42. Prezentaţi şi explicaţi algoritmul de inserare într-un arbore binar de căutare....................................30
43. Prezentaţi şi explicaţi algoritmul de ştergere într-un arbore binar de căutare....................................31
44. Ce este un arbore roşu şi negru şi ce proprietăţi are?.........................................................................32
45. Prezentaţi şi explicaţi algoritmul de rotaţie la stânga într-un arbore binar de căutare.......................32
46. Prezentaţi şi explicaţi algoritmul de inserare într-un arbore roşu şi negru..........................................33
47. Prezentaţi şi explicaţi algoritmul de restaurare a proprietăţilor unui arbore roşu şi negru după
inserarea unui nod.....................................................................................................................................33
48. Prezentaţi şi explicaţi algoritmul de restaurare a proprietăţilor unui arbore roşu şi negru după
ştergerea unui nod....................................................................................................................................34
49. Ce este un graf şi care sunt cele două moduri de a reprezenta un graf?.............................................34
50. Prezentaţi şi explicaţi algoritmul de parcurgere în lăţime pentru un graf reprezentat cu liste de
adiacenţă...................................................................................................................................................35
51. Ce este drumul de lungime minimă şi care este algoritmul de afişare a drumurilor de lungime
minimă?.....................................................................................................................................................37
52. Prezentaţi şi explicaţi algoritmul de parcurgere în adâncime pentru un graf reprezentat cu liste de
adiacenţă...................................................................................................................................................37
53. Ce este o sortare topologică şi care este algoritmul simplu de sortare topologică?............................38
54. Ce este o componentă tare conexă şi care este algoritmul de determinare a componentelor tare
conexe dintr-un graf orientat?..................................................................................................................39
2
55. Ce este un arbore de acoperire minim şi care este algoritmul generic de determinare a unui arbore
de acoperire minim?..................................................................................................................................39
56. Prezentaţi şi explicaţi algoritmul lui Kruskal de determinare a unui arbore de acoperire minim........40
57. Prezentaţi şi explicaţi algoritmul lui Prim de determinare a unui arbore de acoperire minim............41
58. Ce este un drum minim într-un graf şi care sunt variantele problemei drumului minim?...................42
59. Ce este relaxarea şi care este procedura de relaxare a unei muchii (u,v) într-un graf cu costuri........43
60. Prezentaţi şi explicaţi algoritmul Bellman-Ford de rezolvare a problemei drumurilor minime cu sursă
unică în cazul general al unui graf care poate avea şi costuri negative.....................................................43
61. Prezentaţi şi explicaţi algoritmul de căutare a drumurilor minime într-un graf orientat acyclic.........44
62. Prezentaţi şi explicaţi algoritmul lui Dijkstra de determinare a drumurilor de lungime minimă.........44
1. Ce este un algoritm?
Un algoritm este o procedură de calcul bine definită care primeşte o valoare sau o
mulţime de valori ca date de intrare şi produce o valoare sau mulţime de valori ca
date de ieşire. Este deci un şir de paşi care transformă datele de intrare în date de
ieşire.
Putem lua ca exemplu definirea problemei de sortare a unui şir de numere. Datele
de intrare (inputul) îl reprezintă o secvenţă de n numere (a1, a2, … an).
Datele de ieşire (outputul) îl reprezintă o permutare (sau o reordonare) (a1’, a2’,…
an’) a secvenţei de numere furnizată la intrare astfel încât a1’< a2’< …<an’.
Un algoritm de sortare, pentru o anumită secvenţă de numere (reprezentând
inputul) 31, 41, 59, 26 va produce la ieşire drept output secvenţa 26, 31, 41, 59.
3. Ce este pseudocodul?
Pseudocodul este o modalitate de a descrie algoritmi; este similar cu schemele
logice. Un algoritm descris în pseudocod poate apoi să fie implementat în orice
limbaj de programare (C, Pascal etc).
3
4. Ce înseamnă studierea eficienţei unui algoritm?
Eficiența unui algoritm se referă la resursele de calcul și memorie necesare
pentru execuția algoritmului. Practic este un studiu teoretic al performanţei (în
primul rând) şi al resurselor utilizate. Progresele tehnologice din ultima perioadă
fac ca importanţa mărimii memoriei solicitate de un algoritm să scadă ca
importanţă. Ceea ce trebuie să intereseze programatorul este reducerea timpului de
execuţie al programului. Există aplicaţii “real time” la care constrângerile de timp
sunt cruciale.
4
Plasarea numărului în șir la poziția corespunzătoare se face prin comparare
succesivă de la stânga la dreapta sau invers
Pseudocodul aferent sortării prin inserţie este prezentat în figura 1
5
9. Prezentaţi principiul şi pseudocodul algoritmului de sortare prin
interclasare.
Sortarea prin interclasare se bazează pe următorul principiu: pentru a sorta un
vector cu n elemente, îl împărţim în 2 vectori, care, odată sortaţi, se interclasează.
Conform strategiei Divide and Conquer, descompunerea unui vector în alţi doi
vectori care urmează a fi sortaţi are loc până când avem de sortat vectori de un
element.
Sortarea prin interclasare are deci 3 paşi:
6
În figura 2 este prezentat algoritmul procedurii Merge-Sort:
7
Un heap poate fi reprezentat sub forma unui arbore binar sau sub forma unui
vector. Astfel, dacă v este un vector care conţine reprezentarea unui heap avem
următoarea proprietate:
Elementele v[left]..v[n] îndeplinesc condiţia de structură a heapului:
i>left avem: v[i]>v[2*i], dacă 2*in, respectiv
v[i]>v[2*i+1] dacă 2*i+1n.
Evident, pentru valori ale lui i mai mari decât n/2 nu se pune problema îndeplinirii
condiţiilor de mai sus.
8
Vom construi heapul de jos în sus (de la frunze) (care sunt heap-uri de heapsize=1)
(figura 2).
În Quick Sort vom selecta aleator un element din subşirul A[p..r] care va juca rolul
pivotului. La fiecare pas al sortării rapide, înainte de partiţionarea vectorului vom
10
interschimba elementul A[p] cu acest element aleator ales. Practic, această
modificare a algoritmului asigură că elementul pivot x=A[p] să fie cu aceeaşi
probabilitate orice element dintre cele r-p+1 elemente ale vectorului A[p..r].
Rezultatul este că partiţionarea vectorului de intrare va fi în medie, rezonabil de
echilibrată. Modificările în algoritmul deja prezentat sunt minore. Vom avea
implementată schimbarea elementului ce va deveni pivot înainte de apelul propriu
zis al procedurii PARTITION.
Algoritmul de alegere aleatoare a elementului pivot:
11
Divide and Conquer, rezolvă problemele combinând soluţiile unor subprobleme.
Spre deosebire de abordarea din Divide and Conquer, programarea dinamică este
aplicabilă atunci când subproblemele nu sunt independente, adică subproblemele
au în comun sub-subprobleme.
Astfel, un algoritm de tipul Divide and Conquer ar presupune mai multe calcule
decât ar fi necesar dacă s-ar rezolva repetat aceste sub-subprobleme comune.
Programarea dinamică rezolvă fiecare sub-subproblemă o singură dată şi salvează
rezultatul într-o tabelă cu rezultate. Se evită astfel ca o sub-subproblemă să fie
rezolvată de mai multe ori.
Programarea dinamică se aplică la probleme de optimizare, probleme cu
următoarele caracteristici:
Au mai multe soluţii posibile, fiecare caracterizate printr-o valoare
Dorim să identificăm o soluţie cu valoarea cea mai mică/cea mai mare. O
asemenea soluţie se numeşte “o soluţie optimă” a problemei, prin contrast
cu “soluţia optimă” deoarece pot fi mai multe soluţii care realizează soluţia
optimă.
Problema tăierii barei de oţel este o problemă cu structură optimă: soluţia optimă a
acestei probleme incorporează soluţii optime ale subproblemelor. Rezolvarea
problemei se va baza pe o soluţie recursivă. Descompunerea recursivă a problemei
tăierii barei de oţel se va face astfel:
12
Se taie o piesă de lungime i
Bara rămasă de lungime n-i se taie în mod recursive
rn= max1<=i<=n(pi+rn-i)
13
19. Prezentaţi şi explicaţi algoritmul tăierii barei de oţel utilizând
metoda bottom-up din programarea dinamică cu memorarea
mărimilor bucăţilor ce vor fi tăiate
Abordarea bottom-up: sortăm subproblemele în funcţie de ordinul lor de mărime
și le rezolvăm cele mai mici la început.
14
20. Prezentaţi şi explicaţi algoritmul bottom-up de determinare a
costurilor înmulţirii unui şir de matrici.
Se dă un şir (o secvenţă A1, A2,… An) de n matrici care trebuie înmulţite,
dorindu-se calcularea produsului A1A2 …An
Pentru a calcula AiAi+1..Aj (vom nota acest produs cu Ai..j) va trebui să găsim un
k optim astfel încât să punem o paranteză între Ak şi Ak+1. În consecinţă:
Costul lui Ai..j este egal cu costul lui Ai..k plus costul lui Ak+1..j plus costul
înmulţirii acestor două matrici
Dacă costurile lui Ai..k şi Ak+1..j sunt optime, atunci şi costul lui Ai..j este
optim.
15
21. Prezentaţi şi explicaţi algoritmul recursiv de afişare a
parantezării optime pentru un produs de n matrici.
Algoritmul recursiv prezentat în figura urmatoare ne oferă afişarea parantezării
optime a produsului (AiAi+1…Aj) pe baza tabelului s calculate de procedura
MATRIX-CHAIN-ORDER şi a indicilor i şi j. Apelul initial PRINT-OPTIMAL-
PARENS(s,1,n) ne oferă parantezarea optima pentru produsul (A1A2..An).
17
25. Prezentaţi şi explicaţi varianta greedy iterativă a algoritmului de
selecţie a activităţilor.
Procedura GREEDY-ACTIVITY-SELECTOR este o versiune iterativă a
procedurii RECURSIVE-ACTIVITY-SELECTOR. Şi ea presupune că pornim de
la un şir de activităţi sortat ascendent după timpul de finalizare a activităţilor.
Procedura prezentată în figura urmatoare colectează activităţile selectate într-o
mulţime A şi o returnează când această activitate este finalizată:
26. Care sunt paşii pe care îi vom utiliza într-o strategie greedy?
???
Proprietatea alegerii greedy poate fi enunţată astfel: alegem alternativa care apare
ca şi cea mai promiţătoare la problema curentă, fără a rezolva subproblemele. De
fapt, aceasta diferenţiază tehnica greedy de programarea dinamică prin faptul că
aceasta din urmă rezolvă subproblemele (câte o singură dată) pentru a putea decide
care este cea mai bună alegere. Utilizând greedy, facem alegerea care ni se pare
cea mai bună la un anumit moment, după care rezolvăm subproblema rămasă.
Intuitiv, alegerea greedy este acea activitate care lasă resursele disponibile pentru
cât de multe activităţi disponibile, deci vom alege activitatea cu cel mai devreme
moment de terminare (dacă mai mult de o activitate din S are cel mai devreme
moment de terminare atunci vom putea alege oricare din aceste activităţi). Altfel
spus, dacă activităţile sunt sortate în ordinea crescătoare a timpului de terminare,
atunci alegerea greedy este activitatea a1.
Făcând o alegere greedy, ne rămâne o singură subproblemă de rezolvat: găsirea
activităţilor care pornesc după ce a1 s-a terminat. De ce nu putem considera
activităţile care se termină înainte ca a1 să înceapă? Deoarece avem s1<f1 şi f1
este cel mai devreme moment de terminare al oricărei activităţi şi deci nici o
18
activitate nu poate avea timp de terminare mai mic sau egal decât s1. Deci toate
activităţile compatibile cu a1 trebuie să înceapă după ce a1 se termină.
Condiţia structurii optimale ne spune că dacă alegerea greedy este optimală atunci
şi rezultatul optim al problemei se compune din alegerea greedy şi rezultatul
optimal al subproblemei rămase.
Principii
În practică se întâlnesc un număr mare de probleme care au un număr mare de
variante ce se pot încerca, dar doar o parte din ele îndeplinesc condiţiile specific
problemei.
19
Toate drumurile de la rădăcină la frunze formează spaţiul stărilor. O soluţie a
problemeireprezintă acele stări pentru care există drum de la rădăcină la un nod
etichetat cu un nuplu.
Pot exista arbori statici (în cazul în care arborele astfel construit nu depinde de
instanţa problemei) şi arbori dinamici (în cazul în care alegerea valorii vi depinde
de una sau mai multe valori din mulţimea {v1, v2, …vi-1})
20
28. Prezentaţi şi explicaţi algoritmul nerecursiv de rezolvare a
problemei damelor.
Problema reginelor (sau a damelor) are următorul enunţ: Să se afişeze toate
posibilităţile de a aşeza pe o tablă de şah de dimensiune nxn, n dame astfel încât
oricare 2 din acestea să nu se atace reciproc. Două dame se atacă una pe cealaltă
dacă sunt aşezate pe aceeaşi linie sau pe aceeaşi coloană sau pe aceeaşi diagonală
(principală sau secundară).
Vom considera xi linia pe care vom aşeza dama de pe coloana i. Printr-o astfel de
reprezentare ne asigurăm că nu vom aşeza două dame pe aceeaşi coloană. Atunci,
pentru o soluţie parţială Sk={x1, x2, … xk} condiţiile de continuare includ:
xi≠xj oricare ar fi j=1,..k –{i} (sau altfel spus 1<=i≠j<=k) (prin acesta
verificăm că nu am aşezat dama k pe o linie pe care să se găsească deja o
altă damă)
21
Tipurile de date reprezintă tipul de informație care poate fi stocat într-o variabilă.
Un tip de data definește atât gama de valori pe care o poate lua o variabilă de un
anume tip cât și operațiile care se pot efectua asupra ei.Exemplu: char, int, etc
Un tip abstract de date (Abstract Data Type ADT) este un tip de date necesar
unui analist, dar care este posibil să nu existe în limbajul de programare ceea ce
impune necesitatea implementării lui.
23
Algoritmul de stergere:
Pentru a şterge un element dintr-o listă avem nevoie de un pointer către acesta.
Dacă nu avem acest pointer, atunci va trebui găsit prin LIST-SEARCH.
24
33. Ce este o stivă şi care sunt procedurile de depunere şi extragere
dintr-o stivă?
Stiva este o structură de tip LIFO (Last In First Out) –elementul ce ar urma să fie
şters este ultimul element adăugat într-o astfel de structură. Există două modalităţi
de a implementa o stivă: folosind un şir (un array) sau folosind o structură
înlănţuită cu pointeri.
Operaţia de inserare într-o stivă este cel mai adesea denumită PUSH iar operaţia
de extragere este denumită POP. Şirul are un atribut S.top care indexează ultimul
element adăugat în stivă. Stiva conţine elementele S[1..S.top], unde S[1] este
elementul de la baza stivei iar S[S.top] este elementul din vârf. Când S.top=0 stiva
nu conţine nici un element şi este deci goală.
25
34. Ce este o coadă şi care sunt procedurile de depunere şi extragere
dintr-o coadă?
Coada este o structură de tip FIFO (First In First Out). Într-o elementul care va fi
şters este întotdeauna cel mai vechi element adăugat în coadă. Operaţia de
adăugare a unui element într-o coadă se numeşte ENQUEUE iar operaţia de
extragere a unui element dintr-o coadă se numeşte DEQUEUE. La fel ca operaţia
POP de extragere a unui element dintr-o stivă, şi operaţia DEQUEUE de extragere
a unui element dintr-coadă nu primeşte nici un argument.
26
35. Ce este o tabelă direct adresabilă şi care sunt operaţiile într-o
tabelă direct adresabilă?
Adresarea directă este o tehnică care funcţionează bine dacă universul U al cheilor
este rezonabil de mic. Presupunem că o aplicaţie necesită elemente dintr-un
dicţionar în care fiecare element are o cheie asociată din mulţimea U={0,1,…m-1}.
Vom presupune că nu există două elemente cu aceeaşi cheie. Pentru reprezentarea
mulţimii dinamice se foloseşte un şir (o tabelă direct adresabilă) T[0..m-1] în care
fiecare poziţie (sau slot) corespunde unei chei din U.
Exemplu:
27
Fiecare element din universul U={0,1,…9} corespunde unui index în tabela direct
adresabilă T. Mulţimea
K={2,3,5,8} a elementelor mulţimii determină sloturi în tabelă care conţin pointeri
către elemente. Slotul k pointează spre un element din mulţime având cheia k.
Dacă mulţimea K nu conţine un element cu cheia k, atunci valoarea din tabela T
este T[k]=NIL.
Exemplu:
28
Cheile k2 şi k5 ocupă acelaşi slot –în acest caz spunem că cele 2 valori intră în
coliziune. Există tehnici de rezolvare a conflictelor create de coliziuni.
Cea mai folosită tehnică de rezolvare a coliziunilor este cea prin înlănţuire.
Toate elementele care au acelaşi cod hash vor fi plasate în aceeaşi listă înlănţuită.
Slotul j conține un pointer către lista care salvează elementele care au j ca şi
valoare hash. Dacă nici un element nu are valoare de hash pe j, atunci T[j] = NIL.
Exemplu:
29
38. Ce este un arbore binar de căutare?
Un arbore binar de căutare se poate reprezenta ca o structură înlănţuită în care
fiecare nod este un obiect. Fiecare nod al arborelui conţine cheia, date auxiliare şi 3
referinţe: left care pointează spre nodul copil stânga, right care pointează spre
nodul copil dreapta şi p care pointează spre nodul rădăcină. Dacă un copil lipseşte
atunci referinţa spre acel copil va fi NIL.
30
40. Prezentaţi şi explicaţi algoritmii iterativ respectiv recursiv de
căutare într-un arbore binar de căutare.
31
41. Prezentaţi şi explicaţi algoritmii de căutare a minimului, a
maximului şi a succesorului într-un arbore binar de căutare.
Într-un arbore binar de căutare, întotdeauna vom putea găsi elementul minim
folosind un pointer care porneşte de la rădăcină şi urmează întotdeauna copilul din
stânga.
32
42. Prezentaţi şi explicaţi algoritmul de inserare într-un arbore
binar de căutare.
Inserarea unui element va trebui să menţină proprietatea de bază a unui arbore
binar de căutare.
Procedura TREE-INSERT din figura de mai jos primeşte ca şi parametru un nod z
pentru care z.key=v (unde v este valoarea care urmează să fie inserată), z.left=NIL
şi z.right=NIL.
33
43. Prezentaţi şi explicaţi algoritmul de ştergere într-un arbore
binar de căutare.
In cadrul operaţiei de ştergere a unui nod într-un arbore binar de căutare vom avea
nevoie de un algoritm care înlocuieşte un subarbore cu un alt subarbore.
Procedura TRANSPLANT din figura 1 înlocuieşte un subarbore ca şi copil al
părintelui său cu un alt subarbore. Procedura înlocuieşte subarborele având ca
rădăcină nodul pointat de u cu subarborele pointat de v. Astfel, părintele nodului u
va deveni părintele nodului v.
34
44. Ce este un arbore roşu şi negru şi ce proprietăţi are?
Un arbore roșu-şi-negru este un arbore binar de căutare la care fiecare nod are bit
suplimentar, reprezentând culoarea: roșu sau negru. Fiecare nod de arbore conține
următoarele campuri: cheia, culoarea, nodul stâng, nodul drept și părintele.
Un arbore roșu şi negru este un arbore binar de căutare cu următoarele proprietăţi:
1. Fiecare nod este sau roșu sau negru
2. Rădăcina este negru
3. Fiecare frunză (NIL) este neagră
4. Dacă un nod este roșu, atunci amândoi copii sunt negrii
5. Pentru fiecare nod, toate căile simple de la nodul respectiv la frunzele
descendentemconțin același număr de noduri negre
35
46. Prezentaţi şi explicaţi algoritmul de inserare într-un arbore roşu
şi negru.
Procedura de inserare va insera în arborele roşu şi negru T nodul z (cu cheia deja
încărcată în acest nou nod):
36
48. Prezentaţi şi explicaţi algoritmul de restaurare a proprietăţilor
unui arbore roşu şi negru după ştergerea unui nod.
Procedura de înlocuire a unui arbore cu un alt subarbore pentru un arbore roşu şi
negru:
38
alb (adică sunt nedescoperite), devin mai târziu gri şi apoi negre. Nodurile gri şi
negru sunt noduri care au fost descoperite. Dacă avem arcul (u,v)ϵE şi u este nod
negru, atunci v va fi negru sau gri (toate nodurile adiacente unui nod negru au fost
descoperite).
Algoritmul produce un “arbore de lăţime” având ca rădăcină nodul s, care conţine
toate aceste vârfuri conectate la s. Pentru fiecare vârf v accesibil din s, calea din
“arborele de lăţime” de la s la v corespunde celui mai scurt drum de la s la v în G,
adică un drum care conţine un număr minim de muchii. De fiecare dată când
căutarea descoperă un nod alb v în cursul scanării listei de adiacenţă al unui nod
deja descoperit u, nodul v şi arcul (u,v) este adăugat în acest arbore. Vom spune că
u este predecesorul sau părintele lui v în arborele de lăţime.
41
54. Ce este o componentă tare conexă şi care este algoritmul de
determinare a componentelor tare conexe dintr-un graf orientat?
O componentă tare conexă a unui graf orientat G=(V,E) este o mulţime maximală
de vârfuri U V, astfel încât, pentru fiecare pereche de vârfuri u şi v din U există un
drum de la u la v precum şi de la v la u. Altfel spus, între oricare două noduri din
componentă există cel puţin un drum şi nu mai există nici un nod în afara
componentei legat printr-un drum de un nod al componentei.
42
56. Prezentaţi şi explicaţi algoritmul lui Kruskal de determinare a
unui arbore de acoperire minim.
Algoritmul lui Kruskal de determinare a unui arbore de acoperire minim se
bazează pe algoritmul generic.
Algoritmul găseşte o muchie sigură (u,v) dintre toate muchiile care conectează 2
arbori în pădurea de arbori pentru a o adăuga la pădurea dezvoltată. Muchia sigură
(u,v) este muchia cu costul minim care uneşte doi arbori din pădurea respectivă.
Algoritmul lui Kruskal, prezentat în figura urmatoare foloseşte o structură de date
pentru mulţimi disjuncte pentru a reprezenta mai multe mulţimi de elemente
disjuncte. Fiecare mulţime conţine vârfurile unui arbore din pădurea curentă.
Funcţia FIND-SET(u) returnează un element reprezentativ din mulţimea care îl
conţine pe u. Astfel, putem determina dacă două vârfuri u şi v aparţin aceluiaşi
arbore testând dacă FIND-SET(u) este egal cu FINDSET( v). Combinarea arborilor
este realizată de procedura UNION.
43
57. Prezentaţi şi explicaţi algoritmul lui Prim de determinare a unui
arbore de acoperire minim.
Algoritmul lui Prim este un caz particular al algoritmului generic pentru
determinarea unui arbore de acoperire minim pentru un graf conex. Algoritmul lui
Prim are proprietatea că muchiile din mulţimea A formează întotdeauna un singur
arbore. Arborele se formează pornind de la un vârf arbitrar r şi creşte până acoperă
toate vârfurile din V. La fiecare pas, se adaugă arborelui o muchie uşoară care
uneşte mulţimea A cu un vârf izolat din GA=(V,A). La fel ca algoritmul lui
Kruskal, algoritmul lui Prim foloseşte o tehnică gredy deoarece arborelui ii este
adăugată la fiecare pas o muchie care adaugă cel mai mic cost la costul total al
arborelui. În procedura MST-PRIM din figura urmatoare graful G, rădăcina r a
arborelui minim de acoperire care urmează să fie dezvoltat şi costurile w sunt
parametri de intrare. În timpul execuţiei, toate vârfurile care nu sunt în arbore sunt
într-o coadă de prioritate Q bazată pe un câmp cheie. Pentru fiecare vârf v,
atributul v.key este costul minim al oricărei muchii care uneşte pe v cu un vârf din
arbore.
44
58. Ce este un drum minim într-un graf şi care sunt variantele
problemei drumului minim?
Problema drumului minim apare deseori în practică. Un exemplu ar fi găsirea
drumului cel mai scurt dintre 2 oraşe.
Fiind dat un graf orientat cu costuri G=(V,E) şi având funcţia de cost w:E->R care
asociază fiecărei muchii câte un cost exprimat printr-un număr real. Costul w(p) al
unei căi p={v0, v1, … vk} este suma costurilor de pe calea p :
45
59. Ce este relaxarea şi care este procedura de relaxare a unei
muchii (u,v) într-un graf cu costuri
Termenul de relaxare semnifică de fapt o operaţie care determină decrementarea
unei margini superioare. În procesul de relaxare a unei muchii (u,v) se verifică
dacă drumul minim până la vârful v (determinat până în acel moment) poate fi
îmbunătăţit pe baza unui drum care să treacă prin u, şi dacă da, atunci se
reactualizează v.d şi v.π. Practic, un pas de relaxare poate determina descreşterea
valorii v.d reprezentând valoarea drumului minim de la s la v şi reactualizarea
câmpului v.π care conţine predecesorul vârfului v. Procedura RELAX:
46
61. Prezentaţi şi explicaţi algoritmul de căutare a drumurilor
minime într-un graf orientat acyclic.
Algoritmul începe prin sortarea topologică a grafului pentu impunerea unei ordini
liniare a vârfurilor. Dacă există un drum de la u la v atunci u precede v în ordinea
topologică. Algoritmul efectuează o singură trecere peste vârfurile sortate
topologic şi pe măsură ce fiecare vârf este procesat, sunt relaxate toate muchiile
care pornesc din acel vârf.
47
62. Prezentaţi şi explicaţi algoritmul lui Dijkstra de determinare a
drumurilor de lungime minimă.
Algoritmul lui Dijkstra rezolvă problema drumurilor de lungime minimă cu sursă
unică într-un graf orientat G=(V,E) cu costuri nenegative. Deci în acdrul acestui
algoritm vom avea w(u,v)>=0 pentru orice arc (u,v)ϵE.
Algoritmul lui Dijkstra gestionează o mulţime S de noduri pentru a cărui elemente
algoritmul a calculat deja costurile finale ale drumurilor minime de la sursa s.
Algoritmul selectează câte un vârf u din mulţimea V-S pentru care estimarea
drumului minim este minimă, introduce acest vârf u în mulţimea S şi relaxează
arcele divergente din din vârful u.
48