Sunteți pe pagina 1din 7

Condiţiile de evaluare la Laboratorul nr.

4 „Metode de acces la elementele


unui masiv” la SDMP
Punct
e
Sunt date dimensiunea masivului şi intervalele modificării indicilor.
Implementaţi 3 metode de acces la elementele masivului. Reprezentarea în
memoria operativă are loc pe coloane si pe linii.
2 - Metoda directă de acces la elementelele masivului.
3 - Metoda accelerata cu ajutorul vectorului definitoriu .
3 - Metoda de acces cu ajutorul vectorilor Iliffe.
1 Comparaţi metodele de acces după timpul de execuţie.
1 Comparaţi metodele de acces dupa memoria ocupată.

Metoda directă de acces la elementelele masivului.


#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
const int a=2,b=-4,c=0,d=-3;

int Dj(int i){

if (i==1) return 1; else


if(i==4){int h,l;h=2;l=c;return ((h-l+1)*Dj(i-1));} else
if(i==3){int h,l;h=-2;l=b;return ((h-l+1)*Dj(i-1));} else
if(i==2){int h,l;h=3;l=a;return ((h-l+1)*Dj(i-1));}
}

int main() {
int ar[2][3][3][3];
int test[54];

time_t t1,t2;

/* srand(time(NULL));

for(int i=0;i<54;i++)
ar[i]=rand()%RAND_MAX;*/

// for(int i=0;i<54;i++)
// cout<<ar[i]<<" ";

/* FILE *file=fopen("mas.txt","w+");

for(int i=0;i<54;i++)
fprintf(file,"%d ",ar[i]);
fclose(file);*/

FILE *f=fopen("mas.txt","r");
for(int i4=d;i4<=d+2;i4++)
for(int i3=c;i3<=c+2;i3++)
for(int i2=b;i2<=b+2;i2++)
for(int i1=a;i1<=a+1;i1++)
fscanf(f,"%d",&ar[i1][i2][i3][i4]);
fclose(f);

int h=0;
for(int i4=d;i4<=d+2;i4++)
{
cout<<endl<<endl;
for(int i3=c;i3<=c+2;i3++)
{
cout<<endl<<endl;
for(int i2=b;i2<=b+2;i2++)
{
cout<<endl;
for(int i1=a;i1<=a+1;i1++)
{
test[h++]=*(*(*(*(ar+i1)+i2)+i3)+i4);
cout<<*(*(*(*(ar+i1)+i2)+i3)+i4)<<" ";

}
}
}
}

t1=time(NULL);
int V,isk_i1,isk_i2,isk_i3,isk_i4;
cout<<endl<<endl<<"i1 = ";cin>>isk_i1;
cout<<"i2 = ";cin>>isk_i2;
cout<<"i3 = ";cin>>isk_i3;
cout<<"i4 = ";cin>>isk_i4;
cout<<"element = "<<ar[isk_i1][isk_i2][isk_i3][isk_i4];
// cout<<endl<<"D1 = "<<Dj(1);
//cout<<endl<<"D2 = "<<Dj(2);
//cout<<endl<<"D3 = "<<Dj(3);
//cout<<endl<<"D4 = "<<Dj(4);
//cout<<endl<<"S1 = "<<(isk_i1-a)*Dj(1);
//cout<<endl<<"S2 = "<<(isk_i2-b)*Dj(2);
//cout<<endl<<"S3 = "<<(isk_i3-c)*Dj(3);
//cout<<endl<<"S4 = "<<(isk_i4-d)*Dj(4);
V= (isk_i1-a)*Dj(1)+
(isk_i2-b)*Dj(2)+
(isk_i3-c)*Dj(3)+
(isk_i4-d)*Dj(4);

cout<<endl<<"V = "<<V;
t2=time(NULL);
cout<<endl<<endl<<"Timul 1 = "<<t1/3600<<" Timul 2 = "<<t2/3600;

cout<<endl<<"elementul in test "<<test[V];


//Dj= (h(j+1) - l(j+1) +1) * Dj+1
_getch();
return (EXIT_SUCCESS);
}

Rezultat:
.......
1647704 1647960
1648216 1648472
1648728 1648984

i1 = 2
i2 = -3
i3 = 0
i4 = -3
element = 1635928
V = 2

Timpul 1 = 406508 Timpul 2 = 406508


elementul in test 1635928
Metoda accelerata cu ajutorul vectorului definitoriu .

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
const int a = 2, b = -4, c = 0, d = -3;

