Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati: Programmazione dinamica Algoritmi golosi Analisi ammortizzata Vedremo poi.

Slides:



Advertisements
Presentazioni simili
Ricorrenze Il metodo di sostituzione Il metodo iterativo
Advertisements

Master Bioinformatica 2002: Grafi Problema: cammini minimi da tutti i vertici a tutti i vertici Dato un grafo pesato G =(V,E,w), trovare un cammino minimo.
Programmazione dinamica: problema della sottosequenza più lunga
Sottoprogrammi: funzioni e procedure
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Procedure e funzioni ricorsive
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Informatica Generale Marzia Buscemi
COORDINATE POLARI Sia P ha coordinate cartesiane
Lez. 31 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Programmazione.
Moltiplicazioni con le frazioni
Definizione e caratteristiche
Programmazione dinamica
Alberi binari di ricerca
Master Bioinformatica 2002: Progetto di Algoritmi1 Programmazione Dinamica (PD) Altra tecnica per risolvere problemi di ottimizzazione, piu generale degli.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 1 Unintroduzione informale agli algoritmi Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Iterazione enumerativa (for)
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Algoritmi Paralleli e Distribuiti a.a. 2008/09
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Algoritmo di Ford-Fulkerson
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Trovare il percorso minimo da b ad ogni altro vertice
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
APPUNTI SUL LINGUAGGIO C
Algoritmi e Strutture Dati
Corso di Chimica Fisica II 2013 Marina Brustolon
Intelligenza Artificiale
Ordinamento dell’array
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ò.
Strutture dati per insiemi disgiunti
Radix-Sort(A,d) // A[i] = cd...c2c1
Calcolo Parallelo e Distribuito
Passo 3: calcolo del costo minimo
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
Terzo passo: lunghezza di una LCS LCS-Length(X, Y, m, n) for i = 0 to m c[i, 0] = 0 for j = 1 to n c[0, j] = 0 for j = 1 to n for i = 1 to m if x i ==
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Introduzione agli algoritmi e strutture dati 3/ed T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein Copyright © 2010 – The McGraw-Hill Companies srl.
14 marzo 2002 Avvisi:.
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Ricorsione CORDA – Informatica A. Ferrari Testi da Alessandro Bugatti
Allievi Elettrici - AA Le funzioni ricorsive in C
Capitolo 13 Cammini minimi: Algoritmo di Floyd e Warshall Algoritmi e Strutture Dati.
4/25/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo –
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
Programmazione dinamica Algoritmi golosi Analisi ammortizzata
Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.
Algoritmi golosi Tecniche di soluzione dei problemi viste finora:
Complessità Computazionale
Algoritmi e Strutture Dati Luciano Gualà
Rudimenti di Complessità Corso di Programmazione II Prof. Dario Catalano.
Transcript della presentazione:

Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati: Programmazione dinamica Algoritmi golosi Analisi ammortizzata Vedremo poi alcuni tipi di strutture dati importanti per le applicazioni: B-alberi Strutture dati per insiemi disgiunti

Esempio: taglio delle aste Problema del taglio delle aste E data unasta metallica di lunghezza n che deve essere tagliata in pezzi di lunghezza intera (con un costo di taglio trascurabile). Per ogni lunghezza l = 1,…,n è dato il prezzo p l a cui si possono vendere i pezzi di quella lunghezza. Si vuole decidere come tagliare lasta in modo da rendere massimo il ricavo della vendita dei pezzi ottenuti. Programmazione Dinamica

Esempio l plpl Lunghezza asta nRicavo massimo r n Suddivisione ottima o

Unasta di lunghezza n può essere tagliata in 2 n-1 modi distinti in quanto abbiamo una opzione tra tagliare o non tagliare in ogni posizione intera 1,…,n-1. Ad esempio per n = 4 abbiamo i seguenti 8 modi Suddivisioni

In generale il ricavo massimo r n o è il costo p n dellasta intera oppure si ottiene effettuando un primo taglio in posizione i e quindi sommando i ricavi massimi del primo e del secondo pezzo, ossia r n = r i + r n-i Quindi Osserviamo che la soluzione ottima del problema di ottiene da soluzioni ottime di sottoproblemi. Diciamo che il problema ha sottostruttura ottima.

Otteniamo una struttura ricorsiva più semplice se invece di scegliere la posizione i di un primo taglio intermedio scegliamo la lunghezza i del primo pezzo per cui r n = p i + r n-i Cut-Road(p, n) if n == 0 return 0 q = -1 for i =1 to n q = max(q, p[i]+Cut-Road(p, n-i)) return q

Albero di ricorsione per n = Lo stesso problema di dimensione 2 viene risolto due volte, quello di dimensione 1 quattro volte e quello di dimensione 0 otto volte. Questo spiega la complessità 2 n. Ripetizione dei sottoproblemi!!

Possiamo ridurre la complessità evitando di risolvere più volte gli stessi problemi. Un primo modo per farlo è dotare lalgoritmo di un blocco note in cui ricordare le soluzioni dei problemi già risolti: metodo top-down con annotazione. Un secondo modo per farlo è calcolare prima i problemi più piccoli memorizzandone le soluzioni e poi usare tali soluzioni per risolvere i problemi più grandi: metodo bottom-up.

Versione top-down con annotazione: Memoized-Cut-Road(p, n) for i = 0 to n // inizializza il blocco note r[i] = -1 return Cut-Road-Aux(p, n, r) Cut-Road-Aux(p, j, r) if r[j] 0 // il problema è già stato risolto return r[j] if j == 0 q = 0 else q = -1 for i = 1 to j q = max(q, p[i] + Cut-Road-Aux(p, j-i, r)) r[j] = q return q

Versione bottom-up: Bottom-Up-Cut-Road(p, n) r[0] = 0 // il problema più semplice for j = 1 to n q = -1 for i = 1 to j q = max(q, p[i] + r[j-i]) r[ j] = q return r[n]

Versione bottom-up estesa per calcolare la soluzione ottima e non solo il suo valore Extended-Bottom-Up-Cut-Road( p, n) r[0] = 0 for j = 1 to n q = -1 for i = 1 to j if q < p[i]+r[ j - i] q = p[i]+r[ j - i] s[ j] = i // memorizzo il taglio ottimo r[ j] = q return r ed s

La seguente procedura calcola e stampa la soluzione ottima: Print-Cut-Road-Solution( p, n) (r, s) = Extended-Bottom-Up-Cut-Road( p, n) j = n while j > 0 print s[j] j = j - s[j]

Moltiplicazione di matrici Esso richiede p q r prodotti scalari Lalgoritmo per moltiplicare due matrici A e B di dimensioni p q e q r è: Matrix-Multiply(A, B) for i = 1 to A.rows for j = 1 to B.columns C[i, j] = 0 for k = 1 to A.columns C[i, j] = C[i, j] + A[i, k] B[k, j] return C

Problema della moltiplicazione di matrici Si deve calcolare il prodotto A 1 A 2... A n di n matrici di dimensioni p 0 p 1, p 1 p 2,..., p n-1 p n Poiché il prodotto di matrici è associativo possiamo calcolarlo in molti modi.

Esempio: Per calcolare il prodotto A 1 A 2 A 3 di 3 matrici di dimensioni 200 5, 5 100, possiamo: a) moltiplicare A 1 per A 2 ( prodotti scalari) e poi moltiplicare per A 3 la matrice ottenuta ( prodotti scalari). In totale prodotti scalari. b) moltiplicare A 2 per A 3 (2500 prodotti scalari) e poi moltiplicare A 1 per la matrice 5 5 ottenuta (5000 prodotti scalari). In totale 7500 prodotti scalari.

Vogliamo trovare il modo per minimizzare il numero totale di prodotti scalari. In quanti modi possiamo calcolare il prodotto? Tanti quante sono le parentesizzazioni possibili del prodotto A 1 A 2... A n. Ad esempio per n = 4: (A 1 (A 2 (A 3 A 4 ))) (A 1 ((A 2 A 3 ) A 4 )) ((A 1 A 2 ) (A 3 A 4 )) ((A 1 (A 2 A 3 )) A 4 ) (((A 1 A 2 ) A 3 ) A 4 )

Il numero P(n) di parentesizzazioni possibili del prodotto A 1 A 2... A n di n matrici si esprime ricorsivamente come segue: Si può dimostrare che P(n) cresce in modo esponenziale. Quindi, tranne per valori di n molto piccoli, non è possibile enumerare tutte le parentesizzazioni.

Passo 1: struttura di una parentesizzazione ottima Supponiamo che una parentesizzazione ottima di A 1 A 2... A n preveda come ultima operazione il prodotto tra la matrice A 1..k (prodotto delle prime k matrici A 1... A k ) e la matrice A k+1..n (prodotto delle ultime n-k matrici A k+1... A n ). Le parentesizzazioni di A 1... A k e di A k+1... A n sono parentesizzazioni ottime per il calcolo di A 1..k e di A k+1..n. Perché?

Passo 2: soluzione ricorsiva Di conseguenza la matrice prodotto parziale A i..j è una matrice p i-1 p j con lo stesso numero p i-1 di righe della prima matrice A i e lo stesso numero p j di colonne dellultima matrice A j. Prendiamo come sottoproblemi il calcolo dei prodotti parziali A i..j delle matrici A i... A j. Ricordiamo che la generica matrice A i ha dimensioni p i-1 p i.

Se i = j allora A i..j = A i ed m[i,i] = 0. Se i < j allora A i..j = A i... A j si può calcolare come prodotto delle due matrici A i..k e A k+1..j con k compreso tra i e j-1. Il costo di questo prodotto è p i-1 p k p j. Quindi

Passo 3 Esempio A A A A A A i A A A A A A j p p mkmk mkmk mkmk mkmk mkmk mkmk A A A A A A A A A A A A A A A A 1..1 A 2..2 : = 15750A 2..2 A 3..3 : = 2625A 1..1 A 2..3 : = 7900 A 1..2 A 3..3 : = A 3..3 A 4..4 : = 750A 2..2 A 3..4 : = 6000 A 2..3 A 4..4 : = 4375 A 1..1 A 2..4 : = A 1..2 A 3..4 : = A 1..3 A 4..4 : = 9400 A 4..4 A 5..5 : = 1000A 3..3 A 4..5 : = 2500 A 3..4 A 5..5 : = 1500 A 2..2 A 3..5 : = A 2..3 A 4..5 : = 7125 A 2..4 A 5..5 : = A 1..1 A 2..5 : = A 1..2 A 3..5 : = A 1..3 A 4..5 : = A 1..4 A 5..5 : = A 5..5 A 6..6 : = 5000A 4..4 A 5..6 : = 6250 A 4..5 A 6..6 : = 3500 A 3..3 A 4..6 : = 5375 A 3..4 A 5..6 : = 9500 A 3..5 A 6..6 : = 9000 A 2..2 A 3..6 : = A 2..3 A 4..6 : = A 2..4 A 5..6 : = A 2..5 A 6..6 : = A 1..1 A 2..6 : = A 1..2 A 3..6 : = A 1..3 A 4..6 : = A 1..4 A 5..6 : = A 1..5 A 6..6 : = 26900