Programmazione dinamica Primi esempi

Documenti analoghi
Programmazione dinamica

Programmazione dinamica

Tempo e spazio di calcolo (continua)

Tempo e spazio di calcolo (continua)

Algoritmi e Strutture Dati. Capitolo 1 Un introduzione informale agli algoritmi

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Tecniche Algoritmiche: divide et impera

Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

Esempio : i numeri di Fibonacci

Algoritmi e strutture dati

Per regnare occorre tenere divisi i nemici e trarne vantaggio. fai ad ogni passo la scelta più conveniente

Esercizi di Algoritmi e Strutture Dati

Tecniche Algoritmiche

Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

Programmazione Dinamica (PD)

Esercizi di Algoritmi e Strutture Dati

Divide et impera (Divide and Conquer) Dividi il problema in sottoproblemi piu` semplici e risolvili ricorsivamente

Note per la Lezione 6 Ugo Vaccaro

Algoritmi e Strutture Dati. Luciano Gualà

Analisi asintotica. Astrazione: come il tempo di esecuzione cresce in funzione della taglia dell input asintoticamente.

Lezione 4. Problemi trattabili e soluzioni sempre più efficienti. Gianluca Rossi

Corso di Perfezionamento

Algoritmi e Strutture Dati. Luciano Gualà

Nozioni di base (II Parte)

LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi

Algoritmi. Strutture dati. Strumenti del linguaggio di programmazione

Il problema dello zaino

Tecniche Algoritmiche/1 Divide et Impera

In questa lezione. Il Mergesort: primo esempio di applicazione della tecnica divide et impera analisi tempo di esecuzione del Mergesort

Laboratorio di Programmazione M-Z

Algoritmi e strutture di dati 2

Algoritmi e Strutture Dati

Algoritmi e strutture dati

Programmazione dinamica. Progettazione di Algoritmi a.a Matricole congrue a 1 Docente: Annalisa De Bonis

In questa lezione: correttezza del mergesort Analisi del mergesort: relazioni di ricorrenza e alberi della ricorsione

Programmazione dinamica

Algoritmi e Strutture Dati

Sommario della lezione:

Terzo allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale

Algoritmi e Strutture Dati

Tecniche Algoritmiche/3 Programmazione Dinamica

LA RICORSIONE LA RICORSIONE LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO

Algoritmi e strutture di dati 2

Note per la Lezione 14 Ugo Vaccaro

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano. Usa la tecnica del divide et impera:

CAPITOLO 2. Divide et Impera

Pensiero Algoritmico. Lezione 3 23 Novembre Ripasso. Anatomia di un programma. Anatomia di un programma. Ozalp Babaoglu Università di Bologna

Un po di Matematica. Il volo dei numeri di Mario Merz, un'installazione luminosa sulla Mole Antonelliana, rappresenta la successione di Fibonacci

Algoritmi e Strutture Dati

Notazioni asintotiche. Martedì 30 settembre 2014

Algoritmi e Strutture Dati

LA RICORSIONE! Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa

Divide et impera su alberi

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

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

Tecniche di analisi degli algoritmi

Approcci nella soluzione di un problema

LA RICORSIONE IN C. CdL Ingegneria Informatica n.o. Anno Accademico 2006/07 Fondamenti di Informatica I corso A Giacomo Piscitelli pag.

LA RICORSIONE LA RICORSIONE

Tempo e spazio di calcolo

Moltiplicazione veloce di interi

Algoritmi e Strutture Dati. Divide-et-impera

Mergesort (cont.) 2018/ Lezione 16. Venerdì, 16 Novembre 2018

I numeri rossi sulla Mole Antonelliana a Natale. Algoritmi e Laboratorio a.a Lezioni. Le regole della riproduzione dei conigli.

Università degli Studi di Camerino Laurea in Informatica Prima Prova Parziale del corso di Algoritmi e Strutture Dati

Introduzione al Corso di Algoritmi

Algoritmi di ordinamento

Programmazione ricorsiva.

Ricerca di Massimo e Minimo di un Array

Programmazione ricorsiva: cenni

Informatica II. Capitolo 13 Programmazione dinamica. Programmazione dinamica vs Divide-et-impera. Divide-et-impera Tecnica ricorsiva

LA RICORSIONE. Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa

Esempio: il fattoriale di un numero fact(n) = n! n!: Z! N n! vale 1 se n " 0 n! vale n*(n-1)! se n > 0. Codifica:

Corso di Informatica

Divide et impera. Divide et impera. Tecniche Algoritmiche. Algoritmi e Strutture Dati. at(n/b) + f(n) se n>1 1 se n=1. T(n) = ha soluzione:

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA. INFORMATICA B Ingegneria Elettrica. La ricorsione

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

Quicksort Moltiplicazione di interi Master Theorem Valutazione del tempo di esecuzione di algoritmi iterativi e ricorsivi

Laboratorio di Algoritmi e Strutture Dati

Operativamente, risolvere un problema con un approccio ricorsivo comporta

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA INFORMATICA B + C

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

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

Università degli Studi dell Aquila Anno Accademico 2015/2016

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Tecniche di analisi degli algoritmi

Algoritmo. Programmazione

Programmazione ricorsiva

Università degli Studi dell Aquila Anno Accademico 2016/2017

complessità degli algoritmi

Algoritmi e Strutture Dati. Luciano Gualà

Capitolo 19. Ricorsione

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

5. DIVIDE AND CONQUER I

Corso di Perfezionamento

Transcript:

Programmazione dinamica Primi esempi (20 ottobre 2009 e 9 novembre 2010)

Programmazione dinamica e Divide et Impera Entrambe le tecniche dividono il problema in sottoproblemi: dalle soluzioni dei sottoproblemi è possibile risalire alla soluzione del problema di partenza Divide et Impera dà luogo in modo naturale ad algoritmi ricorsivi La programmazione dinamica può dar luogo ad algoritmi: ricorsivi con annotazione delle soluzioni su una tabella iterativi Idea chiave: calcolare la soluzione di ogni sottoproblema 1 sola volta ed annotarla su una tabella

Un primo esempio: calcolo dei numeri di Fibonacci Sequenza dei numeri di Fibonacci: 1, 1, 2, 3, 5, 8, 13,..? 1, 1, 2, 3, 5, 8, 13, 21, In generale il prossimo numero è la somma degli ultimi due. Come si formalizza? Indicando con F n (oppure F(n)) l n-esimo numero, abbiamo la seguente relazione di ricorrenza: F n = F n-1 + F n-2 se n 3 1 se n = 1,2

I numeri di Fibonacci Motivazione: problema di dinamica delle popolazioni studiato da Leonardo da Pisa (anche noto come Fibonacci) I numeri di Fibonacci godono di una gamma stupefacente di proprietà, si incontrano nei modelli matematici di svariati fenomeni e sono utilizzabili per molti procedimenti computazionali; essi inoltre posseggono varie generalizzazioni interessanti. A questi argomenti viene espressamente dedicato un periodico scientifico, The Fibonacci Quarterly. I numeri di Fibonacci sono legati alla sezione aurea.

Come calcolare l n-esimo numero di Fibonacci? Un primo approccio numerico Possiamo usare una funzione matematica che calcoli direttamente i numeri di Fibonacci. Infatti si può dimostrare che: e quindi

Un primo algoritmo numerico Fibonacci1(n) return 1/ 5 (Φ n Φ^n) Però: Problemi di accuratezza sul numero di cifre decimali; il risultato non sarebbe preciso.

Un secondo algoritmo ricorsivo Secondo approccio: utilizzare la definizione ricorsiva, che lavora solo su interi F n = F n-1 + F n-2 se n 3 1 se n = 1,2 Fibonacci2(n) If n 2 then Return 1 Else Return Fibonacci2(n-1)+ Fibonacci2(n-2)

Un esempio Fibonacci2(n) If n 2 then Return 1 Else Return Fibonacci2(n-1)+ Fibonacci2(n-2)

Analisi del tempo di esecuzione T(n) = T(n-1) + T(n-2) + Θ(1) n 3 T(n) = Θ(1) n =1, 2 T(n) = O(2 n ) Dimostrazione per induzione. Sia c>o tale che T(n) = T(n-1) + T(n-2) + c e T(1), T(2) c. Tesi: T(n) c 2 n. Base: T(1) c c 2 1 =2 c ; T(2) c c 2 2 = 4 c Ipotesi induttiva: T(n-1) c 2 n-1 e T(n-2) c 2 n-2 Passo induttivo: T(n) c 2 n-1 + c 2 n-2 + c c 2 n-1 + c 2 n-2 + c 2 n-2 = = c 2 n-1 + c ( 2 n-2 + 2 n-2 ) = c 2 n-1 + c ( 2 2 n-2 ) = c 2 n-1 + c 2 n-1 = c 2 n Nota: T(n) F(n) n Già calcolare F(100) con le attuali tecnologie richiederebbe un tempo inaccettabile Si può fare di meglio?

Difetti dell algoritmo ricorsivo Perché l algoritmo Fibonacci2 è lento? Perché continua a ricalcolare ripetutamente la soluzione dello stesso sottoproblema.

Migliorare l algoritmo ricorsivo (versione con annotazione) Perché non memorizzare le soluzioni dei sottoproblemi via via calcolate? Basta un array F[1..n] per memorizzare tutti valori già calcolati. L array F inizialmente è vuoto. Fibonacci3-memo(j) If j 2 then F[j]=1 Return F[j] Else if F[j] non è vuoto then Return F[j] Else Define F[j]= Fibonacci3-memo(j-1)+ Fibonacci3-memo(j-2) Return F[j] Endif

Esempio j=5 Fibonacci3-memo(j) If j 2 then F[j]=1 Return F[j] Else if F[j] non è vuoto then Return F[j] Else Define F[j]= Fibonacci3-memo(j-1)+ Fibonacci3-memo(j-2) Return F[j] Endif 1 1 2 3 5 F(5) 1 1 2 3 F(4) F(3) 1 1 2 F(3) F(2) 1 1 F(2) F(1) 1

Migliorare l algoritmo ricorsivo (versione iterativa) Fibonacci3-iter(n) F[1]=1 F[2]=1 For i=3,,n F[i]= F[i-1]+F[i-2] Endfor Return F[n] Esempio: n=5 1 1 1 1 1 2 1 1 2 3 1 1 2 3 5

Tempo di esecuzione Il tempo di esecuzione di Fibonacci3-iter è Θ(n) Anche il tempo di esecuzione di Fibonacci3-memo è Θ(n): ogni chiamata ricorsiva è eseguita solo una volta e ci sono O(n) chiamate a Fibonacci3-memo

Confronto prestazioni L algoritmo Fibonacci3-iter impiegano tempo proporzionale a n invece di esponenziale in n come Fibonacci2 Tempo effettivo richiesto da implementazioni in C dei due algoritmi su piattaforme diverse: Copyright 2004 - The McGraw - Hill Companies, srl 15

Analisi dello spazio necessario Lo spazio di memoria necessario per eseguire Fibonacci3-iter e Fibonacci3-memo è S(n) = Θ(n) perché entrambi gli algoritmi usano un array con n celle Ma in realtà possono bastare 3 celle (per qualsiasi n): per il calcolo di F[j] servono solo i valori nelle 2 celle precedenti 1 1 2 1 2 3 2 3 5

Programmazione dinamica: caratteristiche Fibonacci3-memo e Fibonacci3-iter sono algoritmi di programmazione dinamica: perché? 1. La soluzione al problema originale si può ottenere da soluzioni a sottoproblemi 2. Esiste una relazione di ricorrenza per la funzione che dà il valore ottimale ad un sottoproblema 3. Le soluzioni ai sottoproblemi sono via via memorizzate in una tabella Due implementazioni possibili: Con annotazione (memoized) o top-down Iterativa o bottom-up

Programmazione dinamica vs Divide et Impera Entrambe le tecniche dividono il problema in sottoproblemi: dalle soluzioni dei sottoproblemi è possibile risalire alla soluzione del problema di partenza Dobbiamo allora considerare la tecnica Divide et Impera superata? NO: La programmazione dinamica risulta più efficiente quando: Ci sono dei sottoproblemi ripetuti Ci sono solo un numero polinomiale di sottoproblemi (da potere memorizzare in una tabella) Per esempio: nel MergeSort non ci sono sottoproblemi ripetuti.