Algoritmi di Ricerca. Esempi di programmi Java



Похожие документы
Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java

10 - Programmare con gli Array

Semplici Algoritmi di Ordinamento

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Esempi di esercizi d esame

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Programmazione 1 A.A. 2015/2016

Fondamenti di Informatica. Dichiarazione, creazione e gestione di array in Java

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

GESTIONE INFORMATICA DEI DATI AZIENDALI

La struttura dati ad albero binario

RICERCA DI UN ELEMENTO

Concetto di Funzione e Procedura METODI in Java

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Progetto Lauree Scientifiche Liceo Classico L.Ariosto, Ferrara Dipartimento di Matematica Università di Ferrara 24 Gennaio 2012

Corso di Informatica

Funzioni in C. Violetta Lonati

Esercizi della lezione 5 di Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Corso di Tecniche di Programmazione

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

La selezione binaria

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Prova di Laboratorio di Programmazione

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

esercizi Esercizi / problemi

Esercitazione n 4. Obiettivi

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

Algoritmi di ordinamento

Definizione di classi con array di oggetti

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Programmazione in Java Parte I: Fondamenti

Java: Compilatore e Interprete

SAPIENZA Università di Roma, Facoltà di Ingegneria

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Un esercizio d esame. Flavio De Paoli

Programmazione ad Oggetti: JAVA. Esercitazione

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

Esempio: Array di struct

Esercizi per il corso di Algoritmi e Strutture Dati

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Le stringhe. Le stringhe

Fondamenti di Informatica 2

Alberi binari di ricerca

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Esercizi Capitolo 6 - Alberi binari di ricerca

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

ARRAY E STRINGHE. G. Frosini Slide 1

Matlab: Strutture di Controllo. Informatica B

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

Strutturazione logica dei dati: i file

Arduino: Programmazione

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Due algoritmi di ordinamento. basati sulla tecnica Divide et Impera: Mergesort e Quicksort

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Caratteri e stringhe Esercizi risolti

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

L algoritmo di ricerca binaria. Daniele Varin LS Ing. Informatica Corso di Informatica teorica Docente: prof. Paolo Sipala

Realizzazione di una classe con un associazione

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Inizializzazione, Assegnamento e Distruzione di Classi

Guida docenti all inserimento delle informazioni sugli insegnamenti (programmi, etc.) da web

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

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

Calcolare il massimo di una lista

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

Sottoprogrammi: astrazione procedurale

Programmazione dinamica

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

Ricerche, ordinamenti e fusioni. 5.1 Introduzione. 5.2 Ricerca completa

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

Compito di Fondamenti di Informatica

Ingegneria del Software

Транскрипт:

Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure l elemento non è presente nella sequenza stessa. In generale una sequenza di elementi si può realizzare come un array. E la scansione avviene usando un indice. Se la sequenza non è ordinata a priori occorre eseguire una ricerca lineare o sequenziale. Se la sequenza è ordinata è opportuno eseguire una ricerca binaria. Fondamenti di Informatica - D. Talia - UNICAL 2

Ricerca lineare L algoritmo di ricerca lineare (o sequenziale) in una sequenza (array) è basato sulla seguente strategia: Gli elementi dell array vengono analizzati in sequenza, confrontandoli con l elemento da ricercare (chiave) per determinare se almeno uno degli elementi è uguale alla chiave. Quando si trova un elemento uguale alla chiave la ricerca termina. La ricerca è sequenziale, nel senso che gli elementi dell array vengono scanditi uno dopo l altro sequenzialmente. L algoritmo prevede che al più tutti gli elementi dell array vengano confrontati con la chiave. Se l elemento viene trovato prima di raggiungere la fine della sequenza non sarà necessario proseguire la ricerca. Fondamenti di Informatica - D. Talia - UNICAL 3 Ricerca lineare in Java /* Questo metodo implementa la ricerca lineare restituendo l'indice di un elemento di seq uguale all elemento cercato (chiave) oppure 1 che indica che l elemento non è presente nella sequenza.*/ public static int riclineare(int[] seq, int chiave) int i; // indice per la scansione di seq int ind_elem; // indice di un elemento uguale a // alla chiave ind_elem = -1; for(i=0; ind_elem==-1 && i<seq.length; i++) if (seq[i]==chiave) ind_elem = i; return ind_elem; Fondamenti di Informatica - D. Talia - UNICAL 4

