xSiRON

PROG2-2_Set_05-04-2016

Apr 5th, 2016
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. // Array dinamico
  2.  
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. class Set{
  7. private:
  8.     int *A;
  9.     int size;           // numero di elementi
  10.     int length;         // dimensione dell'array
  11.     void raddoppia();   // raddoppia la dimensione dell'array e copia gli elementi
  12.  
  13. public:
  14.     Set();
  15.     Set* insert(int x);
  16.     void del(int pos);
  17.     void print();
  18.     int search(int x);
  19.     int is_empty();
  20.     int get_size();
  21. };
  22.  
  23. Set::Set(){
  24.     this->length = 1;
  25.     this->size = 0;
  26.     A = new int[1];
  27. }
  28.  
  29. void Set::raddoppia(){
  30.     int *B = new int[length*2];
  31.     for(int i = 0; i < size; i++) B[i] = A[i];
  32.     delete [] A;
  33.     A = B;
  34.     length *= 2;
  35. }
  36.  
  37. int Set::get_size(){ return size; }
  38. int Set::is_empty(){ return !size; }
  39.  
  40. int Set::search(int x){
  41.     for(int i = 0; i < size; i++) if(A[i] == x) return i;
  42.     return -1;
  43. }
  44.  
  45. void Set::del(int pos){
  46.     if(pos < 0) return;
  47.     A[pos] = A[--size];
  48. }
  49.  
  50. // in questo modo posso richiamare la funzione insert in cascata
  51. Set* Set::insert(int x){
  52.     if(size == length) raddoppia();
  53.     A[size++] = x;
  54.     return this; // ritorno il puntatore all'oggetto che ha generato la chiamata
  55. }
  56.  
  57. void Set::print(){
  58.     cout << "[" << length << ", " << size << "] ";
  59.     for(int i = 0; i < size; i++)
  60.         cout << A[i] << " ";
  61.     cout << endl;
  62. }
  63.  
  64. int main(){
  65.     Set *s = new Set();
  66.    
  67.     s->insert(5)->insert(2)->insert(1)->insert(6);
  68.     s->print();
  69.  
  70.     cout << s->search(1) << endl;
  71.  
  72.     s->del(s->search(1)); // cerco il valore 1 e lo elimino (se esiste)
  73.     s->print();
  74.  
  75.     return 0;
  76. }
  77.  
  78. /*
  79.     Come ingrandire l'array ogni volta che viene superata la dimensione massima
  80.  
  81.     9 3 11 1 7 5 13 2
  82.                                                 } O(n)
  83.     - - - - - - - - - - - - - - - - - -
  84.  
  85.     Devo copiare m elementi da un vettore all'altro:
  86.     m operazioni ( complessità O(m) )
  87.  
  88.     1 -> O(1)
  89.     2 -> O(2)
  90.     3 -> O(3)
  91.     .
  92.     .
  93.     .
  94.     .
  95.     m -> O(m)
  96.  
  97.     Questo algoritmo non è molto efficiente... la sua complessità è infatti data da:
  98.     sommatoria per i = 1 a m di i = O(m^2)
  99.  
  100.     in realtà la complessità non è proprio m^2 perché la funzione
  101.     raddoppia non sempre viene utilizzata...
  102.  
  103.     [x] (2)
  104.  
  105.     [x] (1) [x] (2)
  106.  
  107.     [x] (0) [x] (0) [x] (2) [x] (2)
  108.  
  109.           ALGORITMO           MEDIA
  110.     1 _                     1 _ _ _
  111.     2 _ _                   2 _ _ _
  112.     3 _ _ _                 3 _ _ _
  113.     4 _                     4 _ _ _
  114.     5 _ _ _ _ _             5 _ _ _
  115.     6 _                     6 _ _ _
  116.     7 _                     7 _ _ _
  117.     8 _                     8 _ _ _
  118.     9 _ _ _ _ _ _ _ _ _     9 _ _ _
  119.  
  120.     Il tempo per ogni operazione varia da molto poco a tanto però in media il tempo
  121.     di esecuzione è di 3 unità di tempo computazionale
  122.  
  123.     Complessità O(3m) -> O(m)
  124.  
  125.     nel caso della cancellazione prima di rimpicciolire l'array devo
  126.     arrivare ad un quarto della sua dimensione.
  127.    
  128. */
Add Comment
Please, Sign In to add comment