Sunteți pe pagina 1din 9

Curs 1 -Analiza complexității algoritmilor LAB 1

Algoritm- o procedura prin care datele de intrare suferă modificări în urma cărora vor rezulta datele de ieșire.
Performanța unui program poate fi măsurată în funcție de resursele pe care acesta le solicită folosind:
- Timpul de execuție (factor dependent de sistem/CPU)
- Memoria necesară (factor dependent de sistem/RAM)
-Complexitatea temporală: numărul de operații necesare rezolvării unei prob. de o anumită dimensiune (n).
- Complexitatea spațială: spațiul virtual de memorie necesar pentru variabilele folosite de algoritm.
Factori cu impact direct asupra timpului de execuție:
1. Mărimea datelor de intrare
2. Conținutul și organizarea datelor de intrare:
- cazul cel mai favorabil (CF) datele sunt organizate astfel încât algoritmul parcurge numărul minim de pași
pentru a produce rezultatul
- cazul cel mai defavorabil (CDF) datele sunt organizate astfel încât algoritmul va parcurge numărul maxim de
pași pentru a produce rezultatul
- cazul mediu (M) datele sunt organizate într-o ordine aleatoare.
Complexitatea temporală poate fi exprimată folosind
- notații asimptotice *Notația Θ (theta) *Notația O *Notația Ω (omega)
Curs 2-3 - Divide et Impera LAB 2-3
Metodă de rezolvare care poate fi aplicată acelor probleme care acceptă o
modalitate de împărțire succesivă în subprobleme de dimensiuni mai mici, dar de
același tip. Conține 2 etape: etapa divide problema iniţială este împărțită într-un
număr de subprobleme de aceeaşi natură, însă de dimensiuni mai mici și etapa
impera- subproblemele de dimensiuni mici (denumite dimensiuni elementare)
sunt rezolvate în mod direct, iar soluţiile lor combinate pentru a obţine soluţiile subproblemelor de dimensiuni
mai mari, până când obținem soluția problemei inițiale.
Teorema Master, Cautare binară, Căutarea prin interpolare, Căutarea elementului sumă, maxim, Sortarea
rapidă (quick sort, qsort), Acoperirea tablei
Curs 4 –Programare dinamică: Introducere L4
Programarea dinamică- se aplică problemelor care pot fi descompuse în subprobleme de aceeași natură și
care respectă structura optimă.
Timp de calcul- de ordin polinomial.
Principiul optimalității- O problemă este descompusă în subprobleme de același tip dar de dimensiuni mai
mici, iar soluţiile (optime) ale acestor subprobleme contribuie la obţinerea soluţiei (optime) pentru problema
iniţială.
Asemănări și Deosebiri cu Divide et Impera:
-principiul suprapunerii subproblemelor
-principiul memoizării (o subproblemă este rezolvată o singură dată iar soluţia obținută este salvată
pentru a putea fi utilizată de oricâte ori este nevoie)
Șirul lui Fibonacci (T)- O(an)
Fibonacci_2(T)- O(n)
Fibonacci_2(S)-O(n)
Fibonaci_3(T)-O(n)
Fibonacci_3(S)-O(1)
Caracteristici programare dinamică:
-Structura optimă
-Suprapunerea
-Memoizarea
Etapele rezolvării unei probleme folosind metoda Programării Dinamice:
1. Verificarea structurii optime
2. Identificarea unei relaţii de recurenţă
3. Rezolvarea subproblemelor şi memorarea soluţiilor parţiale
4. Construirea soluţiei curente

Numărul combinărilor(T)-O(n)
Combinări_2(T)- O(an)
Combinări_3(T)-O(n^2)
Combinări_3(S)-O(n^2)
Combinări_4(T)-O(n*k)
Combinări_4(S)-O(n)
Curs 5 –Programare dinamică: Studiu practic privind îmbunătățirea succesivă a complexității temporale a
unei probleme algoritmice
Subșir de sumă maximă(T)-O(n^3)
Subșir de sumă maximă(S)-O(n)
CalculeazăSAT(T)-O(n)
CalculeazăSAT(S)-O(n)
SubșirSumaMax_2(T)-O(n^2)
SubșirSumaMax_2(S)-O(n)
SubșirSumaMax_3(T)-O(n)
SubșirSumaMax_3(S)-O(n)
Curs 6 –Programare dinamică: Probleme de secvențe L4 LIS-L5 LCS
Subsecvenţa crescătoare de lungime maximă(LAS, LIS)
LAS(T)-O(n^2)
LAS(S)-O(n)
TipăreșteLAS(T)-O(n)
TipăreșteLAS(S)-O(n)
Subsecvenţa comună de lungime maximă(LCS)
LCS(T)-O(n*m)
LCS(S)-O(n*m)
LCS2(T)-O(n*m)
LCS2(S)-O(m)
Cel mai lung palindrom:
Palindrom(T)-O(n)
Palindrom(S)-O(n)
Transformări de cuvinte:
Transformă(T)-O(n*m)
Transformă(S)-O(n*m)
Curs 7 –Programare dinamică: Probleme de labirint L6
Drum în labirint- Rezolvare folosind tehnica backtracking

− Folosește o stivă de capacitate n x m

− Un punct succesor este valid dacă reprezintă o locaţie liberă în labirint şi dacă nu a mai fost vizitat
anterior.
− Avem o soluţie când nivelul curent al stivei conține punctul de destinație. În acest moment, comparăm
soluţia curentă cu cea mai bună soluție găsită până în acel moment din punct de vedere al lungimii
drumului.
DrumInLabirint-Backtracking(T)-O(n*m)
DrumInLabirint-Backtracking(S)-O(n^2)
Algoritmul lul Lee- Reprezintă o variantă eficientă de a determina drumuri de lungime minimă în cadrul unui
labirint. Pentru rezolvare, folosim o structură de tip coadă, în care adăugăm în mod iterativ toate locaţiile din
labirint la care putem ajunge prin drumuri de o anumită lungime (plecând de la lungime=1) astfel:
1. Iniţial, punctul de start este adaugat în coadă.
2. Toţi vecinii liberi ai punctului de start vor fi adăugaţi în coadă.
3. Extragem pe rând câte o locație din coadă (locația curentă).
4. Pentru această locație curentă, adăugăm în coadă toţi vecinii (nevizitați încă) la care putem ajunge din
respectiva locație.
5. Algoritmul se încheie când coada este vidă.

DrumInLabirint-Lee(T)-O(n^2)
DrumInLabirint-Lee(S)-O(n^2)
TipăreșteDrum(T)-O(n^2)
TipăreșteDrum(S)-O(n^2)
ÎncăperiSecrete(T)-O(n^2)
IncăperiSecrete(S)-O(n^2)
Labirint triunghiular
Triunghi(T)-O(n^2)
Curs 8 -GRAFURI LAB 7
Grafuri orientate/ neorientate
Se numeşte graf perechea G=(V,E) unde V reprezintă o mulţime de noduri (sau vârfuri) V={v0,v1,…vn-1} iar E
aparține V×V o mulţime de muchii (sau arce).
Un graf neorientat cu n noduri poate avea maxim n(n-1)/2 muchii - orientat n(n-1) muchii.
Fie un graf G=(V,E). Se numeşte gradul unui nod v numărul de muchii din E incidente în nodul v.
Un nod cu gradul 0 poartă denumirea de nod izolat.
Se numeşte gradul interior(d-) nodului numărul de muchii din E care „intră” în nodul x, respectiv gradul
exterior(d+) numărul de muchii din E care „ies” din x.
Gradul unui nod x aparţinând unui graf orientat este egal cu suma dintre gradul interior şi exterior:d(x) = d-(x)
+ d+(x).
Suma gradelor nodurilor unui graf neorientat este egală cu dublul numărului de muchii m: 2 x m pentru un
graf orientat este d-(x) =d+(x)=m.
Graf nul= graful nu are muchii
Graf complet= intre oricare doua noduri din graf există muchie
graf parţial =obţinut prin eliminarea unor muchii.
Subgraf al grafului G graful obţinut prin eliminarea unor noduri şi a muchiilor incidente.
matricea de adiacenţă – asociată grafului G matricea A de dimensiuni n x n definită astfel: 1 dacă există
muchie 0 dacă nu există.
Pentru un graf neorientat, matricea de adiacenţă este simetrică faţă de prima diagonală.
Pentru un graf neorientat gradului nodului xi este dat de suma elementelor liniei i respectiv de suma
elementelor de pe colana i din matricea de adiacenţă A
Pentru un graf orientat, gradul exterior al nodului este dat de suma elementelor liniei i, respectiv gradul
interior este dat de suma elementelor de pe coloana i
Se numeşte lista de adiacenţă asociată nodului mulţimea nodurilor vecine nodului x.
parcurgerea în lăţime (BF - Breadth-First)-coadă FIFO Θ(n)
parcurgerea în adâncime (DF – Depth-First)- stivă LIFO Θ(n)
Se numeşte lanţ o succesiune de vârfuri proprietatea că între oricare două vârfuri consecutive există o
Muchie.
conex dacă pentru orice pereche de vârfuri există un lanţ care să le unească.
Un drum reprezintă o succesiune de vârfuri din graf cu proprietatea că între oricare două vârfuri consecutive
există o muchie.

Curs 9 - Arborele de adâncime - parcurgere DF fara lab


nod de articulaţie dacă prin eliminarea sa graful pierde proprietatea de conexitate.
Curs 10 - Drumuri de cost minim LAB 8
Roy-Floyd-Warshall pentru determinarea drumurilor de cost minim dintre toate nodurile unui graf T- O(n3).
Algoritmul lui Dijkstra – găsește costurile drumurilor optime (de cost minim), dintre două noduri ale unui graf
Afisare O(n) calcul O(n2)
Curs 11 - Cicluri în graf și arbori parțiali de cost minim LAB 9
Se numește ciclu un drum D alcătuit din noduri ale grafului, { x0, x1, …x p}, pentru care x0 =x p.(primul nod
este egal cu ultimul nod).
ciclu elementar un ciclu pentru care toate nodurile sunt distincte.
Se numeşte ciclu hamiltonian un ciclu elementar care trece prin toate nodurile grafului o singură dată.
Un graf care admite un ciclu hamiltonian se numeşte graf hamiltonian.
Problema comis-voiajorului (TSP:Travelling Salesman Problem)
ciclu eulerian un ciclu care trece prin toate muchiile grafului o singură dată. Un graf care admite un ciclu
eulerian se numeşte graf eulerian.
Se numeşte arbore un graf conex și fără cicluri.
G este un arbore dacă şi numai dacă G are n-1 muchii şi nu conţine cicluri.
Se numeşte arbore parţial de cost minim un arbore parţial al grafului G pentru care suma costurilor asociate
muchiilor sale are valoarea minimă.
Arborele parţial de cost minim mai poartă denumirea de arbore de acoperire minim (Minimum Spanning
Tree).
Algoritmul lui Prim T O(n3)
Algoritmul lui Kruskal - Soluție alternativă pentru problema MST
Curs 12 - Algoritmi geometrici

Bubble sort Θ(n2 )(CM)

Sortarea prin inserţie Θ(n2 ) (CM)

Sortarea prin selecția valorii minime/maxime Θ(n2 ) (CM)

Sortarea prin interclasare Θ(n log n ) în CDF

procedurii Interclasează Θ(n+m)

Sortarea rapidă Θ(n2 ) în CDF, Θ(n log n ) în CM

L2 Determinare Maxim Divide et impera Θ(n)

L2 Cautare for Θ(n)

L2 Cautare binara Θ(log n )

L2 Suma cu 2 for imbricat Θ(n2 )

L2 Suma cu cautare binara O(n*log(n)).

L3 Inversiunile unei permutari(sortare) clasic Θ(n2 )

L3 Inversiunile unei permutari(sortare) Θ(n log n )


interclasare

L4 Combinari formula Θ(n)

L4 Combinari_2 formula-recurenta O(an)

L4 Combinari_3 (T)-O(n^2)- (S)-O(n^2) sau Θ(n×k)

L4 Combinari_4 (T)- Θ(n×k)- (S)- Θ(k)

C6 L4 LIS-algoritm (T)Θ(n2) (S) Θ(n)

C6 L4 LIS-tiparire (T=S) O(n)

C6 L5 LCS-algoritm (T)-O(n*m) (s)=(n*m) sau (n+m)

C6 L5 LCS-tiparire (T)-O(n+m) (S)-O(n*m)


L6 LEE-algpritm-coada (T=S) O(m×n)

L6 LEE-tiparire (T) O(m×n)

L7 BF-FIFO-coada-latime (T) O(n2)

L7 DF-LIFO-stiva-adincime (T) O(n2)

L7 Parcurgere (T) O(n+m)

L8 Roy-Floyd-Warshall (T) O(n3)

L8 Dijkstra (T) O(n2)

L8 Dijkstra-afisare drum (T) O(n)

L9 Ciclu Eulerian (T) O(n^n)

Algoritmul lui Prim T O(n3)

Sortarea prin - se împarte mulțimea inițială în două submulțimi (de dimensiuni n/2), pe care le vom
interclasare sorta separat. Aplicăm succesiv etapa divide până când ajungem la submulțimi de
dimensiuni mici (n =1 sau n =2), care pot fi sortate direct folosind cel mult o
comparație și, eventual, o interschimbare. Interclasăm soluțiile repezentând
submulțimile sortate pentru a obţine mulțimea sortată de dimensiune n.

Sortarea rapidă se împarte mulțimea care trebuie sortată în două submulțimi în funcție de
(quick sort): poziționarea fiecărui element față de o valoare de prag , astfel:

⮚ Submulțimea alcătuită din elementele mai mici decât

⮚ Submulțimea alcătuită din elementele mai mari decât

Fiecare submulțime este împărțită la rândul ei până când se ajunge la submulțimi


alcătuite dintr-un singur element, care sunt implicit sortate.

