1 / 10

Ricerca dicotomica

Ricerca dicotomica. La ricerca di un elemento in un vettore può essere molto laboriosa in termini di tempo di esecuzione. Se la base dati è molto grande è opportuno minimizzare questo tempo riducendo il numero di confronti tramite un semplice algoritmo detto di ricerca dicotomica.

phiala
Download Presentation

Ricerca dicotomica

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ricerca dicotomica • La ricerca di un elemento in un vettore può essere molto laboriosa in termini di tempo di esecuzione. • Se la base dati è molto grande è opportuno minimizzare questo tempo riducendo il numero di confronti tramite un semplice algoritmo detto di ricerca dicotomica. • Il vettore deve essere dapprima riordinato, poi si confronta l’elemento posto a metà vettore (indice = n/2) con l’elemento cercato. Si hanno 3 possibilità: a) é quello cercato; b) l’elemento cercato è più grande; c) l’elemento cercato è più piccolo. • Se l’elemento cercato è più grande si considera un nuovo vettore formato dalla sola seconda metà dell’intero vettore e si ricomincia la ricerca col confronto tra elemento cercato e elemento posto a metà del nuovo vettore; e così via.

  2. Ricerca dicotomica 1/5 #include <stdio.h> #include <conio.h> #define MAX_DATI 100 #define FALSE 0 #define VERO 1 /* prototipo delle funzioni di ricerca e di riordinamento */ voidtrovato (intvett[ ], int elemento, int&p_posiz, intn_dati, bool& presente); voidbubble (intvett[ ], int n); intmain() { intnum_dati, dato, indice, p_posiz, cercato; intvett [MAX_DATI]; booltrova_elemento=false;

  3. Ricerca dicotomica 2/5 indice = 1; cout<<«Introduci il vettore terminando con -1»<<endl; cout<<«inserisci il primo elemento»<<endl; cin>>dato vett[0]=dato; while((dato!=-1) && (indice < MAX_DATI)) { cout<<«inserisci l’ elemento»<<indice<<endl; cin>>dato vett[indice] = dato; indice++; } num_dati= indice; /* in num_dati numero di dati letti */ bubble (vett, num_dati); /* riordina il vettore di interi */ cout<<«Vettore riordinato:”<<endl; /* visualizza il vettore riordinato */ for (indice = 0; indice < num_dati; indice++) cout<<«Elemento di indice «<< indice<<«con valore»<< vett [indice]);

  4. Ricerca dicotomica 3/5 /* richiede il dato da cercare */ cout<<«Quale dato vuoi cercare? «<<endl; cin>>cercato; /* cerca il dato con la funzione trovato che restituisce col suo nome un valore logico (vero o falso) a seconda che il dato sia presente o meno nel vettore e, se presente, l’indice del dato nella variabile p_posiz */ trovato (vett, cercato, p_posiz, num_dati, trova_elemento) ; if(trova_elemento==true) cout<<«Dato presente in posizione «<<p_posiz<<endl; else cout<<« Dato non presente«<<endl; }

  5. Ricerca dicotomica 4/5 voidtrovato (intvett[ ], int dato, int&p_posiz, intn_dati, bool &presente) { int meta, limite_inf, limite_sup; limite_inf = 0; /* indice inferiore della porzione di vettore */ limite_sup = n_dati - 1; /* indice superiore della porzione di vettore */ presente = FALSE; while ((!presente) && (limite_inf <= limite_sup)) { meta = (limite_sup + limite_inf) / 2; /* confronto il dato cercato con l’elemento di metà del vettore */ if (vett[meta] == dato) presente = TRUE; /* è lui, finito! */

  6. Ricerca dicotomica 5/5 else { /* non è lui, procedo usando il metodo di bisezione */ if (vett[meta] > dato) limite_sup = meta - 1; else limite_inf = meta + 1; } } p_posiz= meta; }

  7. Ricerca dicotomica RICORSIVA intricerca_bin (intvet[], int first, int last, intel) { intmed; if(first > last) return-1; else { med= (first + last) / 2; if(el == vet[med]) returnmed; else if(el > vet[med]) returnricerca_bin(vet, med+1, last, el); else returnricerca_bin(vet, first, med-1, el); } }

  8. Determinante di una matrice 1/3 (funzioni principali) #include <cstdlib> ….. usingnamespacestd; constintdim = 5; voidstampaMatr(double M[][dim],int l) …… voidleggiMatr(double M [][dim], int l) …… voidcopiaM (double M[][dim], double copia[][dim]) ……. int segno (int n) { if (n%2) return 1; else return -1; }

  9. Determinante di una matrice 2/3 (funzioni principali) voidsottoM(double M[][dim], int d, intind, double sM[][dim]) { int col=0; for (int i=1; i<d; i++) {col=0; for (int j=0;j<d;j++) if (j!=ind) {sM[i-1][col] = M[i][j]; //cout << sM[i-1][col] << '\t'; col++; } } stampaMatr(sM,d-1); } double determ (double mat[][dim], int d) { double det=0; double sM[dim][dim]; if (d==2) det = mat[0][0]*mat[1][1]- mat[0][1]*mat[1][0]; else for (int j=0; j<d; j++) {sottoM(mat, d, j, sM ); det = det + mat[0][j] * segno(0+j) * determ(sM,d-1); } returndet; }

  10. Determinante di una matrice 3/3 (funzioni principali) intmain(intargc, char *argv[]) { int n, l; double M[dim][dim]; cout<<"qual e' la dimensione: 1<dim<"<< dim+1 << " della matrice?\ndim="; cin >> l; leggiMatr(M,l); stampaMatr(M,l); cout << "determinante = " << determ(M,l) << "\n"; system("PAUSE"); return EXIT_SUCCESS; }

More Related