Sunteți pe pagina 1din 23

Algoritmi, Structuri de date şi

Complexitate

Tema: Masive (tablouri) dreptunghiulare.


Accelerarea accesului la elementele tablourilor.
Metode de acces la elementele unui tablou.

Ludmila NOVAC
Dr., conf. univ.
Dep. Informatică
Unităţi de conţinut
1. Masive (tablouri) dreptunghiulare. Reprezentarea tablourilor
în MO. Reprezentarea tablourilor „pe linii” şi „pe coloane”.
Accesarea elementelor.
2. Accelerarea accesului la elementele masivelor (tablourilor).
Vectori definitori.
3. Vectori Iliffe. Definirea vectorilor Iliffe şi accesarea
elementelor. Exemplu de clasă generică dotată cu vectori lui
Iliffe.
Tablouri unidimensionale
• Forma generală de declarare a unui tablou unidimensional este:
Tip_elemente nume_tablou[dimensiune];
Unde: - tip_elemente – declară tipul de bază al tabloului, tipul fiecărui element al
tabloului;
- dimensiune - specifică numărul de elemente ale tabloului;
- nume_tablou – este numele dat tabloului.

Declararea tabloului t cu 10 elemente de tip int se face: int t[10].


Adresarea la elementele tabloului se face direct t[0], t[1], t[2],… , t[9].
Un element al tabloului este accesat prin indexarea numelui tabloului cu poziţia
(indexul) elementului în cadrul tabloului. Primul element al tabloului are indexul 0.
Pentru a indexa un tablou, trebuie specificat numele tabloului urmat de indexul
elementului între paranteze pătrate. De ex. elementul al 2-lea este t[1], etc..
Tabloul bidimensional
• Tabloul bidimensional este o structură de date în care fiecărui element îi
este asociată o pereche de indici, primul precizând numărul de ordine al
liniei în care se află elementul, iar cel de-al doilea indică numărul de ordine
al coloanei. Oricărui tablou bidimensional i se alocă spaţiu de memorie într-
o zonă continuă de memorie, elementele aflându-se în locaţii succesive de
memorie aşezate linie după linie.

• Un tablou bidimensional având 3 linii şi 4 coloane se va reprezenta în


memorie astfel:

Accesarea elementului de pe linia i şi coloana j se va face prin indicarea


numelui tabloului şi a indicilor de poziţionare (al liniei i şi al coloanei j ):
t[i] [j] .
Tablouri bidimensionale
Tabloul bidimensional este cunoscut şi sub denumirea de matrice. Matricea este un
tablou cu două dimensiuni, sau vector de vector. Forma generală de declarare a unui
tablou bidimensional este:
Tip nume [dim1] [dim2];
Unde: - tip – este tipul de bază al tabloului, tipul fiecărui element al tabloului;
- dim1, dim2 – constante întregi care specifică numărul de elemente
pentru fiecare dimensiune a tabloului;
- nume – este numele dat tabloului.
Cele două dimensiuni ale tabloului nu se separa prin virgula, fiecare
dimensiune este plasată între paranteze pătrate. Pentru a declara o matrice
Matr cu 5 linii şi 10 coloane de tip întreg vom scrie: int Matr [5] [10].
Numerotarea elementelor se face de la 0.
Accesarea elementului de pe linia 3 şi coloana 7 se va face prin indicarea
numelui tabloului şi a indicilor de poziţionare (al liniei şi al coloanei minus o
unitate): Matr [2] [6].
Tablouri unidimensionale şi bidimensionale
Exemplu de tablou bidimensional
Tablouri multidimensionale
• În general o declaraţie de tipul: B[n1..m1][n2..m2]…[nk..mk] reprezintă
definirea unui tablou multidimensional abstract,

unde: ni şi mi sunt limitele inferioară şi superioară respectiv a indicelui i,


(i=1,k). Limitele ni şi mi (i=1,k) sunt expresii constante.

Definiţie Prin expresie constantă vom înţelege o expresie care poate fi


