Informatică, întrebare adresată de happymarra4556, 8 ani în urmă

Să presupunem că lucrați pentru o companie care dezvoltă software pentru procesarea algebrică.
Sarcina dvs. este de a dezvolta un program pentru a face calcule cu seturi de numere întregi. Seturile tale ar putea avea
până la 10000 de elemente în care un element este un număr întreg în intervalul -108 ... 108
.

A. Este important să se proiecteze o reprezentare pentru seturi care să permită o implementare eficientă a setului
operațiuni. Să presupunem că alegeți să reprezenta un set de numere întregi ca o pereche formată din: (i) un număr întreg
reprezintă numărul de elemente stabilite; (ii) o matrice care stochează elementele setate.
Sarcina ta la acest pas este de a proiecta algoritmi O (m + n) pentru calculul uniunii și intersecției a
două seturi X și Y, cu m,respectiv n elemente.


CinevaFaraNume: Elementele sunt sortate?
happymarra4556: Nu precizeaza in enunț cum ca initial elementele ar fi sortate. Elementele care se vor stoca in array vor si sortate
CinevaFaraNume: Atunci se poate face doar cu vectori de frecventa in O(n+m)
happymarra4556: Este dificil de realizat?? Ar fi mai simplu daca elementele ar fi sortate initial? Bănuiesc ca se poate aborda si in acest mod problema atata timp cat nu e pusa nicio condiție
CinevaFaraNume: Se poate interclasa daca sunt sortati
CinevaFaraNume: Nu e dificil oricum
happymarra4556: M-am gândit si eu la o soluție de rezolvare,insa nu respectă O(m+n),si nu imi dau seama in ce mod as putea scrie pentru a respecta complexitatea

Răspunsuri la întrebare

Răspuns de CinevaFaraNume
1

Pentru uniune:

int frecv[218];

signed char rezultat[10000];

signed char* uniune(unsigned short int n, signed char* set1, unsigned short int m, signed char* set2){

for(unsigned short int i = 0; i < n; i++)// n iteratii

frecv[set1[i] + 108]++;

for(unsigned short int i = 0; i < m; i++)// m iteratii

frecv[set2[i] + 108]++;

int k = 0;

for(short int i = -108; i <= 108; i++){// 217 iteratii - constant

if(frecv[i+108])

rezultat[k++] = i;

}

return rezultat;

//Complexitate: O(n+m)

}

Pentru intersectie:

int frecv[218];

signed char rezultat[10000];

signed char* intersectie(unsigned short int n, signed char* set1, unsigned short int m, signed char* set2){

for(unsigned short int i = 0; i < n; i++)// n iteratii

frecv[set1[i] + 108] = 1;

for(unsigned short int i = 0; i < m; i++)// m iteratii

if(frecv[set2[i] + 108] == 1)

frecv[set2[i] + 108]++;

int k = 0;

for(short int i = -108; i <= 108; i++){// 217 iteratii - constant

if(frecv[i+108] == 2)

rezultat[k++] = i;

}

return rezultat;

//Complexitate: O(n+m)

}

Alte întrebări interesante