Uso della ricerca lineare per contare le occorrenze L algoritmo di ricerca lineare può essere usato per verificare quante volte un elemento è presente in una sequenza: 1. Gli elementi dell array vengono analizzati in sequenza, confrontandoli con l elemento da ricercare (chiave) per determinare se uno degli elementi è uguale alla chiave. 2. Quando si trova un elemento uguale alla chiave si incrementa un contatore e il passo 1 viene rieseguito fino alla fine della sequenza. Fondamenti di Informatica - D. Talia - UNICAL 5 Calcolo delle occorrenze /* Questo metodo conta quante volte l elemento cercato (chiave) è presente in seq e ritorna il valore delle occorrenze (il valore 0 indica che l elemento non è presente nella sequenza).*/ public static int Conta(int[] seq, int chiave) int i; // indice per la scansione di seq int occorre; // valore delle occorrenze della // chiave in seq occorre = 0; for(i=0; i<seq.length; i++) if (seq[i] == chiave) occorre++; return occorre; Fondamenti di Informatica - D. Talia - UNICAL 6

L algoritmo di ricerca lineare richiede che al più tutti gli elementi dell array vengano confrontati con la chiave. Questo è necessario perché la sequenza non è ordinata. Se la sequenza su cui occorre effettuare la ricerca è ordinata si può usare un algoritmo di ricerca molto più efficiente che cerca la chiave sfruttando il fatto che gli elementi della sequenza sono già disposti in un dato ordine. Esempi di sequenze ordinate: elenco telefonico, agenda, etc. In questi casi si usa un algoritmo di ricerca binaria che è più efficiente perché riduce lo spazio di ricerca. Fondamenti di Informatica - D. Talia - UNICAL 7 L algoritmo di ricerca binaria cerca un elemento in una sequenza ordinata in maniera crescente (o non decrescente) eseguendo i passi seguenti finché l elemento viene trovato o si è si è completata la ricerca senza trovarlo: 1. Confronta la chiave con l elemento centrale della sequenza, 2. Se la chiave è uguale all elemento centrale, allora la ricerca termina positivamente, 3. Se invece la chiave è maggiore dell elemento centrale si effettua la ricerca solo sulla sottosequenza a destra, 4. Se invece la chiave è minore dell elemento centrale dello spazio di ricerca, si effettua la ricerca solo sulla sottosequenza a sinistra. 1 sequenza 8 21 45 60 79 94 180 chiave 94 2 Fondamenti di Informatica - D. Talia - UNICAL 8

in Java /* Questo metodo implementa la ricerca binaria restituendo l'indice di un elemento di seq uguale all elemento cercato (chiave) o 1 che indica che l elemento non è presente*/ public static int ricbinaria(int[] seq, int chiave) // seq è ordinato in modo non decrescente int indice; // indice di un elemento uguale a chiave int inizio; int fine; int centro; inizio = 0; fine = seq.length-1; indice = -1; while (indice ==-1 && inizio <= fine) centro = (inizio+fine)/2; if (seq[centro]==chiave) // trovato indice = centro; else if (chiave > seq[centro]) // continua a destra inizio = centro + 1; else // continua a sinistra fine = centro - 1; return indice; Fondamenti di Informatica - D. Talia - UNICAL 9 inizio=0 centro=4 fine=8 chiave 5 14 35 38 60 83 94 143 180 143 inizio=5 centro=6 fine=8 5 14 35 38 60 83 94 143 180 inizio=7 centro=7 fine=8 5 14 35 38 60 83 94 143 180 indice = 7 Fondamenti di Informatica - D. Talia - UNICAL 10