Determinare In etapa divide se imparte sirul de numere in jumatati pana cand se ajunge la solutii
Maxim Divide et imediate de unul sau 2 elemente. In etapa impera se combină valorile maxime ale
impera subsirurilor obținute până ajungem la subsirul inițial de dimensiune n.

Sortarea prin - se iau elementele pe rând de la stânga spre dreapta. Se compară câte 2 elemente pe
inserție rând, începând cu primele 2. Atunci când se găsește faptul că ordinea nu este cea
corectă se face interschimbarea între elemente până când fiecare element ajunge pe
poziția corectă. Algoritmul reține ultima poziție de la care s-a realizat interschimbarea
principală și se încheie în momentul în care șirul este sortat.

LIS,LAS Se calculeaza pentru fiecare element a[i] lungimea celei mai lungi subsecvente
crescatoare. Pentru realizarea acestui lucru se memoreaza in vectorul LUNG pe pozitia
corespunzatoare fiecarui element lungimea subsecventei corespunzatoare. În final,
vom afişa valoarea maximă din vectorul lung ce va corespunde lungimii celei mai mari
subsecvenţe crescătoare.

LIS-TIPARIRE Pornim de la elementul de pe pozitia maxima din LUNG pe care il tiparim, cautam
urmatoarele elemente care sunt mai mari ca elementul initial tiparit, decrementata cu
o pozitie fata de pozitia anterioara. Repetam pasul pana cand ajungem la elementul
cu lungimea de subsecventa 1.

LCS Realizam o mareice lung[n,m] elemente(corespunzatoare celor doi vectori). Pe pozitia


curenta lung[i][j] memoreaza cea mai lunga subsecventa comuna. Daca Se ia maximul
dintre vecinul de sus si vecinul din stanga. Daca valorile din stanga si sus sunt egale si
valorile numerice dintre cele doua elemente comparate sunt egale atinci se
incrementeaza valoarea curenta.

LCS-tiparire Se parcorge in sens invers matricea(din coltul din dreapta jos), pana camd se ajunge la
elementul cu incrementul 1 sau 0

Lee-algoritm Reprezintă o variantă eficientă de a determina drumuri de lungime minimă în cadrul


unui labirint. Se utilizeaza o structura de tip coada(FIFO), care este initializata cu
punctul de start. Vom adauga elmente in coada in functie de locatia curenta pe care o
procesam, se vor adauga doar elementele nevizitate. Dupa vizitarea unui element
acesta este eliminat din coada. Algoritmul continua cat timp coada nu este goala.
1.Iniţial, punctul de start este adaugat în coadă.
2.Toţi vecinii liberi ai punctului de start vor fi adăugaţi în coadă.
3.Extragem pe rând câte o locație din coadă (locația curentă).
4.Pentru această locație curentă, adăugăm în coadă toţi vecinii (nevizitați încă) la care
putem ajunge din respectiva locație.
5.Algoritmul se încheie când coada este vidă.

Lee-tiparire Pentru tiparire se parcurge matricea obtinuta in urma alg. Lui Lee. De la elementul de
stop catre elementul de start. Acest drum se afla in functie de modul de
reeprezentare ales.

BF-FIFO-coada- Se aseamana cu algoritmul lui Lee datoriat structurii de coada. In cadrul acestui
latime algoritm se incarca in coada fiecare nod si toti vecinii nevizitati ai acestuia. Algoritmul
se incheie cand s-au vizitat toate nodurile.

DF-LIFO-stiva- Se mai chama si algoritmul lacom deeoarece se ia in considerare mereu primul vecin
adincime nevizitat. Se strabate graful pana cand se viziteaza toti vecinii.

Roy-Floyd- pentru determinarea drumurilor de cost minim dintre toate nodurile unui graf
Warshall

Dijkstra pentru determinarea drumului de cost minim dintre două noduri ale unui graf .
1. Se creează o listă cu distanțe, o listă cu nodul tata(anterior), o listă cu nodurile
vizitate și un nod curent.
2. Toate valorile din lista cu distanțe sunt inițializate cu o valoare infinită, cu
excepția nodului de start, care este setat cu 0.
3. Toate valorile din lista cu nodurile vizitate sunt setate cu fals.
4. Toate valorile din lista cu nodurile anterioare-tata sunt inițializate cu -1.
5. Nodul de start este setat ca nodul curent.
6. Se marchează ca vizitat nodul curent.
7. Se actualizează distanțele, pe baza nodurilor care pot fi vizitate imediat din
nodul curent.
8. Se actualizează nodul curent la nodul nevizitat care poate fi vizitat prin calea
cea mai scurtă de la nodul de start.
9. Se repetă (de la punctul 6) până când toate nodurile sunt vizitate.

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