Sunteți pe pagina 1din 9

6 STRUCTURI DE DATE 6.1 Tipuri ]i structuri Un sistem de calcul este programat pentru prelucrarea instruc\iunilor.

Un program este un ansamblu de instruc\iuni ]i date. #n capitolele precedente au fost introduse conceptele esen\iale ale program[rii, instruc\iuni @n cod ma]in[ ]i limbaje de programare. Prezentul capitol se refer[ la organizarea informa\iilor de prelucrat @n memoria calculatorului. Sistemul de calcul define]te la nivel hardware un set de instruc\iuni elementare ]i c`teva reprezent[ri ale datelor elementare. O dat[ structurat[ se poate defini ca fiind o colec\ie de date elementare. O astfel de colec\ie se mai nume]te structur[ de date. Structurile de date au ap[rut la nivelul limbajelor de programare evoluate care definesc structuri abstracte asupra instruc\iunilor, de exemplu, macrodefini\ii, proceduri, func\ii, subprograme, etc. Ele definesc de asemenea structuri de date precum variabile dubl[ precizie, numere complexe, vectori, ]iruri de caractere etc. Structurile de date sunt construite pornind de la datele elementare realizate la nivel ma]in[. Utilizatorul poate s[ lucreze ]i cu informa\ii mai complexe , deci la un nivel superior de abstractizare, f[r[ s[ \in[ seama de detaliile implement[rii fizice a acestor structuri care sunt ascunse de limbajul de programare ]i software-ul asociat (traduc[tor, interpretor, etc.). Utilizatorul poate defini structuri de date ]i mai complexe (arbori, tabele, liste, etc.) utiliz`nd datele structurate la nivelul limbajului de programare. Pentru a introduce o nou[ structur[ abstract[ se procedeaz[ astfel : - se define]te structura informa\iei; - se definesc opera\iile aplicabile acelei structuri; - se lucreaz[ cu aceast[ informa\ie structurat[ la acest nivel de abstractizare, f[r[ a se \ine seam[ de detaliile de implementare; Exist[ un mare num[r de structuri de date. Vom prezenta c`teva exemple dintre structurile cele mai utilizate : vectori, tablouri, liste, arbori, cozi, stive ]i tabele. Exemple de structuri de date @nt`lnite la diferite nivele de abstractizare sunt prezentate @n figura urm[toare:

Arbori
Nivel aplica\ie

Stive LIFO

Fi]iere

Tabele

Cozi FIFO

Liste

Mul\imi Nivel limbaj

#nregistr[ri

Tablouri Vectori

Variabile logice

Variabile @ntregi

Variabile reale

Variabile caracter

Memorie

Numere @n virgul[ mobil[


Numere @ntregi

Nivel ma]in[

Cuvinte Octe\i Bi\i

Registre

Vectori Vectorii [vectors] sunt structuri foarte utile, folosite de majoritatea limbajelor de programare (procesoarele vectoriale suport[ vectorii la nivel hardware). Un vector este o mul\ime finit[ ]i ordonat[ de elemente, toate de acela]i tip. El este definit prin num[rul de elemente, ca ]i prin tipul ]i

m[rimea lor, stabilindu-se o coresponden\[ imediat[ @ntre structura abstract[ ]i organizarea @n memorie. Figura urm[toare prezint[ schematizat structura unui vector: 1 2 3 4 5 6 7 n-1 n

Tablouri

Un tablou [array] este o colec\ie multidimensional[ de obiecte de acela]i tip. Un tablou cu o singur[ dimensiune este un vector. Fiecare element al tabloului este reperat printr-un set de indici [subscripts]. Accesul la informa\ia con\inut[ @ntr-un tablou este deci aleator. Realizarea unui tablou multidimensional utilizeaz[ vectori, iar specificarea dimensiunilor necesit[ o declara\ie @n cadrul programului.
Liste Listele [lists] sunt structuri suple capabile s[ con\in[ un num[r nedeterminat de obiecte. Dac[ fiecare obiect este accesibil prin cel precedent datorit[ unui pointer, atunci avem de a face cu o list[ legat[ sau @nl[n\uit[ [linked list]. Un astfel de exemplu este prezentat @n figura urm[toare:

Pointer c[tre elementul urm[tor

element

element

element

Exist[ de asemenea liste dublu @nl[n\uite care pot fi parcurse @n ambele sensuri, fiecare element fiind compus dintr-un obiect ]i doi pointeri. Evident, realizarea unei astfel de liste se bazeaz[ pe no\iunea de pointer. Se spune c[ un pointer @nl[n\uie]te elementele sau pointeaz[, asupra unui element. Pointerul este o variabil[ a c[rei valoare corespunde unei adrese. Schimb`nd un pointer, se poate insera un nou element @ntr-o list[, iar prin simpla modificare a pointerilor se pot suprima elemente dintr-o list[.

Arbori Arborele este o structur[ constituit[ din noduri legate prin arce. Fiecare nod con\ine un obiect al colec\iei. Arborele este o structur[ ierarhic[. #n v`rf exist[ un nod numit r[d[cin[, de la care pornesc ramurile, c[tre nodurile nivelului inferior. Nodurile terminale se numesc frunze. Arborele binar este un caz particular @n care fiecare nod posed[ cel mult dou[ ramuri c[tre nodurile nivelului inferior. Implementarea @n memorie a unui arbore se poate realiza cu ajutorul pointerilor. Fiec[rui nod @i corespunde un ansamblu de cuvinte de memorie care con\in datele ]i pointerii reprezent`nd ramurile care pleac[ din nod. Cozi O coad[ este un fir de a]teptare (FIFO = First In First Out). Inser[rile se realizeaz[ la o extremitate iar extragerile se fac la cel[lalt cap[t. Realizarea este posibil[ cu ajutorul unui vector ]i a doi pointeri. Pentru a evita deplasarea cozii @n memorie, se poate defini o zon[ de memorie circular[, adic[ prima adres[ s[ urmeze dup[ ultima adres[. Un pointer pointeaz[ asupra ultimului element din coad[, unde se adaug[ datele, iar al doilea pointer indic[ primul element, unde se extrag datele. Stive O siv[ [LIFO = Last In First Out] este o structur[ liniar[ particular[, @n care datele sunt ad[ugate sau extrase la o extremitate predeterminat[. Stiva este una dintre structurile cele mai importante ]i mai utilizate (de exemplu: recursivitate, @ntreruperi multinivel, ma]in[ pe 0 adrese etc.). Implementarea @n memorie a unei stive se poate face cu ajutorul unui vector ]i a unui pointer care indic[ v`rful stivei, unde datele sunt depuse sau de unde sunt extrase. Tabele #n capitolul precedent am descris tabelele utilizate de asamblor ]i compilator pentru p[strarea simbolurilor ]i valorilor corespunz[toare. Se poate defini o tabel[ ca o structur[ @n general neordonat[ de date de acela]i tip, unde fiecare dat[ are asociat[ o informa\ie unic[ numit[ cheie ]i care serve]te la identificarea elementului tabelei. De exemplu, dac[ vom considera o agend[ telefonic[, cheia este numele abonatului iar informa\iile asociate pot fi adresa ]i num[rul de telefon.

C[utarea unui element @n tabel[ se realizeaz[ prin specificarea cheii. De]i au fost elaborate mai multe metode de c[utare @n tabele, nu exist[ o tehnic[ universal[ ]i optimal[, alegerea depinz`nd de tipul ]i talia tabelei, precum ]i de specificul utiliz[rii sale. Vom prezenta trei algoritmi de c[utare @n tabele utiliza\i frecvent @n programare: c[utarea liniar[, c[utarea binar[ ]i adresajul dispersat. C[utarea liniar[ Tabelele de simboluri, construite @n timpul primei treceri ale unui asamblor ]i @n timpul fazelor de analiz[ lexical[ ]i sintactic[ ale unui compilator, asociaz[ numele simbolic al unei variabile sau al unui identificator oarecare utilizat drept cheie a tabelei un anumit num[r de atribute, ca de exemplu: tip, adres[, protec\ie, etc. Atunci c`nd traduc[torul @nt`lne]te un simbol, el trebuie s[ verifice dac[ exist[ deja @n tabel[, altfel trebuie s[ stabileasc[ o nou[ intrare @n tabel[. Deoarece nici simbolurile ]i nici ordinea de prezentare nu sunt cunoscute @n prealabil, traduc[torul introduce datele @n tabel[, pe m[sur[ ce @nt`lne]te noi simboluri @n programul surs[, deci tabela este nesortat[. Pentru a g[si un element @n tabel[ se poate utiliza metoda de c[utare liniar[. Este cea mai simpl[ metod[, dar ]i cea mai pu\in performant[. Ea const[ @n a parcurge tabela @ncep`nd cu primul element ]i compar`nd fiecare nume cu cheia de c[utare. Cu o tabel[ de n elemente, timpul mediu de c[utare este propor\ional cu n / 2. Dezavantajul unei astfel de metode este deci num[rul mare de compara\ii. Avantajele se refer[ la u]urin\a de realizare, aplicarea ei pentru tabele nesortate (sortarea unei tabele ia mult timp) ]i faptul c[ pot fi efectuate c[ut[ri @n timpul @nc[rc[rii tabelei. C[utarea binar[ Printre tehnicile rapide, dar care impun existen\a unei tabele ordonate, se poate cita c[utarea binar[ sau dihotomic[ [binary search]. Ideea const[ @n a considera cheile ca fiind uniform distribuite ]i deci de a @ncepe c[utarea prin compararea cheii date cu cea plasat[ @n mijlocul tabelei. Aceast[ comparare permite eliminarea dintr-o dat[ a unei jum[t[\i a tabelei. Se poate continua @n acela]i mod aplic`nd metoda pentru elementele r[mase ].a.m.d. Metoda converge rapid ]i durata c[ut[rii este propor\ional[ cu log2(n). Avantajul acestei tehnici provine din num[rul redus de compara\ii necesare pentru a g[si obiectul dorit. Pentru o tabel[ cu 1000 de date,

c[utarea binar[ va putea g[si orice cheie din 10 compar[ri, @n timp ce c[utarea liniar[ ar necesita @n medie 500 de compar[ri. Figura urm[toare prezint[ comparativ cele dou[ c[ut[ri ]i se observ[ c[ metoda de c[utare liniar[ necesit[ 13 compar[ri @n timp ce metoda compar[rii binare necesit[ doar 4 compar[ri ale cheii (caut[: mmmmm).
C[utare liniar[ Tabela nesortat[
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ccccc ggggg zzzzz sssss eeeee hhhhh kkkkk lllll qqqqq aaaaa ddddd fffff wwwww mmmmm ooooo ttttt bbbbb rrrrr uuuuu

Tabela sortat[
aaaaaa bbbbb Ccccc ddddd Eeeee Fffff ggggg hhhhh Iiiii Jjjjj kkkkk Lllll mmmmm nnnnn ooooo ppppp qqqqq Rrrrr Sssss 2 3 4 1

C[utare binar[

Adresaj dispersat O solu\ie ideal[ ar fi ca s[ existe un mecanism de c[utare rapid[ care s[ nu impun[ ca tabela s[ fie ordonat[. Memoriile asociative realizeaz[ o c[utare paralel[ pe toate cheile, dar o memorie asociativ[ de mare capacitate este costisitoare. Pentru simularea comportamentului unei memorii asociative (acces aleator) se poate utiliza metoda de adresaj dispersat (hashing, hash code). Aceast[ tehnic[ foarte utilizat[ const[ @n eviden\ierea unei func\ii de hashcode, care se aplic[ cheii ]i furnizeaz[ o adres[ sau un indice @n tabela asociat[. Func\ia de hashcode este important[, ea trebuie s[ furnizeze adrese destul de uniform distribuite @n intervalul de adrese disponibile. Dac[ aplicarea func\iei de hashcode asupra a dou[ nume de simboluri alese drept cheie d[ acela]i rezultat, adic[ cele dou[ obiecte ar trebui s[ fie plasate la aceea]i adres[, spunem c[ s-a realizat o coliziune. O bun[ func\ie de hashcode trebuie s[ genereze un num[r minim de coliziuni. Este foarte clar c[ spa\iul de adrese din cadrul tabelei trebuie s[ fie suficient pentru a con\ine toate obiectele. Pentru rezolvarea coliziunilor se pot utiliza mai multe strategii: liste @nl[n\uite pentru adresarea obiectelor implicate, fiecare list[ s[ @nceap[ la adresa comun[; repetarea calculului de adres[ cu o a doua func\ie de hashcode; plasarea obiectului care g[se]te locul ocupat la adresa urm[toare sau la prima adres[ disponibil[ (presupune o tabel[ generos dimensionat[, ]i @n plus o c[utare liniar[). Metoda adresajului dispersat permite stabilirea unei rela\ii func\ionale cheie-adres[, de aceea c[utarea @n tabele se limiteaz[ la o singur[ comparare (except`nd coliziunile) dup[ calculul adresei cu ajutorul func\iei de hashcode. 6.2 Fi]iere ]i de baze de date Structurile de date prezentate sunt adaptate organiz[rii memoriei centrale, adresabile prin cuvinte sau octe\i. Fi]ierele sunt o structur[ adaptat[ memoriilor auxiliare (unit[\i de band[ ]i discuri magnetice). Un fi]ier este o colec\ie de date reprezent`nd o entitate pentru utilizator. #n mediul informatic, datele unui fi]ier sunt @nregistrate astfel @nc`t s[ fie facilitat[ citirea ]i prelucrarea acestora cu calculatorul. #n acest

context, un fi]ier este deci o colec\ie de date, rezultate, un text, un program surs[, un program binar executabil etc. Un fi]ier este conceput ca o colec\ie de @nregistr[ri. Prezentarea detaliat[ a conceptului de fi]ier va fi realizat[ @n capitolul urm[tor. O baz[ de date este un ansamblu structurat de date. Con\inutul unei baze de date este cunoscut sub numele de banc[ de date. O baz[ de date permite regruparea ]i centralizarea informa\iilor necesare diverselor aplica\ii @n vederea unei mai bune repartiz[ri. Din punct de vedere logic, o baz[ de date (BD) [data base] este constituit[ din mul\imea informa\iilor relative la un subiect dat. Aceast[ mul\ime trebuie s[ respecte urm[toarele criterii: - exhaustiviate : informa\ii complete despre un subiect dat; - neredondan\[ : unicitatea informa\iilor @n baza de date; - structur[ : asigur[ o bun[ gestionare a bazei de date. Din punct de vedere fizic, o baz[ de date este o virtualizare a no\iunii de fi]ier. #n general, bazele de date sunt stocate pe discuri magnetice ]i gestiunea lor se efectueaz[ direct asupra discurilor. O baz[ de date este implementat[ cu fi]iere dar acest aspect nu este transparent pentru utilizatori. Stocajul fizic al unei baze de date const[ @ntr-o mul\ime de @nregistr[ri fizice organizate cu ajutorul listelor, pointerilor ]i diverselor metode de indexare. Opera\iile care se pot efectua asupra unei baze de date sunt : - interogare sau consultare; - actualizare; - inserare; - suprimare. Pentru efectuarea acestor opera\ii sunt necesare programe adecvate, reunite sub denumirea de Sistem de gestiune de baze de date (SGBD) [DBMS : DataBase Management System]. Un aspect important al bazelor de date actuale este independen\a datelor fa\[ de aplica\ii, ceea ce constituie principalul obiectiv al bazelor de date. #n vederea asigur[rii unei accesibilit[\i sporite a informa\iilor se realizeaz[ o separare @ntre problemele de stocaj ]i @ntre\inere, pe de o parte, ]i problemele de prelucrare ale utilizatorilor, pe de alt[ parte, realiz`ndu-se astfel o independen\[ @ntre date ]i metodele de acces. Pentru simplificarea problemelor de acces s-au elaboart mai multe modele logice de baze de date: modelul ierarhic, modelul re\ea, modelul rela\ional ]i modelul pe obiecte.

Modelul ierarhic const[ @n organizarea datelor de manier[ arborescent[, ceea ce constituie o structur[ simpl[ care este o ierarhie @n care fiecare element nu are dec`t un superior, f[r[ a exista conexiuni @ntre ramurile de pe acela]i nivel. Modelul re\ea este o extensie a modelului precedent deoarece permite stabilirea conexiunilor @ntre elemente diferite. #n acest mod se poate realiza un mare num[r de interog[ri posibile, dar acestea trebuiesc prev[zute la construirea bazei de date. #n aceast[ clas[ de SGBD, modelul CODASYL este unul din cele mai r[sp`ndite. Modelul rela\ional (de exemplu: SGBD Ingres, SQL/DS, Oracle, Informix, Access etc.) permite eliminarea constr`ngerii de cunoa]tere @n avans a interog[rilor care se vor efectua, permi\`nd stabilirea conexiunilor @n momentul execu\iei. Datele sunt stocate sub form[ de rela\ii @n tabele, iar accesul la informa\ii se efectueaz[ prin aplicarea celor trei opera\ii de baz[: selec\ia, proiec\ia, compunerea. Selec\ia const[ @n extragerea dintr-o rela\ie a acelor elemente care satisfac o condi\ie. Proiec\ia permite izolarea unui num[r de coloane dorite. Compunerea produce noi tabele pornind de la tabele existente. Bazele de date permit definirea unei structuri logice deasupra structurii fizice (cea de fi]iere pe disc) care nu este adaptat[ manipul[rii datelor. Interfa\a dintre o aplica\ie ]i o baz[ de date este efectuat[ cu ajutorul limbajelor specifice, dintre care cel mai cunoscut este SQL. Limbajul SQL [Structured Query Language] este un limbaj standard de definire ]i manipulare a datelor din bazele de date rela\ionale. Modelul pe obiecte este un sistem de baze de date orientate obiect [OODB-Object Oriented DataBases]. Principiul acestui nou model este relativ simplu, el const[ @n a utiliza acelea]i structuri de date @n aplica\ie ]i @n baza de date, realiz`nd astfel o coresponden\[ direct[ @ntre aplica\ie ]i baza de date. Aceste structuri de date sunt clase de obiecte ]i baza de date este o baz[ de obiecte. Obiectele bazei de date sunt obiecte persistente ]i care beneficiaz[ de polimorfism ]i mo]tenire ceea ce garanteaz[ o bun[ flexibilitate. Conceptul de obiect a dat na]tere unei noi tehnologii care se aplic[ @n numeroase domenii, de exemplu: limbajele de programare, sistemele de operare ]i bazele de date.

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