Algoritmi di Ricerca. Esempi di programmi Java

Documenti analoghi
Algoritmi di Ricerca. Esempi di programmi Java

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Algoritmi di Ricerca. Esempi di programmi Java

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Array mono- e bi-dimensionali Cicli while e do-while

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

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Richiami di Fondamenti di Informatica - 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Iterazione. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa E07. C. Limongelli Novembre 2007

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Calcolare x n = x x x (n volte)

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

RICERCA IN UN VETTORE

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

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

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

Proprietà delle Classi e degli Oggetti in Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Esempio: Tombola! Vogliamo progettare una applicazione che realizza il gioco della tombola Versione semplificata: un banco, un

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a. 2016/ Giugno 2017

Insieme.java. Printed by Paolo. Feb 24, 04 16:44 Page 1/1 class Insieme { private int[] elementi; Tuesday February 24, /10

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Iterazione (introduzione)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Array Bidimensionali in Java. Esempi di Elaborazioni su Matrici

GESTIONE DEGLI ERRORI

Le basi del linguaggio Java

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

Studente (Cognome Nome):

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Esercizi sui metodi. Carla Limongelli. Maggio Esercizi 1

Metodi statici. Dichiarazione e chiamata di metodi statici

Implementazione dell albero binario in linguaggio C++

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso di Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Algoritmi di ordinamento e ricerca. Classe SelSort.java

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

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

Esercitazione n 2. Obiettivi

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008

Fondamenti di Informatica T-1 Modulo 2

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione 1 A.A. 2015/2016

Lezione 6 programmazione in Java

Esempio: L EURO-CONVERTITORE (1) Scopo

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

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

Laboratorio di Programmazione 1 [Java]

Esempi di Problemi Iterativi

Programmazione con Java

Corso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Questionario di autovalutazione 4

Corso di Laurea Ingegneria Civile Elementi di Informatica. Esercizi. Carla Limongelli. Esercizi 1

Le strutture di controllo in C++

Costrutti iterativi. Utilizzo dei costrutti iterativi

Programmazione, 5 a lezione

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

Esempio su strutture dati dinamiche: ArrayList

Esercizi. Stringhe. Stringhe Ricerca binaria

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Fondamenti di Informatica

Concetto di Funzione e Procedura METODI in Java

Esempi di Problemi Iterativi

ALGORITMI E STRUTTURE DATI

Informatica 3 secondo recupero 13 Settembre 2002

Esercizi di Algoritmi e Strutture Dati

Dall analisi alla codifica (1)

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Eccezioni Precisazioni e approfondimenti

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Esercizio 1: calcolo insieme intersezione

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

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

Fondamenti di Programmazione Recupero Primo Parziale 30 Gennaio 2008 Traccia A

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

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Dicembre 2001

Laboratorio di Programmazione 1 [Java]

Problemi, algoritmi e oggetti

Programmazione II Compitino (Vers. B)

Fondamenti di informatica T-1 (A K) Esercitazione 2: Linguaggio Java, basi e controllo del flusso

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Basi della programmazione in Java. Anteprima. Uso delle variabili. Il concetto di variabile Uso delle variabili. Input da tastiera I tipi Esercizi

Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5

10 - Programmare con gli Array

Una introduzione al linguaggio Java

Linguaggio C. Problemi di Ricerca e Ordinamento: Algoritmi e Complessità.

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Algoritmi

Programmazione I - corso B a.a prof. Viviana Bono

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Le Stringhe. Usare la classe java.lang.string

Transcript:

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

Ricerca binaria 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

Ricerca binaria 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

Ricerca binaria 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

Ricerca binaria 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

Ricerca binaria 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

Ricerca binaria 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

Esempio di gestione di un elenco di nomi 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

Esempio di gestione di un elenco di nomi 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

Esempio di gestione di un elenco di nomi // 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

Esempio di gestione di un elenco di nomi 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

Esempio di gestione di un elenco di nomi 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

Esempio di gestione di un elenco di nomi 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