Sunteți pe pagina 1din 19

Algoritmi și structuri de date – curs 1

- optional, an II –
Concepte de bază
Complexitatea algoritmilor
Metode de sortare de bază

Cristian Bologa
c_bologa@yahoo.com
cristian.bologa@econ.ubbcluj.ro

Cluj-Napoca - 26 febr 2021


Cuprins
Conceptul de algoritm
Complexitatea algoritmilor. Analiza eficienței algoritmilor
Sortarea ordinara

Cluj-Napoca - 26 febr 2021


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

Moodle: Cursul Algoritmi si Structuri de date –optional an2

Cluj-Napoca - 26 febr 2021


Cerinţe, evaluare
Test scris: grila!

Cluj-Napoca - 26 febr 2021


Bibliografie
 T.H. Cormen, C. Leiserson, R.R. Rivest, C. Stein, Introduction to
Algorithms, 3rd edition, The MIT Press, 2009

 Traducere in limba română

[Negrescu02] Negrescu L –Limbajele C şi C++ pentru începători,


volumul 1: Limbajul C, Ed. Albastră, Cluj-Napoca, 2002.

[Bologa06] Bologa C. –Algoritmi si structuri de date; Editura


Risoprint, Cluj-Napoca, 2006

Cluj-Napoca - 26 febr 2021


Algoritmi – definiții fundamentale (I)
 
Definiția conceptului de algoritm
O procedura de calcul bine definită, care primește ca și intrare un set de valori și
produce la ieșire un set de valori

Exemplu: definirea problemei de sortare a unui șir de numere:


Input: o secvență de n numere
Output: o permutare (sau o reordonare) a secvenței de numere furnizată la
intrare, astfel încât

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

Cluj-Napoca - 26 febr 2021


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

Spunem că algoritmul respectiv rezolvă problema computațională furnizată.

O structură de date reprezintă un mod de a organiza și stoca datele astfel încât să


facilităm accesul la ele și modificarea acestora

Tehnici care vor fi acoperite în acest curs:


Tehnici de proiectare a algoritmilor
Tehnici de analiză a algoritmilor astfel încât să putem decide asupra
corectitudinii algoritmilor și
eficienței acestora

Cluj-Napoca - 26 febr 2021


Pseudocod
Modalitate de a descrie algoritmi
Similar cu schemele logice
Un algoritm descris in pseudocod poate apoi sa fie implementat in orice
limbaj de programare (C, Pascal etc).
Convenții de notare
 Indentarea descrie o structura de tip bloc
 If-then-else, precum si structurile repetitive while, for, repeat-until au
semnificație similară cu cea din C
 // este utilizat pentru comentarii
 Variabilele sunt locale fiecarei proceduri
 Transmiterea parametrilor in proceduri se realizează intotdeauna prin
valoare
 Operatorii logici and si or se evaluează prin scurt-circuitare

Cluj-Napoca - 26 febr 2021


Necesitatea studierii algoritmilor
Dacă calculatoarele ar avea o viteză de execuție infinită, atunci orice
metodă corectă de rezolvare a unei probleme ar fi potrivită

Calculatoarele au viteze de execuție limitate


Spațiile de memorare ale calculatoarelor sunt ieftine dar nu gratuite
=> Nu orice algoritm corect funcționează în mod utilizabil pe orice resurse
de calcul

Eficiența unui algoritm:


 se referă la resursele de calcul și memorie necesare pentru execuția
algoritmului
 Poate fi mult mai importantă decât capabilitățile hardware și software ale
calculatorului care rulează algoritmul

Cluj-Napoca - 26 febr 2021


Necesitatea studierii algoritmilor
Analiza complexitatii:
 Spatiul de memorie
 Timpul de executie –depinde de factori:
 Externi (frecventa procesorului, calitatea codului generat de compilator etc)
 Interni (depind de problema de urmeaza a fi rezolvata si deci de algoritm)
Pentru simplificare, în cazul complexităţii, volumul datelor unui algoritm este caracterizat de un
singur număr întreg (notat cu n), deşi multe probleme nu pot fi definite astfel.

Timpul de execuţie T(n) poate avea mai multe semnificaţii:


 cazul cel mai defavorabil. În cazul unui algoritm de sortare ascendent, acest timp este dat
(în general) de sortarea unui vector având elementele în ordine descrescătoare.
 cazul mediu, adică raportul dintre suma timpului necesar pentru toate seturile de date
posibile şi numărul de seturi. Timpul mediu în cazul unui algoritm de sortare se bazează pe
un vector de elemente generat aleator.
 cazul cel mai favorabil. Pentru un algoritm de sortare, acest caz este dat (în general) de un
vector deja sortat.

Cluj-Napoca - 26 febr 2021


