Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi:

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

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

Note per la Lezione 6 Ugo Vaccaro

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:

Note per la Lezione 4 Ugo Vaccaro

Algoritmi di ordinamento

Esercizi di Algoritmi e Strutture Dati

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

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

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Primo allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Algoritmi di Ricerca. Esempi di programmi Java

Corso di Fondamenti di Informatica

La ricerca. Sequenziale Binaria L ordinamento. Selection Sort Appendice: Quick Sort. Sommario FONDAMENTI DI INFORMATICA 1. Ricapitolando un po

Cammini minimi fra tutte le coppie

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Algoritmi e loro proprietà. Che cos è un algoritmo? Un esempio di algoritmo

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

PROVETTE D ESAME. Algoritmi e Strutture Dati

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

UD 3.5a: Searching (parte 1) ALGORITMO DI RICERCA SEQUENZIALE. Dispense, cap

RICERCA IN UN VETTORE

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Algoritmi e Strutture Dati

Fondamenti di Informatica

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

Efficienza: esempi. Nella lezione precedente. Fondamenti di Informatica. Ferdinando Cicalese. ! Qualche problema computazionale

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.

Algoritmi di Ricerca. Esempi di programmi Java

Esercizi vari. Alberto Montresor. 19 Agosto, 2014

Introduzione agli algoritmi e le stru1ure da2

5) Equazioni di ricorrenza

In questa lezione Alberi binari di ricerca: la cancellazione

Permutazioni. 1 Introduzione

Algoritmi di ordinamento: Array e ricorsione

Derivazione numerica. Introduzione al calcolo numerico. Derivazione numerica (II) Derivazione numerica (III)

Complessità degli algoritmi. Obiettivi: Calcolare (valutare) la complessità di un algoritmo Confrontare algoritmi risolutivi del medesimo problema

Algoritmi e strutture dati

Ricorsione. La ricorsione consiste nella possibilità di definire una funzione in termini di se stessa

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)

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

Teoria dei Giochi Prova del 30 Novembre 2012

LA COMPLESSITA DEGLI ALGORITMI

Macchina di Turing Universale

Problemi e algoritmi. Il che cosa ed il come. Il che cosa ed il come. Il che cosa e il come

Problemi, istanze, soluzioni

Valutazione di progressioni geometriche

Ordinamento per inserzione e per fusione

Esercizi di Algoritmi e Strutture Dati

Tecniche di Ordinamento dei Vettori

SOLUZIONI DEL 1 0 TEST DI PREPARAZIONE ALLA 1 a PROVA INTERMEDIA

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Esercizi sulla complessità di frammenti di pseudo-codice

Calcolare x n = x x x (n volte)

Il Concetto Intuitivo di Calcolatore. Esercizio. I Problemi e la loro Soluzione. (esempio)

Tempo e spazio di calcolo (continua)

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

Esercizi Capitolo 12 - Divide-et-Impera

Ω (grande omega) Esempio 10 COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Esempio: rappresentare gli insiemi

Tempo e spazio di calcolo (continua)

Efficienza: esempi. Fondamenti di Informatica. Ferdinando Cicalese. Nella lezione precedente. Pseudocodice per descrivere algoritmi

Strutture dati e algoritmi. Sommario

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

in termini informali: un algoritmo è una sequenza ordinata di operazioni che risolve un problema specifico

Algoritmi e strutture di dati 2

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

Algoritmi e Strutture di Dati (3 a Ed.) String matching. Alan Bertossi, Alberto Montresor

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento

Esercitazione 4 Algoritmi greedy

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Indice. 1 Introduzione 2. 2 Algoritmo di compressione LZ78 3

11.4 Chiusura transitiva

Alberi Binari di Ricerca

Tecniche Algoritmiche: divide et impera

Introduzione alla programmazione

Informatica Generale Homework di Recupero 2016

La principale modalità di calcolo è l applicazione di funzioni

Il problema delle azioni

Studio degli algoritmi

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

1.1 Concetti base dell Informatica: Algoritmi

Albero di Riscorsione

Ricerca Operativa. G. Liuzzi. Lunedí 20 Aprile 2015

Introduzione agli Algoritmi

Accordo su chiavi. Accordo su una chiave. Diffie-Hellman [1976] Accordo su chiavi. Diffie-Hellman [1976] Diffie-Hellman [1976] ??

ITLCC 2006/10/6 19:09 page 7 #3

La ricorsione. Sommario. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Corso di Programmazione Problem Solving. Tipi di Problemi. Problemi Complessi Soluzione. Dott. Pasquale Lops. Primitivi. Complessi

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi di Ricerca

Lezione 8 programmazione in Java. Anteprima. La ricorsione. Nicola Drago Dipartimento di Informatica Università di Verona

Analisi asintotica della complessità di tempo degli algoritmi

Equazioni, funzioni e algoritmi: il metodo delle secanti

ESERCIZI DI PROGRAMMAZIONE. - condizionali e cicli -

Esercitazione 6. Array

Transcript:

Pag 24 3) Il problema della ricerca Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi: si incontrano in una grande varietà di situazioni reali; appaiono come sottoproblemi da risolvere nell ambito di problemi più complessi. Uno di questi problemi è la ricerca di un elemento in un insieme di dati (ad es. numeri, cognomi, ecc.). Iniziamo a definire un po più formalmente tale problema definendone l input e l output: Input: un vettore A di n numeri ed un valore v; Output: un indice i tale che A[i] = v, oppure un particolare valore null se il valore v non è presente nel vettore. 3.1 Ricerca sequenziale Un primo semplice algoritmo che viene in mente è ispezionare uno alla volta gli elementi del vettore, confrontarli con v e alla fine restituire il risultato. Ci si interrompe appena si trova v: Funzione Ricerca (A: vettore; v: intero) i 1 while ((i n) and (A[i] v)) i i + 1 if (i n) return i else return null Oppure: Funzione Ricerca (A: vettore; v: intero) i 1 for (i = 1 to n) if (A[i] = v) return i return null Questo algoritmo ha una complessità di Ө(n) nel caso peggiore (quando, cioè, v non è contenuto nel vettore) e di Ө(1) nel caso migliore (quando v viene incontrato per primo), quindi non abbiamo trovato una stima della complessità che sia valida per tutti i casi. In queste

Pag 25 situazioni diremo che la complessità computazionale dell algoritmo (in generale, non nel caso peggiore) è un O(n), per evidenziare il fatto che ci sono input in cui questo valore viene raggiunto, ma ci sono anche input in cui la complessità è minore. Nei casi, come questo, in cui non sia possibile determinare un valore stretto per la complessità computazionale, ed in cui il caso migliore e quello peggiore si discostano, è naturale domandarsi quale sia la complessità dell algoritmo nel caso medio. Supponiamo che v possa apparire con uguale probabilità in qualunque posizione, ossia che P(v si trova in i-esima posizione) = Allora il numero medio di iterazioni del ciclo è dato da: Un metodo alternativo è il seguente. Supponiamo che tutte le possibili n! permutazioni della sequenza di n numeri siano equiprobabili. Di queste, ve ne saranno un certo numero nelle quali v appare in prima posizione, un certo numero nelle quali v appare in seconda posizione, ecc. Il numero medio di iterazioni del ciclo sarà di conseguenza: numero medio di iterazioni = Ora, il numero di permutazioni nelle quali v appare nella i-esima posizione è uguale al numero delle permutazioni di (n-1) elementi, dato che fissiamo solo la posizione di uno degli n elementi, cioè (n 1)!. Quindi: numero di iterazioni = = = Con un metodo diverso abbiamo trovato lo stesso risultato. Dunque, la complessità del caso medio è un Ө(n). 3.2 Ricerca binaria E possibile progettare un algoritmo più efficiente nel caso in cui la sequenza degli elementi sia ordinata (come sono, ad esempio, i cognomi degli abbonati nell elenco telefonico). Come cerchiamo un nome nell elenco telefonico? Iniziamo sempre e comunque dalla prima lettera dell alfabeto? Ovviamente no andiamo direttamente a una pagina dove pensiamo di trovare cognomi che iniziano con la lettera giusta; se siamo precisi troviamo il nome nella pagina, altrimenti ci spostiamo in avanti o indietro (di un congruo numero di pagine) a seconda che la lettera del cognome che cerchiamo venga prima o, rispettivamente, dopo quelle delle iniziali dei cognomi contenuti nella pagina.

