Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Metoda divide et impera imparte problema in subprobleme disjuncte care sunt rezolvate recursiv, iar
apoi solutiile acestora sunt combinate pentru a rezulta solutia problemei initiale. In contrast,
programarea dinamica imparte problema in subprobleme care au parti comune, fiecare fiind
rezolvata o singura data, solutia fiind salvata intr-o tabela cu solutii. Solutiile optime pot fi multiple.
Metoda Greedy face alegerea care pare a fi optima la momentul respectiv, rezultand astfel un optim
local, ales in speranta ca acesta va conduce la un optim global.
2.Prezentati si explicati doua operatii posibile de efectuat pe arbori binari de cautare care
pastreaza proprietatile arborelui si in acelasi timp contribuie la echilibrarea acestora
LEFT-ROTATE(T, x)
Y=x.right
x.right=y.left
if y.left=/=T.nil
y.left.p=x
y.p=x.p
if x.p==T.nil
T.root=y
Else if x==x.p.left
x.p..left=y
else x.p.right=y
y.left=x
x.p=y
*Rotatia spre dreapta pe un nod y-presupunem ca fiul stang al acestuia,y, este != NULL
-rotatia pivoteaza in jurul legaturii de la y la x,transforma pe x in radacina a subarborelui,
pe y in fiu drept a lui x si pe fiul drept a lui x in fiu stang a lui y ; -daca executam arbore-insereaza si
arbore sterge,se modifica arborele si se poate incalca prop rosu negru ; este o operatie locala intr-un
arobore
de cautare ce conserva ordonarea cheilor -executie O(1),se modifica numai pointerii prin rotatie
RIGHT-ROTATE(T,x)
y=x.left
x.left = y.right
if y.right != NULL
y.right.p=x
y.p = x.p
if x.p == NULL
T.root=y
else if x == x.p.left
x.p.left = y
else x.p.right = x
y.right = x
x.p = y
3.Realizati o paralela intre algoritmul lui Dijkstra pe un graf echipat cu o functie de cost ne-negativa
si una din parcurgerile posibile alea grafului
-in Prim multimea A formeaza un singur arbore, muchia sigura este intotdeauna, o muchie de cost
minim
-ambele folosesc o strtegie greedy, deoarece arborelui ii este adaugata la fiecare pas o muchie care
adauga cel mai
7.Definiti in mod formal problema drumurilor de cale minima in grafe,prezentati ideea unui
acest algoritm generic se particularizeaza intr-unul din algoritmii Bellman-Ford sau Dijkstra
Costul minim al drumului dintre doua noduri este minimul dintre costurile drumurilor existente intre
cele doua noduri. Deși, in cele mai multe cazuri, costul este o funcție cu valori nenegative, exista
situații in care un graf cu muchii de cost negativ are relevanta practica. O parte din algoritmi pot
determina drumul corect de cost minim inclusiv pe astfel de grafuri. Totuși, nu are sens căutarea
drumului minim in cazurile in care graful conține cicluri de cost negativ – un drum minim ar avea
lungimea infinita, intricat costul sau s-ar reduce la fiecare reparcurgere a ciclului.
Relaxarea unei muchii v1 - v2 consta in a testa daca se poate reduce costul ei, trecând printr-un nod
intermediar u. Fie w12 costul inițial al muchiei de la v1 la v2, w1u costul muchiei de la v1 la u, si wu2
costul muchiei de la u la v2. Daca w > w1u + wu2, muchia directa este înlocuita cu succesiunea de
muchii v1 - u, u - v2.
Dijkstra poate fi folosit doar in grafuri care au toate muchiile nenegative.Algoritmul este de tip
Greedy: optimul local căutat este reprezentat de costul drumului dintre nodul sursa s si un nod v.
Pentru fiecare nod se retine un cost estimat d[v], inițializat la început cu costul muchiei s → v, sau cu
+∞, daca nu exista muchie.
divide-et-impera.
Metoda de sortare quicksort este o forma de aplicare a metodei de programare divide et impera
deoarece imparte sirul care trebuie sortat in 2 subsiruri, urmand apoi ca acestea sa fie sortate
recursiv, iar apoi sa fie combinate formand sirul initial sortat.
Quicksort(a, p, r)
If p<r
Q=partition(a, p, r)
quicksort(a, p, q-1)
quicksort(a, q-1, r)
Partition(a, p, r)
x=a[r]
i=p-1
for j=p to r-1
if a[j] <= x
i=i+1
exchange a[i] with a[j]
exchange a[i+1] with a[r]
return i+1
9.Explicati diferenta dintre un sir de numere si un dictionar.Prezentati o modalitate
prin care se poate implementa un dictionar
14.Greedy
Greedy face intodeauna alegerea care pare cea mai buna in fiecare moment, in speranta ca aceasta
va conduce la solutia optima. Greedy nu conduce, induce la alegerea optimala.
Strategii greedy
1. Determinăm structura optimală a problemei
2. Dezvoltăm o soluție recursivă pe baza soluției optimale
3. Arătăm că dacă se efectuează o alegere greedy, rămâne doar o subproblemă
4. Arătăm că alegerea greedy este sigură
5. Dezvoltăm un algoritm recursiv pentru rezolvarea problemei greedy
6. Convertim algoritmul recursiv intr-unul iterativ
Proprietatea alegerii greedy: alegem alternativa care apare ca si cea mai promitătoare la problema
curentă, fără a rezolva subproblemele.
15.Backtracking
Brute force search: se caută in setul tuturor solutiilor posibile
Backtracking: reprezintă o reformulare a căutării de tip brute force
1. Presupunem că o solutie este formată din vectorul S={𝑣_1,𝑣_2,…,𝑣_𝑚 }. Prin backtracking vom
traversa în adâncime domeniile vectorilor 𝑣_𝑖 până când identificăm o solutie
2. Pornim de la solutia vidă 𝑆=∅
3. La pasul pasul 𝑖 introducem în soluție o un element din spațiul 𝑆_𝑖 de elemente posibile pentru 𝑣_𝑖
4. Dacă un vector construit partial{𝑣_1,𝑣_2,…,𝑣_𝑖 } nu poate conduce la o soluție, atunci revenim și
realizăm următoarea alegere posibilă pentru 𝑣_𝑖∈𝑆_𝑖
5. Dacă toate elementele din 𝑆_𝑖 s-au epuizat, atunci se revine la 𝑆_(𝑖−1)
Esentiale sunt conditiile de continuare Φ care ne spun dacă un vector parțial {𝑣_1,𝑣_2,…,𝑣_𝑖 } poate
conduce la o solutie
16.Arbore rosu negru
Arbore roșu-si-negru: 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
Proprietăți arbore roșu-negru:
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 descendente conțin același
număr de noduri negre
17.Ciclu hamiltonian
Ciclul Hamiltonian-Având un graf orientat G=(V,E) ;este un ciclu simplu care conţine toate nodurile
din G ; Dacă G conţine un c. Hamiltonian atunci G este graf Hamiltonian . Nu există noduri cu gradul ;
Dacă un nod are gradul 2 atunci ambele muchii incidente lui trebuie să fie într-un circuit Hamiltonian;
Graful trebuie să conţină un subgraf H cu prop:
H să conţină toate nodurile grafului;
H să fie conex ;
H are număr de noduri egal cu numărul de muchii.
Toate nodurile din H au gradul 2 ;
Fie G un graf conex cu cel puţin 3 noduri; Dacă fiecare nod din G este adiacent cu cel puţin jum
din nr nodurilor rămase în G, atunci graful conţine un ciclu Hamiltonian. (Teorema lui Dirac)
LIST-INSERT(L, x)
x.next = L.nil.next
L.nil.next.prev=x
L.nil.next=x
x.prev=L.nil
20.Graf repr prin matr de adiacenta ->Algoritm care sa identifice comp tare-conexe ale grafului
21.Programare dinamica
Daca la fiecare executie asupra acelorasi intrari se produc aceleasi iesiri indiferent de modul in care
instructiunile sunt programate pe calculatorul multicore = deterministic.
Daca comportamentul algoritmului poate sa difere de la o executie la alta = nedeterministic
Determinancy race = atunci cand doua instructuri logic paralele acceseaza aceeasi locatie de
memorie, si una din
instructiuni realizeaza o operatie de write.
Pentru a nu avea problema competitiei intre secventele paralele, presupunem ca acestea sunt
independente: nu au
race determinancy intre ele.
RACE-EXAMPLE()
1. x = 0
2. Parallel for i = 0 to 2 (creare 2 fire paralele) ;
3. x = x + 1 (fiecare fir incrementeaza x) ;
4. Print x
24.Procedura care gaseste predecesorul unui el intr-un arbore binar de cautare
tree-predecessor(x)
if x.left != NULL then
return TREE-MAXIMUL(x.left)
y=x.p
while y!= NULL and x = y.left do
x=y
y=y.p
return y
*tree-successor(x)
if x.right != NULL then
return Tree-Minimum(x.right)
y=x.p
while y!=NULL and x=y.right do
x=y
y<-y.p
return y
25. Complexitate
*Complexitatea algoritmilor repr puterea de calcul necesara impl unui algoritm.Ea are două comp
principale, și anume comp în timp și cea în spațiu.Compl în spațiu se referă la vol de memorie
necesar calculelor,iar cea în timp se referă la timpul necesar efectuării calculelor.Este utila pentru a
compara
2 alg din pct de vedere al eficientei.Tot timpul v-om alege alg mai eficient,cel care se executa in cel
mai scurt timp si cel care se foloseste de cea mai putina memorie. Ordinul de complexitate il repr
timpul de executie. O(n) algoritm liniar,O(n la m) polinomial, O(k la n) alg exponenential ;
O(log n)-algoritmic, O(nlogn) algoritm liniar logaritmic . Pot determina complexitatea unui alg
pe mai multe cazuri:cazul defavorabil,cel mai bun, fiecare caz si cazul mediu.
26.Prezentati conceptul de sortare topologica si furnizati un alg care sa realizeze aceasta sortare
31.Pentru un graf repr prin matrice de adiacenta furnizati un alg care sa parcurga nodurile grafului
in latime
37.Ce este un heap si ce prop indeplinesc el lui? Ce este un arbore binar de cautare?
Un heap este un sir de obiecte care pot fi văzute ca și un arbore binar aproape complet.Ultimul rand
al arborelui se completează
de la stânga la dreapta.Un sir A care reprezintă un heap are 2 atribute: A.length: Lungimea heapului –
ne furnizează nr de elemente din sir
A.heap-size: ne spune câte elemente din heap sunt stocate in sirul A. Pentru un nod i avem:
PARENT(i) = i/2 - imparțire intreagă ;
LEFT(i) = 2i ;
RIGHT(i) = 2i+1
*HEAPSORT(A)
BUILD-MAX-HEAP(A)
for i <- length[A] downto 2;
do
exchange A[1] cu A[1];
heap-size[A] <- heap-size[A] -1;
MAX-HEAPIFY(A,1)
*BUILD-MAX-HEAP(A) heap-size[A] <- length[A]; for i <- [length[A]/2] downto 1; do MAX-HEAPIFY
(A,i);
*MAX-HEAPiFY(A,i) l <- LEFT(i) ; r <- RIGHT(i); if l <= heap-size[A] and A[l] > A[i]; then largest <- l else
largest <- i;
if r <= heap-size[A] and A[r] > A[largest] then largest <- r; if largest != i ; then exchange A[i] cu
A[largest]; MAX-HEAPIFY(A,largest)
38.Definiti problema arborilor minimali de acoperire si furnizati sol generica a aceste probl.
46.Cum se poate gasi calea cea mai scurta intre doua noduri ale unui graf neorientat