inizio=0 centro=4 fine=8 chiave 5 14 35 38 60 83 94 143 180 5 inizio=0 centro=1 fine=3 5 14 35 38 60 83 94 143 180 inizio=0 fine=0 centro=0 5 14 35 38 60 83 94 143 180 indice = 0 Fondamenti di Informatica - D. Talia - UNICAL 11 Inizialmente la ricerca è fatta su N elementi dove N indica la lunghezza della sequenza (lo spazio di ricerca ha dimensione N). Ad ogni iterazione lo spazio della ricerca si riduce di circa la metà. Potremmo dire che si passa da N ad N/2 e cosi via. Il caso peggiore si ha quando l elemento cercato non si trova nella sequenza (non esiste un elemento uguale alla chiave). Nel caso peggiore, l iterazione viene eseguita log 2 N volte. Fondamenti di Informatica - D. Talia - UNICAL 12

L esempio seguente definisce una classe Studenti i cui oggetti sono elenchi di N nomi e matricole di studenti con metodi per inizializzare, cercare e stampare i dati degli studenti in elenco. Ogni elenco è definito come un oggetto composto da due campi che sono array di stringhe e di interi: nomi e matricole. Ognuno di questi due campi contengono rispettivamente una sequenza di nomi e di matricole in maniera che elenco.nomi[i] e elenco.matricole[i] avendo lo stesso valore dell indice contengono rispettivamente il nome ed la matricola di uno studente. Nell esempio esiste un altra classe TestStudenti che contiene il main e usa i metodi della classe Studenti. Fondamenti di Informatica - D. Talia - UNICAL 13 class Studenti String[] nomi = new String[100]; //VARIABILE D ISTANZA int[] matricole =new int[nomi.length]; //VARIABILE D ISTANZA void leggidati() // METODO PER LEGGERE NOMI E MATRICOLE for (int i=0; i< nomi.length; i++) nomi[i]=console.readstring ("Inser. nome " + (i+1) + ": "); matricole[i]=console.readint("inser. Matr. " + (i+1) + ": "); void stampadati() // METODO PER VISUALIZZARE NOMI E MATRICOLE for (int i=0; i<nomi.length; i++) System.out.println(nomi[i] + " " + matricole[i]); // continua Fondamenti di Informatica - D. Talia - UNICAL 14

// continua int cercamatricola(int MT) //METODO CHE CERCA PER MATRICOLA int j = 0; int i ; boolean trov = false; for (i=0; i<matricole.length & trov==false; i++) if (MT == matricole[i]) trov = true ; j = i; if (trov == true) return j; else return -1; // fine della classe Studenti Fondamenti di Informatica - D. Talia - UNICAL 15 Nella classe TestStudenti definiamo il main che crea un oggetto elenco di Studenti e usa i metodi della classe per inserire i dati di ogni studentea (nome e matricola) nell elenco, visualizzare l elenco degli studenti inseriti (nome e matricola), cercare uno studente di cui si conosce la matricola; la ricerca delle persone continua finchè non viene inserito il valore 0 che indica la fine della ricerca. Fondamenti di Informatica - D. Talia - UNICAL 16

public class TestStudenti public static void main(string args[]) int matricola; int indice ; Studenti elenco = new Studenti(); elenco.leggidati(); System.out.println("-------------"); elenco.stampadati(); do matricola=console.readint("inser. la matricola da cercare : "); if ( matricola!= 0 ) indice = elenco.cercamatricola(matricola); if (indice > -1) System.out.println(elenco.nomi[indice]+" + elenco.matricole[indice]); else System.out.println ( Studente non presente nell'elenco"); while (matricola!= 0 ); // fine del main // fine della classe TestStudenti Fondamenti di Informatica - D. Talia - UNICAL 17 L esempio si può modificare ad esempio aggiungendo : Un metodo cercanome che cerca uno studente anche per nome, Un metodo per leggere i dati di un singolo studente non di tutti. Oppure modificando Il metodo cercanome per cercare tutte gli studenti con un dato nome non solo il primo che incontra. Oppure definendo altre variabili d istanza per memorizzare dati sugli studenti in elenco, ad esempio: corso di laurea, indirizzo, età, ecc. Fondamenti di Informatica - D. Talia - UNICAL 18