evaluată la compilare în momentul întâlnirii ei de către compilator.
Mulţimea elementelor unui tablou este: B={b[i1,i2,…ik], ij€[nj, mj], j=1,k}

• În limbjul C un tablou multidimensional se reprezintă în felul următor:


• Tip nume[m1][m2]…[mk];

• Tablourile multidimensionale se păstrează în memoria calculatorului pe un


domeniul continuu. Mărimea zonei de memorie este determinată de tipul de
bază şi numărul elementelor matricei. Principiul de repartizare a
elementelor matricei în memorie depinde de limbajul de programare. Spre
exemplu în C elementele se repartizează pe linii, adică indicele se schimbă
de la dreapta la stânga. Numărul de octeţi ocupat de un masiv
multidimensional este:
• ByteSyze = lim1*lim2*..limN*SyzeOf(Tip)
Tablourile multidimensionale
• În limbajul C, numele unui tablou este o variabilă care are ca
valoare adresa primului său element. La întâlnirea unei declaraţii de
tip tablou, compilatorul alocă o zonă de memorie necesară pentru a
păstra valorile elementelor sale.
• Numele tabloului respectiv poate fi utilizat în diferite expresii
valoarea lui este chiar adresa de început a zonei de memorie
care i-a fost alocată.

Exemplu:
• 1) int vect[10]: Se defineşte tabloul vect de 10 elemente de tip int. Pentru
acest tabel se alocă 10*2=20 octeţi. vect este o variabilă a cărui valoare
este adresa primului său element, adică adresa lui vect[0]. Deci vect[0] are
ca valoare, valoarea primului element al tabloului, iar vect are ca valoare
adresa acestui element.
• 2) double dmat[10][50] – este o matrice de 10 linii şi 50 coloane.
Compilatorul rezervă 10*50*8=4000 octeţi. La elementele acestui tablou se
referă prin dmat[0][0], dmat[0][1], ... . dmat are ca valoare adresa
elementului dmat[0][0].
Exemplu de tablou tridimensional
(multidimensional)
Reprezentarea tablourilor în memoria operativă
• În memoria calculatorului masivele (tablourile), aproape întotdeauna, sunt
reflectate în vectori. În continuare vom cerceta numai reprezentarea
tablourilor prin vectori.
• Tabloul unidimensional B cu intervalul indicelui [l, h], l≤h, în mod normal se
reflectă în vector astfel: B[i] → V[i-l], i=l, l+1, …, h,
unde V este adresa de început (de alocare) a vectorului în MO, adică V este
adresa de bază, iar i-l este deplasarea spre elementul cu indicele i.
• Dacă adresa elementului A[i] este &A[i], atunci ea poate fi calculată după
formula:
• &A[i]=A+Sizeof (TipElemente)*i, i=0,..n-1.

• Tablourile multidimensionale (matricele dreptunghiulare) de dimensiuni


mai mari de 1, de obicei se reflectă în vectori prin una din următoarele două
metode:
1. Mai repede se schimbă ultimul indice (aşa-numită metodă “pe linii”);
2. Mai repede se schimbă primul indice (aşa-numită metodă “pe coloane”).
Denumirea provine de la matricea de dimensiune 2.
Exemplu. Repartizarea elementelor
pe linii şi pe coloane

Pentru n=2 considerăm tabloul B[1..2, 3..5] vom avea


următoarea reprezentare după coloane:
B[1,3], B[2, 3], B[1, 4], B[2, 4], B[1, 5], B[2, 5].
şi după linii:
B[1,3], B[1, 4], B[1, 5], B[2,3], B[2, 4], B[2, 5].

După linii:
Metode de acces la elementele unui tablou

Accesul la elementele unui tablou multidimensional poate


fi efectuată prin diferite metode:

• Accesul direct la elementele tabloului,


• Accesul prin metoda Vectorului Definitor,
• Accesul prin metoda vectorilor Iliffe.
Reprezentarea logică a matricelor “pe linii”
Exemplu: Fie A tabloul de dimensiunea 3 cu intervalele indicilor:
• [2, 4] pentru i1; [-3,-1] pentru i2; [0, 1] pentru i3.
• În total tabloul A va avea 3×3×2=18 elemente, care vor fi alocate în memoria
operativă începând de la o adresă oarecare V în felul următor:

