Professional Documents
Culture Documents
Esercizi Svolti
A.A. 2010/2011
Esercizio 1
Testo: Descrivere in pseudo-codice un algoritmo efficiente che, dato un insieme di n
intervalli I = {Ii = (si , ei ) | 1 i n} e i relativi pesi w(Ii ) N , calcoli il peso
massimo di un sottoinsieme di intervalli non sovrapposti (weighted interval scheduling
problem).
Mostrarne inoltre il funzionamento sul seguente insieme di intervalli.
Istanza:
I1
I2
I3
I4
= (1, 4)
= (3, 5)
= (0, 6)
= (4, 7)
w(I1 ) = 2
w(I2 ) = 3
w(I3 ) = 4
w(I4 ) = 3
I5
I6
I7
I8
= (3, 8)
= (5, 9)
= (6, 10)
= (8, 11)
w(I5 ) = 5
w(I6 ) = 5
w(I7 ) = 5
w(I8 ) = 7
Si assuma che ciascun intervallo includa lestremo sinistro ma non includa lestremo
destro (cio`e gli intervalli (2, 5) e (5, 10) non sono da considerarsi sovrapposti).
Svolgimento: Per semplicit`
a assumiamo che gli intervalli siano ordinati in senso non
decrescente per tempo di fine (cio`e per estremo destro). Altrimenti tali intervalli possono
essere facilmente ordinati in tempo O(n log n).
Assumiamo inoltre che sia disponibile un vettore p[i] che indica, se esiste, lindice
dellultimo intervallo che termina prima dellinizio dellintervallo Ii o 0, altrimenti. In
altre parole:
(
0
se ej > si per ogni 1 j < i
p[i] =
max1j<i {j | ej si } altrimenti
dove, ricordiamo, si e ei sono, rispettivamente, gli estremi sinistro e destro dellintervallo
Ii (cio`e Ii = (si , ei ) per ogni 1 i n). Il vettore p[i] pu`o essere facilmente calcolato
dalla sequenza degli intervalli (ordinati in senso crescente per tempo di fine/estremo
destro) in tempo (n).
Esercizio 2
Testo: Scrivere un equazione di ricorrenza di programmazione dinamica per stabilire
se esiste un cammino di lunghezza al pi`
u 4 tra un vertice i e un vertice j di un grafo
G = (V, E) non pesato (orientato o non orientato).
(k)
i e j passando soltanto per alcuni dei vertici {1, . . . , k}, e Ti,j,p = Falso altrimenti.
Lequazione di programmazione dinamica `e la seguente (ricordiamo che la lunghezza
(k)
di un cammino `e definita come il numero di archi che lo compongono, quindi Ti,j,0 `e
sempre uguale a Falso):
Casi base
(0)
Ti,j,p
(
Vero
=
Falso
se (i, j) E e p > 0
altrimenti
(k)
Ti,j,0 = Falso
Caso generale
(k)
Ti,j,p
(k1)
Ti,j,p
(k1)
(k1)
= or Ti,k,p
and Tk,j,p2
1
Esercizio 3
Testo: Descrivere in pseudocodice una procedura di ricostruzione e stampa di un
cammino per il seguente problema:
Problema 1. Esistenza di un cammino alternato.
Input: Un grafo G = (V, E), una funzione col : V {rosso, nero};
Output: Vero se esiste un cammino da un vertice i a un vertice j che alterna i colori
dei vertici, Falso altrimenti.
(k)
Svolgimento: Sia Ti,j = Vero se esiste un cammino che alterna i colori dei vertici tra
(k)
i e j passando soltanto per alcuni dei vertici {1, . . . , k}, e Ti,j = Falso altrimenti.
Lequazione di programmazione dinamica, come visto a lezione, `e:
Caso base
(0)
Ti,j
(
Vero
=
Falso
Caso generale
(k)
Ti,j = or
( (k1)
Ti,j
(k1)
Ti,k
(k1)
Tk,j
coppia (i0 , j 0 ) tale che Ti0 ,j 0 = Vero (precondizioni). In altre parole, sono corrette se e
soltanto se esiste un percorso a vertici di colori alternati tra i vertici i0 e j 0 .
Chiaramente, il percorso (a vertici di colori alternati) da un vertice i a un vertice j si
ottiene con la chiamata Stampa-Percorso(i, j).
Algorithm 2: pred : i0 , j 0 , k 0 7 p
(k0 )
2
3
4
return ;
else // cio`e k0 > 0
(k0 1)
if Ti0 ,j 0 = Vero then // cio`e k0 non appartiene al cammino
/* Il predecessore di j 0 sul cammino da i0 a j 0 `e il predecessore di j 0 sul
cammino da i0 a j 0 senza considerare k0
5
6
return
1) ;
else // cio`e k appartiene al cammino
/* k0 appartiene al cammino da i0 a j 0 , quindi il predecessore di j 0 `e da
return pred(k 0 , j 0 , k 0 1) ;
1
2
3
4
5
6
7
*/
pred(i0 , j 0 , k 0
*/
i0
*/
Esercizio 4
Testo: Definire unequazione di ricorrenza di Programmazione Dinamica per la soluzione del seguente problema:
Problema 2. Longest Increasing Subsequence (LIS).
Input: Una sequenza S = hs1 , s2 , . . . , sn i di numeri naturali;
Output: La lunghezza massima di una sottosequenza monotona crescente di S.
Svolgimento: Lidea alla base della risoluzione del problema `e quella di determinare,
per ogni elemento si della sequenza S la lunghezza massima di una sottosequenza monotona crescente che termina (esattamente) con lelemento si . Chiaramente, la soluzione
finale del problema sar`
a, poi, il massimo delle lunghezze cos` determinate.
Sia L[i] la lunghezza massima di una sottosequenza monotona crescente di S che termina con lelemento si . Si assuma che L[0] (cio`e la lunghezza massima di una sottosequenza
della sequenza composta da 0 elementi) sia uguale a 0. Per capire come calcolare L[i]
proviamo ad analizzare la sottostruttura di una soluzione ottima del problema. Si noti
che la pi`
u lunga sottosequenza monotona crescente sj1 sj2 . . . sjk di S che termina con si `e
sicuramente composta (banalmente) dallelemento si (e quindi ha lunghezza almeno pari
a 1). La parte che precede lelemento si (= sjk ) nella pi`
u lunga sottosequenza monotona
crescente (cio`e sj1 sj2 . . . sjk1 ) sar`
a una pi`
u lunga sottosequenza monotona crescente del
prefisso s1 s2 . . . si1 che termina con un elemento sjk1 tale che sjk1 < si . Infatti se, per
assurdo, cos` non fosse (cio`e se sj1 sj2 . . . sjk1 non fosse una pi`
u lunga sottosequenza monotona crescente che termina con lelemento sjk1 ) allora esisterebbe una sottosequenza
monotona crescente pi`
u lunga di sj1 sj2 . . . sjk che contraddice lipotesi di ottimalit`a di
sj1 sj2 . . . sjk .
Questo ragionamento si traduce immediatamente nella seguente equazione di ricorrenza:
Caso base
L[0] = 0
Caso generale
L[i] = 1 + max{L[j] | j < i and sj < si }
Per quanto gi`
a detto, la soluzione del problema (cio`e la lunghezza della pi`
u lunga
sottosequenza monotona crescente di S) sar`a pari a max{L[i] | 1 i n} mentre il
tempo di calcolo necessario `e pari a O(n2 + n), cio`e O(n2 ) (si noti infatti che il tempo
richiesto per calcolare ciascun valore L[i] `e pari a O(i)).
Esercizio 5
Testo: Definire unequazione di ricorrenza di Programmazione Dinamica per la soluzione del seguente problema:
Problema 3. Longest Common Increasing Subsequence (LCIS).
Input: Due sequenza S = hs1 , s2 , . . . , sn i e T = ht1 , t2 , . . . , tm i di numeri naturali;
Output: La lunghezza massima di una sottosequenza monotona crescente comune a S e
T.
Svolgimento: La soluzione di questo problema combina le idee usate per risolvere il
problema della Longest Common Subsequence (LCS) e del precedente Longest Increasing
Subsequence (LIS).
Infatti, sia L[i, j] la lunghezza di una sottosequenza monotona crescente comune a S
e T che termina (esattamente) con gli elementi si e tj . Se si e tj sono diversi, allora
una sottosequenza comune che termina con si e tj , chiaramente, non pu`o esistere e, in
questo caso, assumiamo di porre L[i, j] uguale a 0. Come per il problema precedente e
per il problema della LCS assumiamo che L[i, 0] e L[0, j] siano uguali a 0.
Lequazione di Programmazione Dinamica risultante sar`a la seguente:
Caso base
L[0, 0] = 0
L[i, 0] = 0
L[0, j] = 0
Caso generale
(
1 + max{L[i0 , j 0 ] | (i0 < i) (j 0 < j) (si0 = tj 0 ) (si0 < si )}
L[i, j] =
0
se si = tj
altrimenti
1in
1jm
Considerato che il tempo per calcolare ciascun elemento L[i, j] `e O(ij), il tempo di
calcolo totale per risolvere il problema `e O(n2 m2 ).