Advertisement
fcamuso

Algoritmi lezione 22 - ricerca binaria

May 2nd, 2024
698
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. #include <chrono>
  5.  
  6. using namespace std;
  7.  
  8. const int MAX_PAROLE = 500000;
  9. const int MAX_CERCATE = 10000;
  10.  
  11. string vocabolario[MAX_PAROLE];
  12. string da_cercare[MAX_CERCATE];
  13.  
  14. enum Stato {START, STOP};
  15. auto Cronometro(Stato stato = Stato::START)
  16. {
  17.   static std::chrono::time_point<std::chrono::system_clock> inizio;
  18.   static std::chrono::time_point<std::chrono::system_clock> fine;
  19.  
  20.   if (stato == Stato::START)
  21.   {
  22.     inizio = chrono::high_resolution_clock::now();
  23.     fine = inizio;
  24.   }
  25.   else
  26.     fine = chrono::high_resolution_clock::now();
  27.  
  28.  
  29.   return chrono::duration_cast<std::chrono::milliseconds>(fine - inizio).count();
  30. }
  31.  
  32. int leggi_file(string path_file, string v[], int capienza_vettore)
  33. {
  34.  //per leggere useremo un I-nput F-ile STREAM = IFSTREAM
  35.   ifstream leggi(path_file); //il cosiddetto file handle (riferimento al file su disco)
  36.  
  37.   //test per successo apertura
  38.   if (!leggi)
  39.     throw runtime_error("File non trovato\n");
  40.  
  41.   //lettura una intera riga alla volta
  42.   string riga="";
  43.  
  44.   //getline restituisce false quando le righe sono finite
  45.   int conta_righe = 0;
  46.   while ( getline(leggi, riga) )
  47.   {
  48.     if (conta_righe>=capienza_vettore)
  49.       throw runtime_error("Capienza vettore insufficiente\n");
  50.  
  51.     v[conta_righe] = riga;
  52.     conta_righe++;
  53.   }
  54.  
  55.   leggi.close(); leggi.clear();
  56.  
  57.   return conta_righe;
  58.  
  59. }
  60.  
  61. int partiziona(string v[], int inizio, int fine)
  62. {
  63.     string pivot = v[inizio];
  64.  
  65.     int cont = 0;
  66.     for (int i = inizio + 1; i <= fine; i++) {
  67.         if (v[i] <= pivot)
  68.             cont++;
  69.     }
  70.  
  71.     //mettiamo il pivot nella posizione che gli spetta
  72.     int indice_pivot = inizio + cont;
  73.     swap(v[indice_pivot], v[inizio]);
  74.  
  75.  
  76.     // spostiamo gli elementi più piccoli del pivot alla sua sinistra
  77.     // e quelli più grandi alla sua destra
  78.     int i = inizio, j = fine;
  79.  
  80.     while (i < indice_pivot && j > indice_pivot) {
  81.  
  82.         while (v[i] <= pivot) {
  83.             i++;
  84.         }
  85.  
  86.         while (v[j] > pivot) {
  87.             j--;
  88.         }
  89.  
  90.         if (i < indice_pivot && j > indice_pivot) {
  91.             swap(v[i], v[j]);
  92.             i++; j--;
  93.         }
  94.     }
  95.     //cout << string(40, '-') << "\n\n";
  96.  
  97.     return indice_pivot;
  98. }
  99.  
  100. void quickSort(string v[], int inizio, int fine)
  101. {
  102.  
  103.     if (inizio >= fine)
  104.         return;
  105.  
  106.  
  107.     int p = partiziona(v, inizio, fine);
  108.  
  109.   //tail recursion
  110.   // ordina la parte a sinistra
  111.     quickSort(v, inizio, p - 1);
  112.  
  113.     // ordina la parte a destra
  114.     quickSort(v, p + 1, fine);
  115.  
  116. }
  117.  
  118. int ricerca_sequenziale(string cercata, string v[], int num_ele)
  119. {
  120.   for (int i=0; i<num_ele; i++)
  121.     if (cercata==v[i]) return i;
  122.  
  123.   return -1;
  124. }
  125.  
  126. int ricerca_binaria(string cercata, string v[], int num_stringhe)
  127. {
  128.    int inizio = 0;
  129.    int fine = num_stringhe - 1;
  130.    int pos_trovata = -1;
  131.  
  132.    while (inizio<=fine && pos_trovata==-1)
  133.    {
  134.      int mediano = (inizio+fine)/2;
  135.  
  136.      if (v[mediano] == cercata)
  137.       pos_trovata=mediano;
  138.      else
  139.        if (v[mediano]<cercata)
  140.          inizio = mediano+1;
  141.        else
  142.         fine = mediano - 1;
  143.    }
  144.  
  145.    return pos_trovata;
  146. }
  147.  
  148. int main()
  149. {
  150.   //quante parole contiene il dizionario? 481.816
  151.   int numero_parole_vocabolario = leggi_file("vocabolario3.txt", vocabolario, MAX_PAROLE);
  152.  
  153.  
  154.   //scegliamo tra queste 100000 parole da far poi cercare
  155.   //(ammesse ripetizioni della stessa ricerca)
  156.   for (int i=0; i<MAX_CERCATE; i++)
  157.     da_cercare[i] = vocabolario[(rand()*rand()) % numero_parole_vocabolario];
  158.  
  159.   //sequenziale
  160.   Cronometro(Stato::START);
  161.  
  162.   for (int i=0; i<MAX_CERCATE; i++)
  163.     ricerca_sequenziale(da_cercare[i], vocabolario, numero_parole_vocabolario);
  164.  
  165.   cout << "Tempo ricerca sequenziale: " << Cronometro(Stato::STOP) <<"ms\n";
  166.  
  167.    //binaria
  168.   Cronometro(Stato::START);
  169.  
  170.   for (int i=0; i<MAX_CERCATE; i++)
  171.     ricerca_binaria(da_cercare[i], vocabolario, numero_parole_vocabolario);
  172.  
  173.   cout << "Tempo ricerca binaria: " << Cronometro(Stato::STOP) <<"ms\n";
  174.  
  175.  
  176.     return 0;
  177. }
  178.  
  179.  
  180.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement