Advertisement
fcamuso

Algoritmi lezione 10

Feb 17th, 2024 (edited)
1,055
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.14 KB | None | 0 0
  1. //raccolta funzioni aggiornata (a seguire il main)
  2. //utility.h  (include brutale)
  3. //versione 27-2-24
  4. string genera_stringa_casuale(int lunghezza) {
  5.     static const string alfabeto =
  6.         "0123456789"
  7.         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  8.         "abcdefghijklmnopqrstuvwxyz";
  9.  
  10.     string risultato="";
  11.  
  12.     for (int i = 0; i < lunghezza; ++i)
  13.         risultato += alfabeto[ rand()% alfabeto.length() ];
  14.  
  15.  
  16.     return risultato;
  17. }
  18.  
  19.  
  20. void stampa_vettore_stringhe(string v[], int dimensione)
  21. {
  22.   for (int i=0; i<dimensione; i++)
  23.     cout << v[i] << endl;
  24. }
  25.  
  26.  
  27. void stampa_vettore_interi(unsigned long v[], int dimensione)
  28. {
  29.   for (int i=0; i<dimensione; i++)
  30.     cout << v[i] << endl;
  31. }
  32.  
  33. void carica_vettore_interi(unsigned long v[], long dimensione)
  34. {
  35.    mt19937 twister{time(0)};
  36.  
  37.   for (long i=0; i<dimensione; i++)
  38.     v[i] = twister();
  39.  
  40. }
  41.  
  42. bool verifica_ordine_crescente(unsigned long v[], long dimensione)
  43. {
  44.   for (int i=0; i<dimensione-1; i++)
  45.     if (v[i]>v[i+1]) return false;
  46.  
  47.   return true;
  48. }
  49.  
  50. void mischia_vettore_interi(unsigned long v[], long dimensione, int scambi)
  51. {
  52.   mt19937 twister{time(0)};
  53.  
  54.   for (long i=0; i<scambi; i++)
  55.    swap( v[twister()%dimensione], v[twister()%dimensione] );
  56. }
  57.  
  58. void carica_vettore_stringhe(string v[], int dimensione, int lunghezza=100)
  59. {
  60.   for (int i=0; i<dimensione; i++)
  61.     v[i] = genera_stringa_casuale(lunghezza);
  62. }
  63.  
  64. void ordina_vettore_stringhe(string v[], int QUANTI_ELEMENTI, bool A_Z=true)
  65. {
  66.  //ordino dal più piccolo al più grande
  67.   for (int i=0; i<QUANTI_ELEMENTI-1; i++)
  68.     for (int j=i+1; j<QUANTI_ELEMENTI; j++)
  69.       if (A_Z && v[j]<v[i])
  70.           swap(v[i], v[j]);
  71.       else
  72.         if (!A_Z && v[j]>v[i])
  73.           swap(v[i], v[j]);
  74. }
  75.  
  76.  
  77. void ordina_vettore_interi_senza_segno(unsigned long v[], int QUANTI_ELEMENTI, bool A_Z=true)
  78. {
  79.  //ordino dal più piccolo al più grande
  80.   for (int i=0; i<QUANTI_ELEMENTI-1; i++)
  81.     for (int j=i+1; j<QUANTI_ELEMENTI; j++)
  82.       if (A_Z && v[j]<v[i])
  83.           swap(v[i], v[j]);
  84.       else
  85.         if (!A_Z && v[j]>v[i])
  86.           swap(v[i], v[j]);
  87. }
  88.  
  89. enum Stato {START, STOP};
  90. auto Cronometro(Stato stato = Stato::START)
  91. {
  92.   static std::chrono::time_point<std::chrono::system_clock> inizio;
  93.   static std::chrono::time_point<std::chrono::system_clock> fine;
  94.  
  95.   if (stato == Stato::START)
  96.   {
  97.     inizio = chrono::high_resolution_clock::now();
  98.     fine = inizio;
  99.   }
  100.   else
  101.     fine = chrono::high_resolution_clock::now();
  102.  
  103.  
  104.   return chrono::duration_cast<std::chrono::milliseconds>(fine - inizio).count();
  105. }
  106.  
  107. //******************************************************************************
  108.  
  109.  
  110. //MAIN VERSIONE STRINGHE (A SEGUIRE QUELLO PER GLI INTERI)
  111. //main.cpp
  112. //scansione lineare ma a passo due
  113.  
  114. #include <iostream>
  115. #include <chrono>
  116. #include <ctime>
  117. #include <random>
  118.  
  119. using namespace std;
  120. #include "../utility_vettori.h"
  121.  
  122.  
  123.  
  124. string cerca_stringa_min_max(string v[], int dimensione)
  125. {
  126.   string stringa_max = v[0];
  127.   string stringa_min = v[0];
  128.  
  129.   for (int i=1; i<dimensione; i++)
  130.     if (v[i]>stringa_max)
  131.       stringa_max = v[i];
  132.     else
  133.       if (v[i]<stringa_min)
  134.         stringa_min = v[i];
  135.  
  136.   return stringa_min + "/" + stringa_max;
  137. }
  138.  
  139.  
  140. string cerca_stringa_min_max_SMART(string v[], int dimensione)
  141. {
  142.  
  143.   string stringa_max = "";
  144.   string stringa_min = "";
  145.   int inizia_da = -1;
  146.  
  147.   //ipotesi semplificatica: il numero di elementi è pari
  148. //  if (dimensione%2 ==  0)  //numero pari di elementi
  149. //  {
  150. //    if (v[0]<v[1])
  151. //    {
  152. //      stringa_min = v[0];
  153. //      stringa_max = v[1];
  154. //    }
  155. //    else
  156. //    {
  157. //      stringa_min = v[1];
  158. //      stringa_max = v[0];
  159. //    }
  160. //    inizia_da = 2;
  161. //  }
  162. //  else  //numero dispari di elementi
  163. //  {
  164. //    stringa_max = v[0];
  165. //    stringa_min = v[0];
  166. //
  167. //    inizia_da = 1;
  168. //  }
  169.  
  170.   if (v[0]<v[1])
  171.   {
  172.     stringa_min = v[0];
  173.     stringa_max = v[1];
  174.   }
  175.   else
  176.   {
  177.     stringa_min = v[1];
  178.     stringa_max = v[0];
  179.   }
  180.   inizia_da = 2;
  181.  
  182.   for (int i=inizia_da; i<dimensione-1; i+=2)
  183.     if (v[i]<v[i+1])
  184.     {
  185.       if (v[i] < stringa_min)
  186.         stringa_min = v[i];
  187.  
  188.       if (v[i+1] > stringa_max)
  189.         stringa_max = v[i+1];
  190.     }
  191.     else
  192.     {
  193.       if (v[i] > stringa_max)
  194.         stringa_max = v[i];
  195.  
  196.       if (v[i+1] < stringa_min)
  197.         stringa_min = v[i+1];
  198.     }
  199.  
  200.  
  201.   return stringa_min + "/" + stringa_max;
  202. }
  203.  
  204. const int QUANTI_ELEMENTI = 500;
  205. const int LUNGHEZZA = 10000;
  206. string v[QUANTI_ELEMENTI];
  207.  
  208. int main()
  209. {
  210.  
  211.   carica_vettore_stringhe(v, QUANTI_ELEMENTI, LUNGHEZZA);
  212.  
  213.   //sbilancio in favore di questo algoritmo
  214.   for (int i=0; i<QUANTI_ELEMENTI; i++)
  215.     v[i].replace(0, 5000, string(5000, 'M'));
  216. //
  217. //  v[rand()%QUANTI_ELEMENTI].replace(LUNGHEZZA - 100, 10, string(10, '0'));
  218. //  v[rand()%QUANTI_ELEMENTI].replace(LUNGHEZZA - 100, 10, string(10, 'z'));
  219.   ordina_vettore_stringhe(v, QUANTI_ELEMENTI, false); //false -> in ordine decrescente
  220.  
  221.   int numero_run = 1;
  222.   int ripetizioni_per_run = 10000;
  223.  
  224.   string s="";
  225.   Cronometro(Stato::START);
  226.  
  227.   for(int conta_run =0; conta_run<numero_run; conta_run++)
  228.     for (int conta=0; conta<ripetizioni_per_run; conta++)
  229.       s = cerca_stringa_min_max(v, QUANTI_ELEMENTI);
  230.  
  231.   cout << "Tempo impiegato: " << Cronometro(Stato::STOP) << endl;
  232.  
  233.  
  234.   Cronometro(Stato::START);
  235.  
  236.   for(int conta_run =0; conta_run<numero_run; conta_run++)
  237.     for (int conta=0; conta<ripetizioni_per_run; conta++)
  238.       s = cerca_stringa_min_max_SMART(v, QUANTI_ELEMENTI);
  239.  
  240.   cout << "Tempo impiegato (SMART): " << Cronometro(Stato::STOP) << endl;
  241.  
  242.  
  243.   return 0;
  244. }
  245. //*************************************************
  246.  
  247. //VERSIONE CON GLI INTERI
  248. //main.cpp
  249. //scansione lineare ma a passo due
  250.  
  251. #include <iostream>
  252. #include <chrono>
  253. #include <ctime>
  254. #include <random>
  255.  
  256. using namespace std;
  257. #include "../utility_vettori.h"
  258.  
  259. string cerca_int_min_max(unsigned long v[], long dimensione)
  260. {
  261.   unsigned long int_max = v[0];
  262.   unsigned long int_min = v[0];
  263.  
  264.   for (long i=1; i<dimensione; i++)
  265.     if (v[i]>int_max)
  266.       int_max= v[i];
  267.     else
  268.       if (v[i]<int_min)
  269.         int_min = v[i];
  270.  
  271.   return to_string(int_min) + "/" + to_string(int_max);
  272. }
  273.  
  274. string cerca_int_min_max_SMART(unsigned long v[], long dimensione)
  275. {
  276.  
  277.   unsigned long int_max;
  278.   unsigned long int_min;
  279.   long inizia_da = -1;
  280.  
  281.  
  282. //  if (dimensione%2 ==  0)  //numero pari di elementi
  283. //  {
  284. //    if (v[0]<v[1])
  285. //    {
  286. //      int_min = v[0];
  287. //      int_max = v[1];
  288. //    }
  289. //    else
  290. //    {
  291. //      int_min = v[1];
  292. //      int_max = v[0];
  293. //    }
  294. //    inizia_da = 2;
  295. //  }
  296. //  else  //numero dispari di elementi
  297. //  {
  298. //    int_max = v[0];
  299. //    int_min = v[0];
  300. //
  301. //    inizia_da = 1;
  302. //  }
  303.  
  304.  
  305.   if (v[0]<v[1])
  306.   {
  307.     int_min = v[0];
  308.     int_max = v[1];
  309.   }
  310.   else
  311.   {
  312.     int_min = v[1];
  313.     int_max = v[0];
  314.   }
  315.   inizia_da = 2;
  316.  
  317.   for (long i=inizia_da; i<dimensione-1; i+=2)
  318.     if (v[i]<v[i+1])
  319.     {
  320.       if (v[i] < int_min)
  321.         int_min = v[i];
  322.  
  323.       if (v[i+1] > int_max)
  324.         int_max = v[i+1];
  325.     }
  326.     else
  327.     {
  328.       if (v[i] > int_max)
  329.         int_max = v[i];
  330.  
  331.       if (v[i+1] < int_min)
  332.         int_min = v[i+1];
  333.     }
  334.  
  335.  
  336.   return to_string(int_min) + "/" + to_string(int_max);
  337. }
  338.  
  339. const long QUANTI_ELEMENTI = 50000;
  340. unsigned long v[QUANTI_ELEMENTI];
  341.  
  342. int main()
  343. {
  344.   carica_vettore_interi(v, QUANTI_ELEMENTI);
  345.   ordina_vettore_interi_senza_segno(v, QUANTI_ELEMENTI, false);
  346.  
  347.   long numero_run = 1;
  348.   long ripetizioni_per_run = 10000;
  349.  
  350.   string s="";
  351.   Cronometro(Stato::START);
  352.  
  353.   for(long conta_run =0; conta_run<numero_run; conta_run++)
  354.     for (long conta=0; conta<ripetizioni_per_run; conta++)
  355.       cerca_int_min_max(v, QUANTI_ELEMENTI);
  356.  
  357.   cout << "Tempo impiegato: " << Cronometro(Stato::STOP) << endl;
  358.   //cout << "MIN/MAX: " << s << endl;
  359.  
  360.  
  361.   Cronometro(Stato::START);
  362.  
  363.   for(long conta_run =0; conta_run<numero_run; conta_run++)
  364.     for (long conta=0; conta<ripetizioni_per_run; conta++)
  365.       cerca_int_min_max_SMART(v, QUANTI_ELEMENTI);
  366.  
  367.   cout << "Tempo impiegato (SMART): " << Cronometro(Stato::STOP) << endl;
  368.   //cout << "MIN/MAX: " << s << endl;
  369.  
  370.   return 0;
  371. }
  372.  
  373.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement