Ricerca binaria (o dicotomica) di un elemento in un vettore

Documenti analoghi
Algoritmo di ordinamento per scambio (a bolle o bubble sort)

Ricerca sequenziale di un elemento in un vettore

Gestione dinamica di una coda

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Algoritmi di Ricerca. Esempi di programmi Java

RICERCA IN UN VETTORE

Algoritmi di Ricerca. Esempi di programmi Java

Laboratorio di Informatica

Espressioni logiche. Espressioni logiche. Operatori logici. Operatori logici. Operatori logici. Espressioni Logiche e Istruzione di Test

Programmazione I - Laboratorio

Programmazione modulare

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi seconde

Università di Roma Tor Vergata L6-1. iterazione: struttura di controllo per ripetere più volte uno stesso comando

Le strutture di controllo in C++

Corso di Fondamenti di Informatica Algoritmi su array / 2

Algoritmi su array / 2

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

Appunti, esempi ed esercizi sui linguaggi C/C++

Esercizi. Stringhe. Stringhe Ricerca binaria

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

4. Accesso diretto per gli archivi con record a lunghezza costante

ESERCIZIO 1. AZ111 milano 12:34 23 AZ222 buenos-aires 12: BA333 toronto 4:15 20 KM444 madrid 10:12 100

La ricerca dicotomica

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

Laboratorio di Informatica

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

La classe std::vector della Standard Template Library del C++

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Gestione di stringhe. Le stringhe in C/C++

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Fondamenti di C++ Input/Output di base

Esercitazione 7. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Laboratorio di Informatica

Primo allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Pr1: determinare il maggiore di n numeri interi n. Fondamenti di Informatica Prof. Vittoria de Nitto Personè

Gestione di files Motivazioni

Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013

Laboratorio di Algoritmi e Strutture Dati

Corso di Fondamenti di Informatica

Corso di Fondamenti di Informatica Classi di istruzioni 2

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

C: panoramica. Violetta Lonati

Esercitazione 6. Array

Laboratorio di Algoritmi e Strutture Dati. Dizionari

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

PROGRAMMAZIONE: Le strutture di controllo

Esercizio 1 (15 punti)

Algoritmi di ordinamento. Sequential-sort, Bubble-sort, Quicksort

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi terza

a.a Codice corso: 21012, 22010

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Implementazione dell albero binario in linguaggio C++

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

a.a Codice corso: 21012, 22010

Anche se due variabili vettore sono dello stesso tipo, NON è possibile l assegnamento diretto:

L organizzazione dei programmi

ESERCIZIO: Lettura/Scrittura Array

Fondamenti di Informatica

Prova Scritta del 19/07/10

LABORATORIO DI FONDAMENTI DI INFORMATICA DIAGRAMMI DI FLUSSO E CODIFICA IN C DEGLI ALGORITMI

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Algoritmi di ordinamento in linguaggio C

Università degli Studi di Cassino Corso di Fondamenti di Informatica Visibilità e tempo di vita delle variabili

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Algoritmi di ordinamento e ricerca. Classe SelSort.java

Esercizi C su array e matrici

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Informatica/ Ing. Meccanica/ Edile/ Prof. Verdicchio/ 17/01/2014/ Foglio delle domande / VERSIONE 1

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Algoritmi di ordinamento: Array e ricorsione

Corso di Informatica 1 Esercitazione n. 4

Informatica B

Cognome e Nome : Corso e Anno di Immatricolazione: Modalità di Laboratorio (Progetto/Prova) :

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

Problema: ricerca di un elemento

Corso di Fondamenti di Informatica

24/2/2015 Pastebin.com - Printed Paste ID:

1 (4) 2 (4) 3 (12) 4 (6) 5 (6)

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Programmi in Assembly

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Istruzioni semplici e strutturate

Analisi Lessicale. File

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

Sommario. Calcolo della radice quadrata. Calcolo della radice quadrata. y0 a rappresenta un approssimazione per eccesso dll della radice. y 1 a.

Sottoprogrammi: astrazione procedurale

Crittografia LWF (lwf)

Gestione dinamica di una pila

Esercitazione 12. Esercizi di Ricapitolazione

Qualsiasi programma in C++ segue lo schema:

Esercitazione 11. Liste semplici

Informatica! Appunti dal laboratorio 1!

Vettori Algoritmi elementari di ordinamento

Programmazione I - Laboratorio

Transcript:

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-