int Dj(int i) {

if (i == 1) return 1; else
if (i == 4) { int h, l; h = 2; l = c; return ((h - l + 1)*Dj(i - 1)); }
else
if (i == 3) { int h, l; h = -2; l = b; return ((h - l + 1)*Dj(i -
1)); }
else
if (i == 2) { int h, l; h = 3; l = a; return ((h - l + 1)*Dj(i
- 1)); }
}

int main() {
int ar[3][4][4][4];
int op[100];
time_t t1, t2;

/* srand(time(NULL));

for(int i=0;i<54;i++)
ar[i]=rand()%RAND_MAX;*/

// for(int i=0;i<54;i++)
// cout<<ar[i]<<" ";

/* FILE *file=fopen("mas.txt","w+");

for(int i=0;i<54;i++)
fprintf(file,"%d ",ar[i]);
fclose(file);*/

int h = 14;
FILE *f = fopen("mas.txt", "r");
for (int i4 = d; i4 <= d + 2; i4++)
for (int i3 = c; i3 <= c + 2; i3++)
for (int i2 = b; i2 <= b + 2; i2++)
for (int i1 = a; i1 <= a + 1; i1++) {
fscanf(f, "%d", &ar[i1][i2][i3][i4]);
op[h++] = ar[i1][i2][i3][i4];
}
fclose(f);

op[0] = 4;
op[1] = 2;
op[2] = -4;
op[3] = 0;
op[4] = -3;
op[5] = 3;
op[6] = -2;
op[7] = 2;
op[8] = -1;
op[9] = Dj(1);
op[10] = Dj(2);
op[11] = Dj(3);
op[12] = Dj(4);
op[13] = a*Dj(1) +
b*Dj(2) +
c*Dj(3) +
d*Dj(4);

int V, isk_i[4];

for (int i = 0; i<4; i++) {


cout << "i" << i << " = "; cin >> isk_i[i];
}

cout << "Element = " << ar[isk_i[0]][isk_i[1]][isk_i[2]][isk_i[3]];


t1 = time(NULL);
int summa = 0;
for (int i = 0; i<op[0]; i++)
summa += isk_i[0] * op[i + 9];

summa -= op[13];

cout << endl << "Suma = " << summa;


cout << endl << "Elementul din lista = " << op[summa + 14];
t2 = time(NULL);
cout << endl << endl << "Timul 1 = " << t1 / 3600 << " Timpul 2 = " << t2 /
3600;

//Dj= (h(j+1) - l(j+1) +1) * Dj+1


_getch();
return (EXIT_SUCCESS);
}

Rezultat
...
i0 = 3
i1 = -3
i2 = 0
i3 = -2
Element = 1640792
Suma = 141
Elementul din lista = -858993460

Timul 1 = 406508 Timpul 2 = 406508

Metoda de acces cu ajutorul vectorilor Iliffe.

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
const int a = 2, b = -4, c = 0, d = -3;

int main() {
time_t t1, t2;

int ar[2][3][3][3];
int v[54];
/* srand(time(NULL));

for(int i=0;i<54;i++)
ar[i]=rand()%RAND_MAX;*/

// for(int i=0;i<54;i++)
// cout<<ar[i]<<" ";

/* FILE *file=fopen("mas.txt","w+");

for(int i=0;i<54;i++)
fprintf(file,"%d ",ar[i]);
fclose(file);*/

int h = 0;
FILE *f = fopen("mas.txt", "r");
for (int i4 = d; i4 <= d + 2; i4++)
for (int i3 = c; i3 <= c + 2; i3++)
for (int i2 = b; i2 <= b + 2; i2++)
for (int i1 = a; i1 <= a + 1; i1++) {
fscanf(f, "%d", &ar[i1][i2][i3][i4]);
v[h++] = ar[i1][i2][i3][i4];
}
fclose(f);
//[0..3][1..5][-1..0][2..5]//

int ****b;
int ***va1[3]; //***va1=new int[3];
int **va21[3];// va21=new int[3];
int **va22[3]; //va22=new int[3];
int **va23[3]; //va23=new int[3];

int *va311[3];//new int[3];


int *va312[3];//new int[3];
int *va313[3];//new int[3];

int *va321[3];//new int[3];


int *va322[3];//new int[3];
int *va323[3];//new int[3];

int *va331[3];//new int[3];


int *va332[3];//new int[3];
int *va333[3];//new int[3];

b = va1 + 3;
va1[0] = va21;
va1[1] = va22;
va1[2] = va23;

va21[0] = va311 + 4;
va21[1] = va312 + 4;
va21[2] = va313 + 4;

va22[0] = va321 + 4;
va22[1] = va322 + 4;
va22[2] = va323 + 4;

va23[0] = va331 + 4;
va23[1] = va332 + 4;
va23[2] = va333 + 4;

va311[0] = v - 2;
va311[1] = v;
va311[2] = v + 2;

va312[0] = v + 4;
va312[1] = v + 6;
va312[2] = v + 8;

va313[0] = v + 10;
va313[1] = v + 12;
va313[2] = v + 14;

va321[0] = v + 16;
va321[1] = v + 18;
va321[2] = v + 20;
va322[0] = v + 22;
va322[1] = v + 24;
va322[2] = v + 26;
va323[0] = v + 28;
va323[1] = v + 30;
va323[2] = v + 32;

va331[0] = v + 34;
va331[1] = v + 36;
va331[2] = v + 38;
va332[0] = v + 40;
va332[1] = v + 42;
va332[2] = v + 44;
va333[0] = v + 46;
va333[1] = v + 48;
va333[2] = v + 50;

int V, isk_i[4];

for (int i = 0; i<4; i++) {


cout << "i" << i << " = "; cin >> isk_i[i];
}

t1 = time(NULL);
cout << "Element = " << ar[isk_i[0]][isk_i[1]][isk_i[2]][isk_i[3]];
cout << endl << "Elementul in Iliffe = " << *(*(*(*(b + isk_i[3]) + isk_i[2]) +
isk_i[1]) + isk_i[0]);
t2 = time(NULL);

cout << endl << endl << "Timpul 1 = " << t1 / 3600 << " Timpul 2 = " << t2 / 3600;
_getch();
return (EXIT_SUCCESS);
}
Rezultat
...
i0 = 3
i1 = -3
i2 = 0
i3 = -2
Element = 1640792
Elementul in Iliffe = 1640792

Timpul 1 = 406508 Timpul 2 = 406508

Concluzie:
La accesarea directa a elementelor masivului se utilizeaza cel mai mic volum de meorie operativa
dar din cauza volumului mare de operatii, timpul de accesare este cel mai mare. In cazul accesarii
prin vector definitoriu numarul de operatii este redus dar volumul de memorie ocupat este ceva
mai mare ca in cazul accesarii directe in functie marimea matricei se cer celule de memorie de
numere intregi suplimentare si un pointer.
In cazul vectorulor Iliffe timpul de accesare este cel mai mic deoarece se reduce la minin numarul
de adunari la accesarea elementelor, dar volumul de memorie este cel mai mare deoarece împreună
cu fiecare matrice se păstrează şi o ierarhie de vectori, care au căpătat de denumirea vectori Iliffe.
Cu numele matricei se asociază un pointer cu adresa primului vector Iliffe deplasată în
corespondenţa cu valoarea de jos a primului indice în cazul aranjării “pe linii”, sau cu valoarea de
jos a ultimului indice în cazul aranjării “pe coloane”.

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

  • Cautaretabel
    Cautaretabel
    Document16 pagini
    Cautaretabel
    mamatata96
    Încă nu există evaluări
  • Recipisa
    Recipisa
    Document1 pagină
    Recipisa
    mamatata96
    Încă nu există evaluări
  • Scaner
    Scaner
    Document2 pagini
    Scaner
    mamatata96
    Încă nu există evaluări
  • Lucrare 4 Ana
    Lucrare 4 Ana
    Document2 pagini
    Lucrare 4 Ana
    mamatata96
    Încă nu există evaluări
  • Coronavirus PDF
    Coronavirus PDF
    Document1 pagină
    Coronavirus PDF
    mamatata96
    Încă nu există evaluări
  • Vector
    Vector
    Document15 pagini
    Vector
    mamatata96
    Încă nu există evaluări
  • Lucrare 4 Ana
    Lucrare 4 Ana
    Document14 pagini
    Lucrare 4 Ana
    mamatata96
    Încă nu există evaluări
  • Lucrare 4 Ana
    Lucrare 4 Ana
    Document2 pagini
    Lucrare 4 Ana
    mamatata96
    Încă nu există evaluări
  • Lucrare 4 Ana
    Lucrare 4 Ana
    Document14 pagini
    Lucrare 4 Ana
    mamatata96
    Încă nu există evaluări
  • Test 3 4 1
    Test 3 4 1
    Document2 pagini
    Test 3 4 1
    mamatata96
    Încă nu există evaluări
  • Metode de Căutare În Tabel
    Metode de Căutare În Tabel
    Document16 pagini
    Metode de Căutare În Tabel
    mamatata96
    100% (1)