Structuri de date fundamentale Structuri de date i

  • Slides: 23
Download presentation
Structuri de date fundamentale Structuri de date şi algoritmi -laborators. l. dr. ing. Ciprian-Bogdan

Structuri de date fundamentale Structuri de date şi algoritmi -laborators. l. dr. ing. Ciprian-Bogdan Chirilă Universitatea Politehnica Timişoara 2014

Cuprins n TDA Tablou n n n n Căutare liniară Căutare binară (logaritmică) Căutare

Cuprins n TDA Tablou n n n n Căutare liniară Căutare binară (logaritmică) Căutare prin interpolare TDA Articol TDA Mulţime TDA Secvenţă Concluzii

TDA Tablou n n Secvenţă de elemente de acelaşi tip numit tip de bază;

TDA Tablou n n Secvenţă de elemente de acelaşi tip numit tip de bază; Accesul se realizează cu ajutorul unui index asociat de tip ordinal finit; n n ex. int x=tab[7] Indexul precizează poziţia unui element în cadrul tabloului; n in C primul index al unui tablou este 0 (zero)

Exemplu - cod C #include <stdio. h> int tab[100]; int main() { tab[0]=12; tab[7]=34;

Exemplu - cod C #include <stdio. h> int tab[100]; int main() { tab[0]=12; tab[7]=34; printf("%dn", tab[0]); printf("%dn", tab[7]); return 0; }

Căutarea liniară n Se compară pe rând elementele tabloului cu x (elementul căutat) până

Căutarea liniară n Se compară pe rând elementele tabloului cu x (elementul căutat) până când fie: n n se găseşte egalitatea tab[i]=x s-a ajuns la sfârşitul tabloului.

Căutarea liniară – demo 0 1 2 3 4 5 6 87 12 48

Căutarea liniară – demo 0 1 2 3 4 5 6 87 12 48 22 69 75 31 i=0 x=69 69=87 ? nu! 87 12 48 22 69 75 31 i=1 x=69 69=12 ? nu! 87 12 48 22 69 75 31 i=2 x=69 69=48 ? nu! 87 12 48 22 69 75 31 i=3 x=69 69=22 ? nu! 87 12 48 22 69 75 31 i=4 x=69 69=69 ? da! 87 12 48 22 69 75 31

Căutarea liniară – cod C #include <stdio. h> int tab[8]={12, 34, 66, 1, 2,

Căutarea liniară – cod C #include <stdio. h> int tab[8]={12, 34, 66, 1, 2, 8, 92, 66}; int cautare. Liniara(int *tab, int dim, int x) { int i=0; while(tab[i]!=x && i<dim) { i++; } if(tab[i]==x) { return i; } return -1; }