Pag 26 Un algoritmo che sfrutta questa idea è la ricerca binaria, mostrata nel seguito. Si ispeziona l elemento centrale della sequenza. Se esso è uguale al valore cercato ci si ferma; se il valore cercato è più piccolo si prosegue nella sola metà inferiore della sequenza, altrimenti nella sola metà superiore. Funzione Ricerca_binaria (A: vettore; v: intero) a 1 b A m while (A[m] v) if (A[m] > v) b m 1 else a m + 1 if (a > b) return null m return m Una prima considerazione: ad ogni iterazione si dimezza il numero degli elementi su cui proseguire l indagine. Questo ci permette di comprendere dove stia la grande efficienza della ricerca binaria: il numero di iterazioni cresce come log n. Il che significa, ad esempio, che per trovare (o sapere che non c è) un elemento in una sequenza ordinata di un miliardo di valori bastano circa 30 iterazioni! Per quanto sopra detto abbiamo che la complessità è: (logn) nel caso peggiore (l elemento non c è); (1) nel caso migliore (l elemento si trova al primo colpo). Avremo modo in seguito di calcolare formalmente la complessità di (logn) del caso peggiore che ora abbiamo individuato solo intuitivamente. Intanto, poiché caso migliore e caso peggiore non hanno la stessa complessità, valutiamo la complessità del caso medio, facendo le seguenti assunzioni: il numero di elementi è una potenza di 2 (per semplicità dei calcoli, ma è facile vedere che questa assunzione non modifica in alcun modo il risultato finale);

Pag 27 v è presente nella sequenza (altrimenti si ricade nel caso peggiore); tutte le posizioni di v fra 1 e n sono equiprobabili. Domandiamoci ora quante siano le posizioni raggiungibili alla i-esima iterazione: con una iterazione si raggiunge la posizione i = n/2; con due iterazioni si raggiungono due posizioni: i =, i = ; con tre iterazioni si raggiungono quattro posizioni: i =, i =, i =, i = ; e così via. In generale, l algoritmo di ricerca binaria esegue i iterazioni se e solo se v si trova in una delle 2 i-1 posizioni raggiungibili con tale numero di iterazioni. Chiamando n(i) il numero delle posizioni raggiungibili con i iterazioni, possiamo scrivere che il numero medio di iterazioni è: numero medio di iterazioni = = Ma ricordando che: otteniamo: = (k-1)2 k + 1 Ossia, il numero medio di iterazioni si discosta per meno di un confronto dal numero massimo di iterazioni! Infine, consideriamo una nuova formulazione dell algoritmo di ricerca binaria (nella quale sono volutamente tralasciati i dettagli per catturarne l essenza): Ricerca_binaria (A, v) se il vettore è vuoto restituisci null ispeziona l elemento A[centrale] se esso e uguale a v restituisci il suo indice se v < A[centrale] esegui Ricerca_binaria (metà sinistra di A, v) se v > A[centrale] esegui Ricerca_binaria (metà destra di A, v)

Pag 28 L aspetto cruciale di questa formulazione risiede nel fatto che l algoritmo risolve il problema riapplicando se stesso su un sottoproblema (una delle due metà del vettore). Questa tecnica si chiama ricorsione, ed è un argomento importantissimo che sarà illustrato nel prossimo capitolo.