Sunteți pe pagina 1din 23

Structuri de date si algoritmi

2h curs + 1h laborator+1h proiect


Examen scris

SDA curs 1 I INFO 2013/2014 1


De ce SDA?

 Structuri de date : metode de organizare a unei mari cantitati de informatie


 Analiza algoritmilor : estimarea timpului de executie si a resurselor necesare

 Dezvoltarea tehnologiei=> calculatoare din ce in ce mai rapide


- nevoia de programe care sa poata procesa in timp util o mare cantitate
de date de intrare
- eficienta programelor, obiectiv stringent in special la cantitati mari de
date de intrare
- analiza algoritmului permite o apreciere, o estimare a solutiei daca este
eficienta, inca inainte de a scrie codul

Ex. 1 Problema de selectie. Se da un grup de N numere. Sa se determine


elementul de pe pozitia k in ordinea descrescatoare a marimii.

SDA curs 1 I INFO 2013/2014 2


Variante de solutii Ex.1

 a) a citi cele N elemente intr-un tablou, sortarea lor in ordine


descrescatoare si returnarea elementului de pe pozitia k
 b) a citi primele k elemente intr-un tablou si sortarea lor in ordine
descrescatoare. Fiecare element este citit apoi unul cate unul. Daca
este mai mic dacat al k –lea element este ignorat, altfel este pus in
pozitia corecta, cel in plus fiind eliminat

Care varianta este mai buna ? Sunt destul de bune ambele ?


Set de intrare : 1 milion de elemente: k=500.000

Ex. 2 Se considera un tablou bidimensional de litere si o lista de cuvinte.


Obiectiv : gasirea de cuvinte in tablou

SDA curs 1 I INFO 2013/2014 3


Variante de solutii Ex.2

a) Pentru fiecare cuvant din lista se verifica fiecare triplet ( rand,


coloana, orientare); vor rezulta prin implementare foarte multe bucle
imbricate
b) Pentru fiecare quadruplu ( rand, coloana, orientare, numar de
caractere) se verifica daca cuvantul exista in lista

Dimensiune tablou:16x16; lungime cuvant :1-16: lista – intregul dictionar

SDA curs 1 I INFO 2013/2014 4


Nevoia unei structuri

 Structura este prezenta atat in raport cu datele, cat si cu programul (codul) care
implementeaza algoritmul.
 Cerinte asupra programelor : usor de urmarit, concise, usor de modificat
 Structurarea programului - permite descompunerea problemei de rezolvat,
si implicit a solutiei, in parti mai simple, pana la cele direct rezolvabile
 Structurarea datelor – conduce la operatii simple si eficiente, in cazul alegerii
unei structuri de date potrivite
 Structura datelor si a programelor se afla intr-o stransa corelare si ambele
conduc la eficienta
Ex. 3 Parcurgerea traseului intre casele dintr-un oras ( N case )
Ex. 4 Cautarea unui nr. de telefon in cartea de telefon cand se cunoaste numele.
Ex. 5 Cautarea unor informatii pe hartile geografice
Structurarea clarifica, iar detaliile fara insemnatate pentru rezolvare ingreuneaza.

SDA curs 1 I INFO 2013/2014 5


Structura programelor

 Ex. 6 Scrieti un program care tipareste toate numerele prime intre 2 si n.

Un algoritm asociat unei probleme specifica operatiile care trebuie efectuate


pentru a se ajunge la un rezultat corect.

prime1 ( n)
1. Creeaza o multime (colectie) numita candidati care cuprinde toti intregii intre
2 si n
2. Elimina toate numerele care nu sunt prime din candidati
3. Tipareste toti intregii ramasi in candidati

Variante de implementare : prime1_a( int n); prime1_b( int n)

SDA curs 1 I INFO 2013/2014 6


prime1_a( int n)
prime1_a (int n) /* tipareste toate numerele prime intre 2 si n */
{
colectie candidati;
creeaza ( n, candidati);
elimina ( n, candidati);
tipareste (n, candidati);
}

elimina (n, candidati)

actualizeaza factor la primul numar prim


while ( mai sunt numere care nu sunt prime in candidati )
sterge din candidati toti intregii care sunt multiplii lui factor si
incrementeaza factor cu 1
SDA curs 1 I INFO 2013/2014 7
prime1_a( int n)

elimina (int n, colectie c) /*elimina toate numerele neprime din c */


{
int primul_prim;
int factor;
primul_prim=2;
factor=primul_prim;
while ( non_prim (factor, n))
{
sterge (factor, n, c);
factor++;
}
}

SDA curs 1 I INFO 2013/2014 8


prime1_a( int n)

sterge ( int factor, int n, colectie c) /* sterge multiplii lui factor din c */
{
int urm_multiplu;
urm_multiplu=2*factor;
while (urm_multiplu <=n)
{
omite ( urm_multiplu, c);
urm_multiplu=urm_multiplu +factor;
}
}
non_prim (int factor, int n) /* returneaza adevarat daca mai sunt numere
neprime in c */
{
return (factor < = sqrt((double)n));
}
omite (i, c) /* sterge i din c */
SDA curs 1 I INFO 2013/2014 9
prime1_a( int n)
creeaza ( int n, colectie c) /* creeaza o colectie c de intregi intre 2 si n */
{
int i;
init ( n, c);
for ( i=2; i <=n; i++)
insereaza (i, c);
}
init ( n, c) /* goleste c de elemente */
insereaza ( i, c) /* adauga i in c */
tipareste ( int n, colectie c)
{
int i;
for ( i=2; i <=n; i++)
if ( apartine (i, c))
printf(“ \n %d \n”, i);
}
apartine (i, c) /* returneaza adevarat daca i este prezent in c */
SDA curs 1 I INFO 2013/2014 10
prime1_b( int n)
{ colectie candidati;
int factor, i, urm_multiplu, primul_prim=2;
init (n , candidati);
for (i=2; i<=n; i++)
insereaza ( i, candidati);
factor=primul_prim;
while (factor < = sqrt ((double) n))
{
urm_multiplu=2*factor;
while (urm_multiplu <=n)
{
omite (urm_multiplu, candidati);
urm_multiplu=urm_multiplu+factor;
}
factor++;
}
for (i=2; i<=n; i++)
if (apartine(i, candidati))
printf (“\n %d \n”,i);
}
SDA curs 1 I INFO 2013/2014 11
 Utilizarea datelor abstracte si a modularizarii functionale
usureaza intelegerea programului si a manierei de rezolvare, dar
totodata simplifica si mentenanta unui program
 Modificarea programului pentru a face ceva nou
 Modificarea programului pentru a nu mai face anumite operatii ( sarcini)
 Modificari pentru cresterea eficientei in implemetarea anumitor sarcini
(task-uri)
 Alegerea implementarii pentru datele abstracte este un punct
critic pentru cresterea eficientei programelor

Variante de implementare pentru candidati: tablou, intreg a carui valoare


depinde de contributia fiecarui membru, lista, arbori, etc

SDA curs 1 I INFO 2013/2014 12


prime2 ( int n)

1. Pune x1, x2, …, xn pe 0.


2. Pune k pe 2
3. Daca xk este 1, executa pasul 7.
4. Tipareste k.
5. Pune m ca parte intreaga a lui n/k
6. Pune xk,x2k,…,xmk pe1.
7. Pune k pe k++.
8. Daca k <=radical(n) executa pasul 3
9. Daca xk este 0, tipareste k
10. Pune k pe k+1
11. Daca k<=n, executa pasul 9

SDA curs 1 I INFO 2013/2014 13


Obiectivele cursului

 1. Cunoasterea conceptelor de baza referitoare la marea varietate de structuri


de date utilizate in activitatea de programare si cunoasterea celor mai
semnificative aplicatii care le utilizeaza

 2 Conceperea si implementarea unor algoritmi specifici in contextul unor


structuri de date, cu aprecierea eficientei si a performantelor acestora, atat din
punctul de vedere al vitezei de executie , cat si a spatiului de memorie necesar.

 3. Dezvoltarea si insusirea unui mod de lucru ingineresc, integrat, referitor la


abordarea, dezvoltarea si implementarea unor produse software eficiente.

SDA curs 1 I INFO 2013/2014 14


Structura cursului

 Cap.1 Structuri de date fundamentale


 Cap.2 Notiuni despre algoritmi. Analiza algoritmilor.
 Cap.3 Algoritmi de sortare
 Cap. 4 Structura de date sir
 Cap. 5 Structura de date lista
 Cap. 6 Structuri derivate din liste
 Cap. 7 Arbori

SDA curs 1 I INFO 2013/2014 15


Bibliografie

 Vladimir Cretu – Structuri de date si algoritmi, Orizonturi Universitare,


2000
 Vladimir Cretu – Structuri de date si algoritmi. Structuri de date
avansate, vol 2, Orizonturi Universitare, 2005

 Mark Allen Weiss- Data Structures and Algorithm Analysis in C, 2nd ed,
Addison Wesley, 1997

 R. Sedgewick – Algorithms in C, Addison Wesley, 1998

 James Korsh, Leonard Garett – Data Structures, Algorithms and


Program Style using C, PWS – Kent Publishing Company, 1988

SDA curs 1 I INFO 2013/2014 16


Cap. 1 Structuri de date fundamentale
1.1 Preliminarii
 Caracteristici ale sistemelor de calcul:
- viteza de lucru -faciliteaza si accelereaza executia unor calcule complexe;
- capacitatea de memorare;
- posibiltatile de acces la informatiile memorate

Cantitatea mare de informatii prelucrata de un sistem de calcul reprezinta o


abstractizare a lumii reale, concretizata intr-o multime de date, selectate
astfel incat sa fie reprezentative pentru problema de rezolvat.

Constituirea informatiilor furnizate unui program comporta doua etape,


care adeseori se interpatrund:
1. Stabilirea abstractizarii valabile pentru rezolvarea problemei, in urma careia
rezulta un set de date initial
2. Stabilirea modului de reprezentare in sistem a acestor date.

SDA curs 1 I INFO 2013/2014 17


 Alegerea reprezentarii datelor se poate realiza la randul ei la diferite nivele
de abstractizare, in functie de scopul urmarit si de limbajul de programare
utilizat. Reprezentarea este determinata de facilitatile hard si soft pe care le
pune la dispozitie sistemul de calcul.

 Un limbaj de programare poate fi privit drept un “calculator abstract”, capabil sa


inteleaga termenii definiti in limbaj. Termenii limbajului incorporeaza deja un
anumit nivel de abstractizare a obiectelor utilizate de masina reala, functie de
nivelul limbajului ( coborat, ridicat). Sarcina transformarii notiunilor abstracte
ale limbajului in termenii sistemelor ( masinilor) de calcul revine altor programe:
compilatoare, interpretoare, asambloare (translatoare)

 Cu cat nivelul de abstractizare al limbajului este mai strans legat de sistemul de


calcul, cu atat este mai simplu pentru cel care realizeaza implementarea sa
aleaga o reprezentare mai eficienta, dedicata problemei.
 Limbajul C se situeaza intre limbajele orientate spre masina si cele cu inalt nivel
de abstractizare.

SDA curs 1 I INFO 2013/2014 18


1.2 Tipuri de date
1.2.1 Conceptul de tip de data
 In procesul de prelucrare a datelor numerice sa face o distinctie clara intre
numerele reale, intregi, complexe.
 In acest sens este necesar ca fiecare constanta, variabila, expresie sau
