Ricerca binaria (o dicotomica) di un elemento in un La ricerca binaria o dicotomica è utilizzata per ricercare i dati in un ORDNATO. L algoritmo di ricerca binaria, dopo ogni confronto, scarta metà degli elementi del su cui si effettua la ricerca restringendo il campo di ricerca. Si può formalizzare l algoritmo mediante le seguenti operazioni : 1) individuazione dell elemento centrale del ; 2) si confronta il dato elemento N da ricercare con l elemento centrale del, con l elemento iniziale del e con quello finale. Se l elemento individuato non è uguale a quello cercato si prosegue in due modi possibili : se N > elemento centrale la ricerca continua solo nel semi superiore se N < elemento centrale la ricerca continua solo nel semi inferiore 3) l procedimento continua iterativamente in modo da suddividere i semivettori via via individuati. 4) La ricerca termina con successo quando l elemento centrale [M] considerato ad un certo passo è proprio uguale a N oppure è uguale all elemento iniziale o a quello finale. 5) La ricerca termina con insuccesso quando la parte di considerata è costituita da un solo elemento diverso dal numero ricercato. Osservazione : Per il calcolo del valore centrale occorrono tre indici che individuino l estremità inferiore, l estremità superiore e la metà del considerato ad ogni passo. ndicato con l indice inferiore, con J l indice superiore, l indice M dell elemento centrale si ottiene mediante la seguente formula : M = (+J)/2. Nell algoritmo proposto è stata implementata una funzione che : se la ricerca termina con successo, la funzione restituisce il valore 1; se la ricerca termina con insuccesso, la funzione restituisce il valore 0. Sia n sia dimensione dell array. l numero di confronti da effettuare risultano : 1 nel caso migliore (l elemento da cercare è proprio quello centrale o quello iniziale o quello finale) ; log 2 (n + 1) nel caso peggiore (l elemento da cercare è l elemento centrale dell ultimo semi oppure non è presente). l numero di confronti è uguale a quante volte il numero n può essere diviso per 2 fino a ridurlo a 0 ( ovvero log 2 (n + 1) ). Realizzazione del flow-chart ed implementazione in C++ a cura del Prof. Salvatore DE GORG -1-
Esempio : Cercare l elemento 43 nel seguente array 3 7 8 11 16 19 24 29 33 40 43 54 58 60 65 M J (indice inf.) (indice centrale) (indice sup.) 3 7 8 11 16 19 24 29 33 40 43 54 58 60 65 M J 3 7 8 11 16 19 24 29 33 40 43 54 58 60 65 J M Analisi dei dati dentificatore Descrizione Tipo nput Output Lavoro Dmax Costante : dimensione massima del intero Dim dimensione del intero si [] contenente i numeri su cui effettuare la ricerca intero N numero da ricercare nel intero si indice inferiore del intero si J indice superiore del intero si M indice centrale del intero si T flag : indica se il numero N è stato o meno trovato booleano si messaggio si Realizzazione del flow-chart ed implementazione in C++ a cura del Prof. Salvatore DE GORG -2-
Start Dmax = 50 Dimensione Caricamento Ordinamento N Ricerca Binaria unzione Dimensione non trovato T = 1 trovato Dim End unzione Ordinamento = 0 Dim < 2 OR Dim > Dmax Return Dim unzione Caricamento < Dim - 1 = 0 J = + 1 J < Dim < Dim [] > [J] C = [] [] =[J] [J] = C [] = + 1 Return J = J + 1 = + 1 Return Realizzazione del flow-chart ed implementazione in C++ a cura del Prof. Salvatore DE GORG -3-
unzione Ricerca Binaria T = 0 = 0 J = Dim -1 M = (+J)/2 N = [M] OR N = [] OR N = [J] N < [M] T = 1 = M + 1 J = M - 1 <= J AND T = 0 Return T Realizzazione del flow-chart ed implementazione in C++ a cura del Prof. Salvatore DE GORG -4-
// ricerca binaria di un elemento in un ordinato #include <iostream> #include <stdlib.h> // per rand() e srand() #include <time.h> // per time() using namespace std; const int maxdim = 50; bool trovato = false; int dim,j; // variabili globali //==================== UNZON ===================== // funzione per la richiesta della dimensione del int dimensione_() do cout << "nserire la dimensione del (max="<<maxdim<<")..: "; cin >> dim; while ((dim < 1 ) (dim > maxdim)); return dim; // ------------------------------------------- // funzione per il caricamento random del con numeri minori di 100 void carica_(int v[], int dimvet) srand (time(null)); for (int i = 0; i < dimvet; ++i) v[i]= rand()%100; // numeri casuali compresi fra 0 e 99 // ------------------------------------------- // funzione per la visualizzazione del void visualizza_(int v[], int dimvet) cout<<"\n ===== isualizzazione ====="<<endl; for (int i=0; i < dimvet; ++i) cout << "Elemento di posto " << i+1 << "...: " << v[i]<<endl; //------------------------------------------------------------ // funzione per lo scambio di due variabili void scambia(int &x, int &y) int temp; temp = x; x = y; y = temp; //----------------------------------------------------------- // funzione per l'ordinamento del (per sostituzione) void ordinamento_(int v[], int dimvet) int j; for (int i=0; i < dimvet-1; ++i) for (j=i+1; j<dimvet; ++j ) if (v[i] > v[j]) scambia(v[i],v[j]); Realizzazione del flow-chart ed implementazione in C++ a cura del Prof. Salvatore DE GORG -5-
// funzione per la ricerca binaria del numero nel bool ricerca_binaria(int v[], int dimvet, int cercato) int i,m; trovato = false; i=0; j=dimvet-1; do m=(i+j)/2; if (cercato==v[m] cercato==v[i] cercato==v[j]) trovato=true; else if (cercato < v[m]) j=m-1; else i=m+1; while ((i<=j) && (trovato==false)); return trovato; Realizzazione del flow-chart ed implementazione in C++ a cura del Prof. Salvatore DE GORG -6-
// ==================== MAN =========================== int main (int argc, char *argv[]) char quit; quit = '\0'; int array[maxdim] = 0; // inizializzazione del int numero; char risposta; bool t; while (quit!= 'q') dimensione_(); carica_(array,dim); ordinamento_(array,dim); // richiesta del numero da ricercare cout << "introdurre il numero da ricercare...: " ; cin >> numero; t=ricerca_binaria(array,dim,numero); if (t == true) cout << "\nl numero inserito e' stato trovato"<<endl; else cout << "\nl numero inserito non e' stato trovato"<<endl; do cout << "\nuoi visualizzare il? (s/n) "; cin >> risposta; while(risposta!= 's' && risposta!= 'S' && risposta!= 'n' && risposta!= 'N'); if (risposta == 's' risposta == 'S') cout << "\n ettore caricato : " << endl; visualizza_(array,dim); // ------------------------------------------------------------ // termine programma con richiesta di uscita cout << "Premere q per uscire "; cin >> quit; return 0; Realizzazione del flow-chart ed implementazione in C++ a cura del Prof. Salvatore DE GORG -7-