05/11/2013
Algoritmi e strutture di dati 2
Paola Vocca
Lezione 4: Programmazione dinamica
Lezione 4- Programmazione dinamica
1
Caratteristiche
• Programmazione dinamica: paradigma basato sullo
stesso principio utilizzato per il divide et impera
o il problema viene decomposto in sotto-problemi
o a soluzione del problema è derivata da quelle di tali sottoproblemi
• Entrambi i paradigmi vengono applicati a partire da una
definizione ricorsiva che correla la soluzione di un
problema a quella di un insieme di sotto-problemi.
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
2
1
05/11/2013
Differenze tra programmazione dinamica e
divide et impera
• La programmazione dinamica è nata principalmente
per risolvere problemi di ottimizzazione, il divide et
impera è più mirato alla risoluzione di problemi non
necessariamente di ottimizzazione
• nel divide et impera un qualunque sotto-problema viene
considerato una sola volta, nella programmazione
dinamica uno stesso sotto-problema può rientrare come
componente nella definizione di più problemi
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
3
Differenze tra programmazione dinamica e
divide et impera
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
4
2
05/11/2013
Proprietà di decomposizione
Risoluzione mediante programmazione dinamica di un
problema caratterizzata dalle due proprietà della
decomposizione:
• Ottimalità dei sotto-problemi:
o La soluzione ottima di un problema deriva dalle soluzioni
ottime dei sotto-problemi in cui esso è stato decomposto
(come nel divide et impera).
• Sovrapposizione dei sotto-problemi:
o Uno stesso sotto-problema può venire usato nella soluzione
di due (o più) sotto-problemi diversi.
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
5
Definizione di un algoritmo di
programmazione dinamica
La definizione di un algoritmo di programmazione dinamica è
basata su:
1.
2.
3.
4.
caratterizzazione della struttura generale di cui sono istanze sia il
problema in questione che tutti i sotto-problemi
identificazione dei sotto-problemi elementari e individuazione
della relativa modalità di determinazione della soluzione
definizione di una regola ricorsiva per la soluzione in termini di
composizione delle soluzioni di un insieme di sotto-problemi
derivazione di un ordinamento di tutti i sotto-problemi, per il
calcolo efficiente e la memorizzazione delle loro soluzioni in una
tabella. (memorizzazione dei valori intermedi – memoization- in
una tabella di programmazione dinamica)
Numero di passi dell'algoritmo limitato superiormente dal prodotto
tra il numero di sotto-problemi e il costo di ricombinazione delle loro
soluzioni ottime
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
6
3
05/11/2013
Esempio: Numeri di Fibonacci
•
Esempio: successione di Fibonacci (0, 1, 1, 2, 3, 5, 8, 13,...)
o 0 = 0
o 1 = 1
o
= − 1 + − 2
≥ 2
• Ricorsione
Fib( n ) {
// n >= 0
if (n <= 1)
RETURN n;
else
RETURN Fib(n-1) + Fib(n-2);
}
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
7
Ricorsione inefficiente: analisi
=
(
….
−
−
−
−
−
=*
−
+
+
+
+
+
=
φ
+
−
− + =
− + )+ =
− + + =
− +
+ +
!
"
+
+
∑
, ≥ .
≤
+ =
∑
≤
>
=
Fib(n) richiede O(Fn+3) = O(φ
φn+3) passi,
dove φ = ( + ")/ ≈ , ' (
Algoritmi e strutture di dati 2
).... è il rapporto aureo
Lezione 4- Programmazione dinamica
8
4
05/11/2013
Fibonacci con programmazione
dinamica
Fib( n ) {
// n >= 0
F[0] = 0;
F[1] = 1;
for (k = 2; k <= n; k = k + 1)
F[k] = F[k-1] + F[k-2];
RETURN F[n];
[alvie]
}
L’array F è la tabella di programmazione dinamica e richiede
O(n) tempo per essere riempita
Fn può essere anche calcolato in tempo O(log n), basandosi
sulla forma chiusa di Binet.
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
9
Problema del resto
Dati:
• un insieme - = { , . . , / − }di tipi di monete , di valore
1 , … , 1/
• un numero illimitato di monete di tipo 2per 0 ≤ 2 ≤ 3 − 1
• un intero 4
si vuole determinare un vettore , … , / , dove
è il numero di
monete dell'2 −esimo tipo, in modo da ottenere il resto 4con il
minor numero possibile di monete.
•
•
Vogliamo quindi minimizzare
/
con il vincolo
5
/
5
Algoritmi e strutture di dati 2
1 =4
Lezione 4- Programmazione dinamica
10
5
05/11/2013
Soluzione ricorsiva
6(4):minimo numero di monete necessario per ottenere il resto 4
o 4 = è il caso base. Non occorre restituire alcuna moneta,
per cui 6
=
o 4 > : è il caso ricorsivo. Se si utilizza una moneta di tipo i per il
resto 4, allora il problema diventa creare il resto di 4 − 1 col
minor numero possibile di monete
Definizione di 6 4 conseguente:
6 4 =:
CD4 =
+∞
CD1 > 6ED6FG ≤ ≤ / −
+ min 6(4 − 1 )
+HI6 /D I
>:?@ AB
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
11
Algoritmo per il problema del resto
Basato sul riempimenti di una tabella resto di dimensione
4 + .
Problema più generale:
o resto[c] indica il minimo numero di monete necessarie
per ottenere il resto c
o Se c=R, abbiamo la soluzione
o riempimento della tabella da sinistra verso destra
• Caso base: resto[c]=0
• Caso ricorsivo, calcola resto[c] prendendo il minimo tra tutti i valori
resto[K − 1 ]+1
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
12
6
05/11/2013
Algoritmo per il problema del resto
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
13
Algoritmo per il problema del resto:
esempio
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
14
7
05/11/2013
Algoritmo per il problema del resto:
esempio
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
15
Algoritmo goloso per il problema del
resto
Più semplice: si effettuano iterativamente le operazioni
seguenti, fino ad ottenere 4.
o si sceglie la moneta di valore più alto a disposizione
o se ne usa la massima quantità possibile
Caratteristica tipica degli algoritmi golosi (greedy): le
scelte si basano principalmente sulla configurazione
attuale, senza cercare di valutarne le conseguenze sulle
configurazioni successive.
• Può essere interpretato come un caso speciale di
programmazione dinamica.
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
16
8
05/11/2013
Coin Changing: Greedy Algorithm
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
17
Coin Changing: Greedy Algorithm
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
18
9
05/11/2013
Algoritmo goloso per il problema del
resto
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
19
Non ottimalità dell'algoritmo goloso
per il problema del resto
Esempio: M = 9, 3 = 3, PQ = 6, PS = 4 PU = 1.
• Algoritmo goloso: una moneta da 6e tre monete da 1,
in totale 4
• Soluzione ottima: due monete da 4 e una 1, in totale 3
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
20
10
05/11/2013
Greedy Algorithm: Special cases
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
21
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
22
11
05/11/2013
Sequenza ottima di moltiplicazioni
Vogliamo usare la programmazione dinamica per calcolare il
prodotto di n matrici V2di taglia W2 XW2 + 1
Hp. semplificativa: il costo di moltiplicazione di due matrici di
taglia × Z e Z × [è pari a × Z × [
Esempio: W0 = 100, W1 = 20, W2 = 1000, W3 = 2, W4 = 50
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
23
Sequenza ottima di moltiplicazioni
• Il costo varia a seconda di come associamo il
prodotto utilizzando la moltiplicazione tra due
matrici: in generale, qual è il costo minimo?
• input: sequenza di interi positivi W0, W1, … , W (dove W2 × W> S è la taglia della matrice V2 )
• output: minimo numero di operazioni per calcolare
(detto costo minimo per V∗ ) con l’ipotesi che la
moltiplicazione di due matrici di taglia × Z e Z × [
richieda × Z × [ operazioni.
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
24
12
05/11/2013
Approccio di forza bruta
• Esiste un numero esponenziale (in ) di modi per
calcolare il costo minimo per V∗ usando l’associatività
con le parentesi: inefficiente!
[Tale numero è quello di Catalan Cn-1 = n.ro di alberi binari distinti
con n-1 nodi interni, aventi ciascuno due figli]
• Metodo più efficiente: per 0 ≤ 2 ≤ ^ ≤ − 1, sia
-( , _)= costo minimo per ` × ` + × L × `_
(la cui taglia risultante è W2 × Wa S )
• Il costo minimo per V∗ è quindi dato da b(0, − 1)
Algoritmi e strutture di dati 2
•
•
Lezione 4- Programmazione dinamica
25
Calcolo ricorsivo di M(i,j)
Caso base: -( , ) = per 0 ≤ 2 ≤ − 1
(per ottenere V2 non dobbiamo moltiplicare)
Caso induttivo: per ogni 2 ≤
` ×`
× L × `_ = (` × `
dim.: W2 × Wa
S
< ^,vale
× L × `6) × (`6
W2 × Wd
S
costo: c × c6
× `6
Wf
× c_
S × Wa S
b(2, ^) ≤ b(2, ) + b( + 1, ^) + W> × Wd
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
× L × `_ )
S
× Wa
S
26
13
05/11/2013
Calcolo ricorsivo di M(i,j)
b(2, ^ Algoritmi e strutture di dati 2
b$2,
b$
1, ^ W> Y Wd
S
Y Wa
Lezione 4- Programmazione dinamica
S
27
Numero esponenziale di chiamate
ricorsive, ciascuna invocata molte volte
con gli stessi parametri d’ingresso
Ricorsione costosa (come con Fibonacci)
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
28
14
05/11/2013
Tabella di programmazione dinamica
Riempita per diagonali a partire dalla principale
min
b 0,0
b 0,1
b 1,2
b 2,2
WQ Y WS Y Wi
WQ Y WU Y Wi
tabella: ghZ[2[2][^] = b(2, ^
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
29
Programmazione dinamica è iterativa
Sostituiscono le
chiamate ricorsive
Serve a ricostruire
la soluzione ottima
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
30
15
05/11/2013
Analisi di complessità
• La tabella costi ha taglia × e il calcolo di ciascuno
dei suoi elementi richiede j( )tempo (ciclo for più
interno)
• CostoMinimoIterativo richiede k( )tempo (laddove la
versione ricorsiva è esponenziale in )
• Lo spazio occupato è k(
)celle
• Esercizio: utilizzando la tabella indice, ricavare la
sequenza ottima di moltiplicazioni per il calcolo di `∗
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
31
Sotto-sequenza comune più lunga
Definizione del problema:
• due stringhe di caratteri l, m,di lunghezze 3,
• stringa nsotto-sequenza comune più lunga (longest
common subsequence, LCS) se non ne esistono sottosequenze di lunghezza maggiore che siano comuni ad
le m
• opq(+, ):lunghezza delle sotto-sequenze comuni più
lunghe di le m
• numero esponenziale in 3e di possibili sotto-sequenze
comuni di le m
• non è efficiente generarle tutte per poi scegliere quella
di lunghezza massima
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
32
16
05/11/2013
Sotto-sequenza comune più lunga
Definizione:
o( , _): lunghezza della sotto-sequenza più lunga
comune alle due sequenze formate dai primi 2
elementi di le dai primi ^elementi di m.
o , _ = opq ` , −
,r ,_ −
o s(3, ) fornisce la soluzione opq +,
o s(2, 0) = s(0, ^) = 0 per ogni2, ^
Algoritmi e strutture di dati 2
al problema
Lezione 4- Programmazione dinamica
33
Sotto-sequenza comune più lunga
Definizione:
CD = F_ = o , _ = :o − , _ − + CD , _ > D+ − = [_ − ]
max{o , _ − , o − , _ } CD , _ > D+ − ≠ [_ − ]
se una delle due sequenza è vuota, allora la sotto-sequenza
comune più lunga è vuota
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
34
17
05/11/2013
Sotto-sequenza comune più lunga
Definizione:
o ,_
CD
F_
,_
CD , _ , D+
:o
,o
, _ 0 CD , _ , D+
max.o , _
J_
L
v J_
L
se l’ultimo carattere c in ciascuna sequenza è uguale, esiste
una sotto-sequenza comune più lunga che lo contiene ed è
ottenibile da quella in cui l’ultimo carattere è rimosso.
c
c
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
35
Sotto-sequenza comune più lunga
Definizione:
o ,_
CD
F_
,_
CD , _ , D+
:o
max.o , _
,o
, _ 0 CD , _ , D+
J_
L
v J_
L
se invece l’ultimo carattere differisce, la sotto-sequenza comune più
lunga è quella ottenuta rimuovendo l’ultimo carattere in una sola delle
due sequenze
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
36
18
05/11/2013
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
37
Sotto-sequenza comune più lunga
Definizione:
o ,_
•
•
•
•
•
CD = F_ = o
− , _ − + CD , _ > D+ − = [_ − ]
=:
max{o , _ − , o − , _ } CD , _ > D+ − ≠ [_ − ]
Tabella lunghezza di dimensione (/ + ) × ( + ):
l'algoritmo pone Hw GxDyy+[ ][_] = s(2, ^)
j(3 ) elementi da determinare, corrispondenti a k(/ ) sottoproblemi
L'elemento Hw GxDyy+[ ][_]è calcolabile in tempo costante,
dati tutti gli elementi
Hw GxDyy+[6][C]con C < _o con C = _, 6 < L'algoritmo richiede tempo k(/ )
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
38
19
05/11/2013
Partizione di insiemi di interi
• Insieme di interi positivi ` = {+ , + , …, +
totale (pari) ∑
+ = C.
}di somma
• Si vuole determinare se esiste `z = + , + , …, + {|
tale che ∑{ + = C.
⊆`
• Risolubile generando esplicitamente tutti i sottoinsiemi di
`.
•
sottoinsiemi: tempo esponenziale in
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
39
Programmazione dinamica
• Definiamo per 0 ≤ 2 ≤ e 0 ≤ ^ ≤ Z
~(2, ^) = [ • sse esiste € ⊆ {l0, l1, . . , l> S }t.c. ∑‚∈„ • =j
Nota: ~( , Z) = [ • sse la partizione è possibile
[convenzione: {+ , + , … , + − } = ∅]
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
40
20
05/11/2013
Programmazione dinamica per partizione
Regola ricorsiva
se l’insieme è vuoto allora la somma ^ = 0è l’unica possibile
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
41
Programmazione dinamica per partizione
Regola ricorsiva
la somma pari ^ era già possibile con un sottoinsieme di
.+ , + , . . , + 0che non include l> S
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
42
21
05/11/2013
Programmazione dinamica per partizione
Regola ricorsiva
la somma pari ^èpossibile con un sottoinsieme che include
l> : eliminando l> S deve esistere un sottoinsime la cui
somma è pari a j l> S (ovviamente se j l> S )
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
43
Partizione di un insieme di interi: tabella di
programmazione dinamica
• Tabella di programmazione dinamica di taglia
Z+1
1 ×
• parti[i][j] = ~(2, ^)
• Ordine riempimento per righe
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
44
22
05/11/2013
Partizione di insiemi di interi: esempi
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
45
Programmazione dinamica e partizione di
insiemi di interi
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
46
23
05/11/2013
Analisi di complessità per partizione
• Tempo k( C)
• Spazio k( C)
k(C)usando solo le ultime due righe
compilate iterativamente
• Nota: in generale è possibile ottenere delle prestazioni
simili a quelle della programmazione dinamica usando
ricorsione + memoization
• [memoization = prender nota]
• Convenzione: Φ denota un valore indefinito
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
47
Ricorsione + memoization
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
48
24
05/11/2013
Pseudo-polinomialità e programmazione
dinamica
•
•
•
•
•
•
Quando gli interi coinvolti nel problema diventano molto grandi
dobbiamo usare un differente modello di computazione
Esempio: complessità dell’algoritmo di partizione è k( C)ma la
dimensione dell’input è circa + celle, per memorizzare la sequenza C,
+ , + , …, + : algoritmo pseudo-polinomiale
Al crescere di Crispetto ad n, non possiamo più pensare di memorizzare C
in una singola cella, ma piuttosto in
{ = k(log C ) celle (la sua rappresentazione binaria): la dimensione
dell’input diventa di circa + {celle di memoria
La complessità k( C) = k(
{)
diventa quindi esponenziale.
In tal caso va confrontata con quella k(
sottoinsiemi.
) che genera tutti i
In altre parole, k( C)è una complessità polinomiale soltanto se C =
k( )per una costante > .
Algoritmi e strutture di dati 2
Lezione 4- Programmazione dinamica
49
25