Observăm că ultimul indice se schimbă mai des.


Structura logică a tabloului 3-dimensional A este următoarea:

Adică tabloul A reprezintă trei tablouri bidimensionale 3×2.


Reprezentarea logică a matricelor “pe coloane”
Exemplu: Fie A tabloul de dimensiunea 3 cu intervalele indicilor:
• [2, 4] pentru i1; [-3,-1] pentru i2; [0, 1] pentru i3.
• În total tabloul A va avea 3×3×2=18 elemente, care vor fi alocate în memoria
operativă începând de la o adresă oarecare V în felul următor:

Structura logică a matricei A este următoarea:

De data aceasta, matricea A reprezintă două matrice bidimensionale 3×3.


Adresarea elementelor tabloului
• Adresarea este o operaţie importantă pentru accesul unui element al tabloului.
Adresarea unui element se realizează prin numele tabloului şi indicii respectivi.
Deoarece tabloul e reprezentat în memoria calculatorului printr-un vector
adresarea unui element se face prin adresa de bază, indicii elementelor şi tipul
elementelor.
• Fie dat tabloul B[n1..,m1][n2..m2]…[nk..mk]

unde Dj depinde de modul de repartizare a matricei.


Dacă repartizarea e pe linii (se schimbă mai des ultimul indice)

• Dj=(mj+1-nj+1+1)*Dj+1, unde j=k-1,…1, Dk=1


şi pentru repartizarea pe coloane (se schimbă mai des primul indice):
• Dj=(mj-1-nj-1+1)*Dj-1, unde j=2,…k, D1=1
Metoda de acces direct la elementele tabloului
Considerăm tabloul B [l1..h1][l2..h2][l3..h3][l4..h4].
Calculăm numărul de blocuri de elemente consecutive:
• Pe coloane:
D1= 1, Dj= (hj-1-lj-1 +1)*D j-1 , j=2,…,n
D2= (h1-l1+1)*D1
D3= (h2-l2+1)*D2
D4= (h3-l3+1)*D3
• Pe linii:
D4= 1, Dj= (hj+1-lj+1 +1)*D j-1 , j=n,…,2
D3= (h4-l4+1)*D4
D2= (h3-l3+1)*D3
D1= (h2-l2+1)*D2
B [-7..-5][1..2][-8..-6][0..3].
Exemplu: Considerăm tabloul
Pe coloane: D1= 1, D2= 3, D3= 6, D4= 18,
Pe linii: D4= 1, D3= 4, D2= 12, D1= 24.
Aceleaşi rezultate se vor obţine şi pentru tabloul: B [-3..-1][1..2][-1..1][0..3].
Accesarea elementului –alocarea ”pe linii”
În cazul general pentru, o matrice de dimensiune n cu elementele alocate “pe
linii”, cu intervalele indicilor:

care se calculează în ordinea inversă, după următoarea formulă


recurentă:
Accesarea elementului - alocarea
”pe linii”
Exemplul: vom considera:
Amintim că n=3,
Determinarea elementului din tablou

În tabelul următor este arătat câte operaţii de tipul ’+’ şi câte operaţii de
tipul ’×’ trebuie de efectuat accesând un element al matricei A:
Accesarea elementului – alocarea
”pe coloane”
În cazul general pentru, o matrice de dimensiune n cu elementele alocate “pe
linii”, cu intervalele indicilor:

care se calculează în ordinea directă, după următoarea formulă


recurentă:
Accesarea elementului - alocarea
”pe coloane”
Exemplul: vom considera:
Amintim că n=3,
Determinarea elementului din tablou

Este evident, cantitatea operaţiilor de tipul ’+’ şi operaţiilor de tipul ’×’


efectuate la accesarea elementului A[i1, i2,…, in] este aceeaşi ca şi în
cazul aranjării “pe linii”.

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