Sistemi e Tecnologie Informatiche

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

Algoritmi e Strutture Dati
INFORMATICA Algoritmi fondamentali
Process synchronization
/ fax
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
1 la competenza alfabetica della popolazione italiana CEDE distribuzione percentuale per livelli.
Algoritmi e Strutture Dati
Lez. 51 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Complessita'
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Anno accademico Array e puntatori in C.
Alberi binari di ricerca
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
PROGRAMMI DI RICERCA E ORDINAMENTO
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmo di Ford-Fulkerson
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Programmazione 1 9CFU – TANTE ore
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
Corso di Laurea in Biotecnologie Informatica (Programmazione)
CORSO DI PROGRAMMAZIONE II
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Dipartimento di Informatica e Sistemistica Alessandro DE CARLI Anno Accademico MOVIMENTAZIONE CONTROLLATA AZIONAMENTI CON MOTORE BRUSHLESS.
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Heap binomiali Gli heap binomiali sono strutture dati su cui si possono eseguire efficientemente le operazioni: Make(H) : crea uno heap vuoto Insert(H,
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
Scuola dell'Infanzia sez.D
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
Elementi di Informatica di base
Sistemi e Tecnologie Informatiche
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Radix-Sort(A,d) // A[i] = cd...c2c1
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
SCOPRI LA TABELLINA click Trova la regola nascosta… click
1 Questionario di soddisfazione ATA - a. sc. 2008/09 Il questionario è stato somministrato nel mese di aprile Sono stati restituiti 29 questionari.
1101 = x 10 x 10 x x 10 x = CORRISPONDENZE
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Come affrontare un problema… Marco D. Santambrogio – Ver. aggiornata al 18 Ottobre.
14 marzo 2002 Avvisi:.
Ad opera di: Matteo Donatelli e Maurizio Di Paolo Presentazione su : Elettropneumatica 1.
Bando di Residenza Cap Scheda ENTE 3ROL - Richieste On Line.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Pippo.
Teoria degli algoritmi e della computabilità Terza giornata: Ricerca e ordinamento ottimi. P vs NP, algoritmi di approssimazione, e il potere della randomizzazione.
Bando Pittori e Scultori in Piemonte alla metà del ‘700
Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo.
lun mar mer gio ven SAB DOM FEBBRAIO.
alberi completamente sbilanciati
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Come affrontare un problema… Marco D. Santambrogio – Ver. aggiornata al 21 Agosto.
ALGORITMI DI RICERCA Nella programmazione s’incontra spesso la necessità di ricercare un elemento (chiave) in un elenco, oppure di ordinare gli elementi.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
Sistemi e Tecnologie Informatiche Complessità di calcolo.
Ricerca 01/08/2019 package.
Transcript della presentazione:

Sistemi e Tecnologie Informatiche Strategie di Ricerca Umberto Ferraro Petrillo

Ricerca di un elemento Problema: Dato un elenco di voti ed un valore x (e.g., 29), stabilire se x compare nell’elenco e in che posizione 25 27 21 29 24 26 19 27 20 30 25

Ricerca sequenziale (in ordine crescente) Consente l’individuazione di un qualsiasi valore all’interno di un elenco Gli elementi che compongono l’elenco sono disposti in un ordine qualunque Si scorre l’elenco dal primo all’ultimo elemento confrontando l’elemento corrente con quello ricercato E’ possibile stabilire che un elemento è assente solo dopo aver considerato tutti gli elementi della lista

Ripeti per n-1 volte o fino a che Voti[i] è uguale ad elem 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Sia Voti l’elenco di input, n la taglia dello stesso ed elem l’elemento cercato int PosizioneElemento(int Voti[], int elem, int n) /* Effettua la ricerca esaustiva di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ { int i = 0; // Verifichiamo se la fine dell’elenco è stata raggiunta // o se l’elemento corrente coincide con quello cercato while ( i<n-1 && Voti[i] != elem ) i++; // Consideriamo il prossimo elemento if (Voti[i] == elem) return i; // L’elemento è stato individuato else return -1; // L’elemento non è presente } /* PosizioneElemento */ Sia i l’indice dell’elemento attualmente considerato, inizialmente i = 0 Ripeti per n-1 volte o fino a che Voti[i] è uguale ad elem Considera il prossimo elemento (i=i+1) Se Voti[i] è uguale ad elem restituisci i altrimenti restituisci -1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 int PosizioneElemento(int Voti[], int elem, int n) /* Effettua la ricerca esaustiva di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ { int i = 0; // Verifichiamo se la fine dell’elenco è stata raggiunta // o se l’elemento corrente coincide con quello cercato while ( i<n-1 && Voti[i] != elem ) i++; // Consideriamo il prossimo elemento if (Voti[i] == elem) return i; // L’elemento è stato individuato else return -1; // L’elemento non è presente } /* PosizioneElemento */

Ricerca di un elemento Supponiamo che l’elenco di partenza sia ordinato, è possibile migliorare la ricerca sequenziale? 19 21 24 25 25 26 27 28 28 29

Ricerca binaria Si consideri un elenco in input ordinato A ed un valore x da ricercare (e.g., 26): Passo 1: Confrontiamo x con l’elemento centrale dell’elenco (A[4]) 1 2 3 4 5 6 7 8 9 19 21 24 25 25 26 27 28 28 29 Caso 1: x==A[4], Ricerca terminata! Caso 2: x<A[4], proseguiamo la ricerca in A[0…3] Caso 3: x>A[4], proseguiamo la ricerca in A[5…9]

Ricerca binaria Ricerchiamo l’elemento 26 1 2 3 4 5 6 7 8 9 Confrontiamo 26 con A[4], è più grande (caso 3), proseguiamo la ricerca in A[5..9] 19 21 24 25 25 26 27 28 28 29 26>25 (A[4]) 19 24 25 26 27 28 29 21 6 3 1 7 4 2 8 5 9 Confrontiamo 26 con A[7], è più piccolo (caso 2), proseguiamo la ricerca in A[5..6] 26<28 (A[7]) 19 24 25 26 27 28 29 21 30 6 3 1 7 4 2 8 5 9 10 Confrontiamo 26 con A[5], i due numeri coincidono, la ricerca termina 26==26 (A[5])

Cerca elem nel vettore ordinato Voti[inf … sup] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Cerca elem nel vettore ordinato Voti[inf … sup] int PosizioneElemento(int inf, int sup, int Voti[], int elem) { /* Effettua la ricerca binaria di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ if ( inf>sup) // Verifichiamo se esistono ancora elementi da considerare return -1; else{ int med = (int) (inf + sup) / 2; if (Voti[med] == elem) return med; // L’elemento è stato individuato else if (elem < Voti[med]) { sup = med -1; // Cerchiamo nella porzione di sinistra return PosizioneElemento(Voti, inf, sup, elem); } else{ inf = med + 1; // Cerchiamo nella porzione di destra return PosizioneElemento(Voti, inf, sup, elem); } } } /* PosizioneElemento */ Se l’array è vuoto (inf>sup) la ricerca termina (ritorna -1) Considera l’elemento nella posizione centrale (med=(inf+sup)/2) Se elem è uguale a Voti[med] la ricerca termina (ritorna med) Altrimenti, se elem è minore di Voti[med] cerca elem nel vettore ordinato Voti[inf … med -1] Altrimenti, cerca elem nel vettore ordinato Voti[med+1 … sup]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 int PosizioneElemento(int inf, int sup, int Voti[], int elem) { /* Effettua la ricerca binaria di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ if ( inf>sup) // Verifichiamo se esistono ancora elementi da considerare return -1; else{ int med = (int) (inf + sup) / 2; if (Voti[med] == elem) return med; // L’elemento è stato individuato else if (elem < Voti[med]) { sup = med -1; // Cerchiamo nella porzione di sinistra return PosizioneElemento(Voti, inf, sup, elem); } else{ inf = med + 1; // Cerchiamo nella porzione di destra return PosizioneElemento(Voti, inf, sup, elem); } } } /* PosizioneElemento */

Ricerca binaria vs Ricerca sequenziale L’efficienza di un algoritmo di ricerca può essere stimata in funzione del numero di confronti che esso richiede L’algoritmo peggiore è quello che necessita del maggior numero di confronti

Ricerca sequenziale Si consideri il problema della ricerca di un valore x all’interno di un elenco di taglia n Nella ricerca sequenziale ogni confronto ci consente di escludere al più un elemento Dopo il primo confronto avremo escluso l’elemento 0 Dopo il secondo confronto avremo escluso l’elemento 1 … Dopo il confronto k-esimo avremo escluso k elementi Nel peggiore dei casi (l’elemento ricercato non esiste nell’elenco) saranno necessari n confronti per dare una risposta

Ricerca binaria vs Ricerca sequenziale Nella ricerca binaria ogni confronto ci consente di escludere circa la metà degli elementi presenti Dopo il primo confronto restringiamo la ricerca ad n/2 elementi Dopo il secondo confronto restringiamo la ricerca ad (n/2)/2 = n/4 elementi … Dopo il confronto k-esimo restringiamo la ricerca ad n/2k elementi Nel peggiore dei casi (l’elemento ricercato non esiste nell’elenco) porteremo avanti la ricerca sino a restringerla ad un solo elemento n/2k =1 Saranno quindi necessari al più k = log(n) confronti

Ricerca binaria vs Ricerca sequenziale Taglia elenco input Ricerca sequenziale Ricerca binaria n=1,000 1,000 9,96 n=10,000 10,000 13,28 n=100,000 100,000 16,6 n=1,000,000 1,000,000 19,9