Documente Academic
Documente Profesional
Documente Cultură
- Informatică Economică, an II –
Concepte de bază
Complexitatea algoritmilor
Metode de sortare de bază
Cristian Bologa
Cuprins
Conceptul de algoritm
Complexitatea algoritmilor. Analiza eficienței algoritmilor
Sortarea prin insertie
Sortare prin interclasare
Obiective
Deprinderea modului de proiectare si analiză a algortimilor
Studiul principalelor structuri de date utilizare in activitatea de
programare
Studiul unor probleme algoritmice clasice și furnizarea de solutii la
acestea
Imbunătățirea abilităților de programare utilizând limbajul C
Organizare
http:://bis.econ.ubbcluj.ro/moodle
Cursul Algoritmi si Structuri de date
Cerinţe, evaluare
Probă teoretică: 40% - Examen scris în sesiune
Un algoritm de sortare, pentru o anumită secvență de numere input 31, 41, 59,
26 va produce ca și output secvența 26, 31, 41, 59.
O instantă a problemei o constituie o secvență de intrare care satisface
condițiile problemei
Algoritmi – definiții fundamentale (II)
Un algoritm se spune că este corect dacă pentru orice secvență de intrare care
satisface condițiile problemei va produce la ieșire un rezultat (output) corect
Un algoritm este mai eficient decât altul dacă are o rată de creștere
mai mică, pentru cazul cel mai defavorabil
Interni
Externi
Sortare stabilă
Loop invariant: la fiecare început al iterației for, subșirul A[1..j-1] este format din
exact aceleași elemente care se alfă la inceputul sortării în subșirul A[1..j-1], dar într-
o ordine sortată
Inițializare: condiția Loop invariant este adevărată înainte de execuția buclei for
Mentenanță: condiția Loop invariant este adevărată înaintea inceperii unei iterații din
bucla for și rămâne adevărată inaintea inceperii următoarei iterații
Terminare: condiția Loop invariant este adevărată după execuția buclei for – astfel,
ne furnizează o proprietate esențială pentru a demonstra că algoritmul este corect
Analiza sortării prin inseție
Mărimea datelor de intrare (input size): in general, este numărul de
itemi din setul de intrare
Timpul de execuție: reprezintă numărul de operații primitive necesar a
se executa pentru ca algoritmul să ajungă la soluție
Este necesar să se definească operația primitivă într-un mod independent
de mașina de calcul
Analiza sortării prin inseție
Cazul cel mai favorabil (best case): sirul este deja sortat. =>𝑡𝑗 = 1
𝑇 𝑛 = 𝑎𝑛 + 𝑏
Cazul cel ma idefavorabil (worst case): sirul este in ordine inversă: 𝑡𝑗 =j
𝑇 𝑛 = 𝑎𝑛2 + 𝑏𝑛 + 𝑐
În majoritatea cazurilor, la analiza unui algoritm trebuie să ne concentrăm
pe analiza cazului cel mai defavorabil
Exemplu: 3! Exemplu: 5!
Exemplu: Sirul lui Fibonacci
PERECHI
de perechi
Recursivitate / divide-and-conquer
Abordare divide-and-conquer (divide et impera):
problema initială se sparge in subprobleme cu structură similară cu
problema originală, dar de dimeniune mai mică.
aceste subprobleme sunt rezolvate recursiv
solutiile recursive sunt combinate pentru a produce solutia problemei initiale
16529473
1652 9473
16 52 94 73
1 6 5 2 9 4 7 3
16 25 49 37
1256 3479
12345679
Procedura de interclasare
Loop invariant
La inceputul buclei for
din linia 12 au simultan
loc următoarele condiții:
1. A[p..k-1] conține k-p
cele mai mici elemente
din L și R
2. L[i] și R[j] sunt cele mai
mici elemente din L și R
Sortare prin interclasare - pseudocod
Complexitatea algoritmilor
divide-and-conquer
Problema de dimensiune 𝑛 se imparte in 𝑎 subprobleme de dimensiune
1/𝑏 din problema originală
𝐷(𝑛) – timpul de execuție necesar pentru pasul divide
𝐶(𝑛) – timpul de execuție necesar pentru pasul combine
Θ 1 , 𝑑𝑎𝑐ă 𝑛 ≤ 𝑐
𝑇 𝑛 =ቐ 𝑛
𝑎𝑇 + 𝐷 𝑛 + 𝐶 𝑛 , 𝑖𝑛 𝑐𝑎𝑧 𝑐𝑜𝑛𝑡𝑟𝑎𝑟
𝑏
Complexitatea sortarii prin interclasare
Pasul divide: 𝐷 𝑛 = 1
Pasul combine: procedura Merge: 𝐶 𝑛 = Θ(𝑛)
Pasul conquer: problema se imparte in 2 subprobleme de mărime 𝑛/2,
𝑛
deci acestea contribuie cu 2𝑇(2 )