functie sa se incadreze unui anumit tip de data.

 Un tip de data se caracterizeaza prin:


- multimea valorilor
- grad ( nivel) de structurare
- set de operatori specifici

Precizarea tipurilor de date se realizeaza prin declaratii explicite, care preced


textual utilizarea obiectelor incadrate in acele tipuri. Unele tipuri sunt
recunoscute implicit prin reprezentare.

SDA curs 1 I INFO 2013/2014 19


Caracteristicile conceptului de tip de data :

 1. Un tip de data determina in mod univoc multimea valorilor pe care le poate asuma un
element incadrat in tipul respectiv ( constante, variabile sau valori generate de un operator
sau o functie)
 2. Tipul unui element sintactic poate fi dedus din forma sa de prezentare sau din
declaratia sa explicita, fara a fi necesara executia unor procese de calcul suplimentare.
 3. Fiecare operator sau functie definita accepta argumente de un tip precizat si
furnizeaza rezultate de asemenea de un tip precizat. Daca apar abateri de la aceasta
regula generala , ele sunt rezolvate de reguli specifice limbajelor
 4. Presupune un anumit grad de structurare a informatiei, grad care e evidentiat de
nivelul de organizare asociat tipului de data.

Respectarea caracteristicilor de mai sus permite compilatoarelor sa verifice


compatibilitatea si legalitatea unor constructii de limbaj, inca in faza de compilare,
fara a fi necesara executia. Acest tip de redundanta din textul programelor sursa constituie
un prim avantaj major al limbajelor de nivel superior, fata de limbajul de asamblare.

SDA curs 1 I INFO 2013/2014 20


Metode de structurare

 In fiecare limbaj de programare se precizeaza anumite metode de


constructie a tipurilor de date structurate
 Metode de structurare de baza:
a) Prin agregare : definirea unor tipuri de date noi prin agregare
(conglomerare), pornind de la tipuri existente ( anterior definite).
Valorile tipurilor rezultate sunt conglomerate de valori ale tipurilor
constitutive. Daca exista un singur tip constitutiv , acesta se
numeste tip de baza.
b) Prin incuibare: definirea unor tipuri de date in interiorul altor tipuri

Cele doua metode pot fi combinate rezultand astfel un anumit nivel


de structurare, bazat pe o ierarhie de astfel de structuri. Tipurile
de la baza structurarii trebuie sa fie tipuri primitive ( atomi)

SDA curs 1 I INFO 2013/2014 21


 Limbajele de programare pun la dispozitie tipuri primitive nestructurate
(fundamentale):
a) Definite de programator prin enumerarea tipurilor constitutive ale tipului
b) Tipuri standard, numite si predefinite, care au de regula corespondenta cu
reprezentari asociate arhitecturii hardware a sistemului de calcul

Daca intre valorile individuale ale tipului exista o relatie de ordonare, atunci
tipul de data este ordonat sau scalar . Majoritatea tipurilor primitive sunt
scalare.
Metodele de structurare de baza genereaza tipuri de date structurate:
- statice
- dinamice
- definite de utilizator

SDA curs 1 I INFO 2013/2014 22


Operatori

 Variabilele si constantele sunt utilizate in calculele implementate prin


program. In acest scop, limbajele de programare definesc operatori asociati
tipurilor de date.
 Operatorii de baza : atribuire si comparatie
Executia acestor operatori presupune un volum cu atat mai sporit de calcul,
cu cat gradul de structurare al tipului de data este mai ridicat.
 O alta clasa fundamentala de operatori : operatorii de transfer, utilizati in
construirea tipurilor structurate
- constructori
- selectori
 Operatorii de transfer pot fi : impliciti sau expliciti
 Operatorii pot fi : omogeni sau mixti
 D.p. d. v. al rezultatului furnizat: interni sau externi

SDA curs 1 I INFO 2013/2014 23

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