Căutarea liniară – cod C int main() { int poz; poz=cautare. Liniara(tab, 8, 92);

Căutarea liniară – cod C int main() { int poz; poz=cautare. Liniara(tab, 8, 92); //poz=cautare. Liniara(tab, 8, 93); if(poz!=-1) { printf("Elementul s-a gasit pe pozitia %dn", poz); } else { printf("Elementul nu s-a gasitn"); } return 0; }

Căutarea binară (logaritmică) n n n Se aplică numai pe tablouri ordonate Se înjumătăţeşte

Căutarea binară (logaritmică) n n n Se aplică numai pe tablouri ordonate Se înjumătăţeşte repetat intervalul în care se face căutarea Performanţa: O(log 2 n)

Căutarea binară – demo 0 1 2 3 4 5 6 12 22 31

Căutarea binară – demo 0 1 2 3 4 5 6 12 22 31 48 69 75 87 s=0 d=6 m=3 x=75 75 ? 48 > ! 12 22 31 48 69 75 87 s=3 d=6 m=4 x=75 75 ? 69 > ! 12 22 31 48 69 75 87 s=4 d=6 m=5 x=75 75 ? 75 = ! 12 22 31 48 69 75 87

Căutarea binară – cod C #include <stdio. h> int tab[8]={1, 2, 8, 12, 34,

Căutarea binară – cod C #include <stdio. h> int tab[8]={1, 2, 8, 12, 34, 66, 87, 92}; int cautare. Binara(int *tab, int dim, int x) { int s, d, m; s=0; d=dim-1; do { m=(s+d)/2; if(x>tab[m]) { s=m+1; } else { d=m-1; } } while((tab[m]!=x) && (s<=d));

Căutarea binară – cod C if(tab[m]==x) { return m; } return -1; } int

Căutarea binară – cod C if(tab[m]==x) { return m; } return -1; } int main() { int poz; poz=cautare. Binara(tab, 8, 66); //poz=cautare. Binara(tab, 8, 33); if(poz!=-1) { printf("Elementul s-a gasit pe pozitia %dn", poz); } else { printf("Elementul nu s-a gasitn"); } return 0; }

Căutarea prin interpolare n n Similară cu căutarea binară Foloseşte altă formulă pentru calculul

Căutarea prin interpolare n n Similară cu căutarea binară Foloseşte altă formulă pentru calculul lui m: n n m=s+(x-tab[s])*(d-s)/(tab[d]-tab[s]) Inspirată după procedeul căutării într-o carte de telefon

Căutarea prin interpolare #include <stdio. h> int tab[8]={1, 2, 8, 12, 34, 66, 87,

Căutarea prin interpolare #include <stdio. h> int tab[8]={1, 2, 8, 12, 34, 66, 87, 92}; int cautare. Interpolare(int *tab, int dim, int x) { int s, d, m; s=0; d=dim-1; do { m=s+(x-tab[s])*(d-s)/(tab[d]-tab[s]); if(x>tab[m]) { s=m+1; } else { d=m-1; } } while((tab[m]!=x) && (s<d) && (tab[s]==tab[d]) && (x>=tab[s]) && (x<=tab[d]));

Căutarea prin interpolare if(tab[m]==x) { return m; } return 0; } int main() {

Căutarea prin interpolare if(tab[m]==x) { return m; } return 0; } int main() { int poz; poz=cautare. Interpolare(tab, 8, 66); //poz=cautare. Interpolare(tab, 8, 33); if(poz!=-1) { printf("Elementul s-a gasit pe pozitia %dn", poz); } else { printf("Elementul nu s-a gasitn"); } return 0; }

TDA Articol n n n Structură alcătuită dintr-o colecţie finită de elemente numite câmpuri;

TDA Articol n n n Structură alcătuită dintr-o colecţie finită de elemente numite câmpuri; Câmpurile pot aparţine unor tipuri diferite; Accesul la câmpuri se face prin identificatori;

Exemplu - cod C #include <stdio. h> #include <string. h> struct student { char

Exemplu - cod C #include <stdio. h> #include <string. h> struct student { char nume[20]; char prenume[20]; int varsta; }; struct student s 1, s 2; int main() { strcpy(s 1. nume, "Nedelcu"); strcpy(s 1. prenume, "Nicoleta"); s 1. varsta=21; strcpy(s 2. nume, "Dragan"); strcpy(s 2. prenume, "Cerasela"); s 2. varsta=21; printf("%s %s %dn", s 1. nume, s 1. prenume, s 1. varsta); printf("%s %s %dn", s 2. nume, s 2. prenume, s 2. varsta); return 0; }

TDA Mulţime n n Structură alcătuită din elemente ce aparţin unui tip ordinal finit

TDA Mulţime n n Structură alcătuită din elemente ce aparţin unui tip ordinal finit (tip de bază); Sunt membre ale unei mulţimi matematice;

TDA Mulţime – operaţii elementare n n n n n Depune. Multime(S, T) Egalitate.

TDA Mulţime – operaţii elementare n n n n n Depune. Multime(S, T) Egalitate. Multime(S, T) Apartine. Multime(S, e) Submultime(S, T) Reuniune(S, T) Intersectie(S, T) Diferenta(S, T) Multime. Vida(S) Creaza. Multime(e) Notaţii: S, T, V – mulţimi e – obiect (valoare) de tip de bază

TDA Secvenţă n n n Structură formată din elemente de acelaşi tip (tipul de

TDA Secvenţă n n n Structură formată din elemente de acelaşi tip (tipul de bază); Accesul la elemente este secvenţial şi se efectuează cu ajutorul unui pointer; La un moment dat este accesibil un singur element;

TDA Secvenţă – operaţii elementare n n n Notaţii: Rescrie(f) Depune. Secventa(f, e) f

TDA Secvenţă – operaţii elementare n n n Notaţii: Rescrie(f) Depune. Secventa(f, e) f – secvenţa Reset. Secventa(f) e – obiect (valoare) de tip de bază EOF(f) Furnizeaza. Secventa(f, e)

Exemplu - cod C #include <stdio. h> FILE *f; char buf[20]; int main() {

Exemplu - cod C #include <stdio. h> FILE *f; char buf[20]; int main() { if((f=fopen("fisier. txt", "wt"))==NULL) { printf("Eroare la creare fisier. . . "); return -1; } fprintf(f, "Buna_ziua_domnule_student!"); fclose(f); if((f=fopen("fisier. txt", "rt"))==NULL) { printf("Eroare la deschidere fisier. . . "); return -2; } while(!feof(f)) { fscanf(f, "%s", buf); printf("%s", buf); } fclose(f); return 0; }

Recapitulare Despre ce am discutat azi ? n 4 TDA: n n tablou, articol,

Recapitulare Despre ce am discutat azi ? n 4 TDA: n n tablou, articol, multime, secventa 3 algoritmi de cautare pe tablouri: n n liniara, binara, interpolare ultimii 2 functioneaza numai pe tablouri sortate