Necesitatea studierii algoritmilor (II)
n O(n) O(n*ln(n) O(n2) O(n3) O(2n)
2 2 1,38 4 8 4
5 5 8,04 25 125 32
10 10 23 100 1.000 1.024
20 20 59 400 8.000 1.048.576
30 30 102 900 27.000 1.073.741.824
40 40 147 1.600 64.000 1,09E+12
50 50 195 2.500 125.000 1,12E+15
100 100 460 10.000 1.000.000 1,26E+30
1000 1.000 6.907 1.000.000 1.000.000.000 1,07E+301

-calculator capabil să efectueze 10 9


instrucţiuni/secundă:
n O(n) O(n*ln(n)) O(n2) O(n3) O(n4) O(n10) O(2n)
1 10 1 3,2*1013 3,2*10283
s s
1.000 1.000.000 1.000.000 1.000 1s 17 min ani ani
s
10 130 100
s s
10.000 1.000.000 1.000.000 1.000 17 116 ? () ? ()
s min zile
1 20 3*107
6 s s
10 1.000 1.000 17 32 ani ani ? () ? ()
min
Cluj-Napoca - 26 febr 2021
Analiza unui algoritm
Inseamnă să identificăm resursele necesare execuției algoritmului
 Memorie, latime de bandă pentru comunicații, hardware necesar etc.
Utilizarea unui model generic de calculator
 Un singur procesor
 Model random-access machine pentru procesor: instructiunile se execută
secvențial (una după alta), și nu există posibilitate de concurență
 Se presupune că instrucțiunile permise pe procesor se execută toate intr-un
timp constant
 Presupunem că procesorul poate lucra cu date de tip intreg sau flotant, fără
ca precizia să fie de larg interes (in demersul nostru de analiză a
algoritmului)

Cluj-Napoca - 26 febr 2021


Complexitatea algoritmilor
Un algoritm liniar are complexitatea O(n), unul pătratic O(n2) iar
unul cubic O(n3).

Un algoritm se numeşte polinomial dacă are o complexitate


egală cu O(p(n)) unde p(n) este o funcţie polinomială.

Altă clasă de algoritmi sunt cei exponenţiali. Sunt asimilaţi


algoritmilor exponenţiali şi cei de forma n*ln(n) deşi matematic
nu sunt nici polinomiali nici exponenţiali.

Cluj-Napoca - 26 febr 2021


Complexitatea algoritmilor (II)
Rata de creștere a timpului de execuție: ne interesează doar termenul
 
cel mai semnificativ din T(n), adică
=>complexitatea

Un algoritmestemaieficientdecât altul dacă are o rată de creștere mai


mică, pentru cazul cel mai defavorabil

Eficiența asimptotică a algoritmilor: atunci când rata de creștere a


timpului de execuție devine esențială considerând mărimi mari ale
setului de date de intrare

Cluj-Napoca - 26 febr 2021


Notiuni despre sortare
Algoritmi de sortare:
Dându-se o secvenţă de elemente caracterizate de valorile e1,
e2, ... en E, operaţia de sortare este operaţia de găsire a unei
permutări a secvenţei ei1, ei2, ... ein astfel încât eij  eik, oricare ar
fi ij  ik, unde “” este o relaţie de ordine definită peste mulţimea
E.

 Ascendentă
 Descendentă

 algoritmi interni –în cazul acestora, secvenţa de sortat este


păstrată în memoria internă
 algoritmi externi –secvenţa de sortat este păstrată pe un suport
extern. Cluj-Napoca - 26 febr 2021
Notiuni despre sortare

O metodă de sortare se spune că este stabilă dacă după sortare,


ordinea relativă a elementelor cu chei egale coincide cu cea
iniţială, element esenţial în special în cazul în care se execută
sortarea după mai multe chei.

Algoritmii care utilizează doar zona de memorie alocată tabloului,


fără a fi necesar un tablou suplimentar se numesc sortări "în
situ".

Cluj-Napoca - 26 febr 2021


Sortarea ordinara
Principiu: un şir este sortat dacă prin parcurgerea lui de la început
până la sfârşit, fiecare element este mai mic sau egal decât
succesorul. Dacă această condiţie nu este îndeplinită, inversăm
cele 2 elemente. Sortarea se încheie în momentul în care
parcurgerea şirului se face fără a fi necesară nici o inversare
(fiecare element este mai mic sau egal decât succesorul său).

Cluj-Napoca - 26 febr 2021


Sortarea ordinara
void sortare_ordinara(int a[], int n)
{ int i,j,k,elem;
do
{ for(i=0,k=0;i<n-1;i++)
//la fiecare început de parcurgere a şirului, k este iniţializat cu 0
if(a[i]>a[i+1]) //dacă elementul curent este mai mare decât succesorul
//este necesară inversarea lor; atenţie: dacă punem mai mare
//sau egal şi avem 2 elemente egale, vom ajunge la ciclu infinit
{ elem=a[i];
a[i]=a[i+1];
a[i+1]=elem;
k=1; //k diferit de 0 indică faptul că s-a făcut o inversare
}
} while(k); //sortarea se încheie în momentul în care k a rămas 0 (deci nu
//s-a făcut nici o inversare de elemente)
}

Cluj-Napoca - 26 febr 2021


Sortarea ordinara
3 7 4 9 2 8 i=1; inversam a[1]=7 cu a[2]=4; k=1

3 4 7 9 2 8 i=3; inversam a[3]=9 cu a[4]=2; k=1

3 7 4 2 9 8 i=4; inversam a[4]=9 cu a[5]=8; k=1

k<>0 deci pornim un nou ciclu;


3 7 4 2 8 9 i=1 inversam a[1]=7 cu a[2]=4; k=1

3 4 7 2 8 9 i=2; inversam a[2]=7 cu a[3]=2; k=1

k<>0 deci pornim un nou ciclu;


3 4 2 7 8 9 i=1 inversam a[1]=4 cu a[2]=2; k=1

k<>0 deci pornim un nou ciclu;


3 2 4 7 8 9 i=0 inversam a[0]=3 cu a[1]=2; k=1

2 3 4 7 Cluj-Napoca
8 9 - 26 febr
k ramane 2021
0 (nu facem nici o inversare)
deci sirul este sortat

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