Upload
bossmilan
View
12
Download
2
Embed Size (px)
DESCRIPTION
esercizi algoritmi
Citation preview
Algoritmi e Strutture Dati 2Esercizi Svolti
A.A. 2010/2011
Esercizio 1
Testo: Descrivere in pseudo-codice un algoritmo efficiente che, dato un insieme di nintervalli I = {Ii = (si, ei) | 1 i n} e i relativi pesi w(Ii) N , calcoli il pesomassimo di un sottoinsieme di intervalli non sovrapposti (weighted interval schedulingproblem).Mostrarne inoltre il funzionamento sul seguente insieme di intervalli.
Istanza:
I1 = (1, 4) w(I1) = 2 I5 = (3, 8) w(I5) = 5I2 = (3, 5) w(I2) = 3 I6 = (5, 9) w(I6) = 5I3 = (0, 6) w(I3) = 4 I7 = (6, 10) w(I7) = 5I4 = (4, 7) w(I4) = 3 I8 = (8, 11) w(I8) = 7
Si assuma che ciascun intervallo includa lestremo sinistro ma non includa lestremodestro (cioe` gli intervalli (2, 5) e (5, 10) non sono da considerarsi sovrapposti).
Svolgimento: Per semplicita` assumiamo che gli intervalli siano ordinati in senso nondecrescente per tempo di fine (cioe` per estremo destro). Altrimenti tali intervalli possonoessere facilmente ordinati in tempo O(n log n).
Assumiamo inoltre che sia disponibile un vettore p[i] che indica, se esiste, lindicedellultimo intervallo che termina prima dellinizio dellintervallo Ii o 0, altrimenti. Inaltre parole:
p[i] =
{0 se ej > si per ogni 1 j < imax1j
Lalgoritmo impiega la tecnica della programmazione dinamica ed e` descritto in pseu-docodice dallAlg. 1
Algorithm 1: Weighted-Interval-Scheduling
Input : Una sequenza I = (s1, e1), . . . , (sn, en) di intervalli tale chee1 e2 . . . en e una funzione peso w : I N ;
Output: Il peso massimo di un sottoinsieme di intervalli a coppie non sovrapposti;A[0] 0;1for i 1 to n do2
A[i] max(A[i 1], w(Ii) + A[p[i]]);3end4return A[n];5
Dallinstanza data nel testo (gia` ordinata per tempo di fine), calcoliamo il seguentevettore p[i]:
p = 0 0 0 1 0 2 3 5
Quindi il vettore A[i] verra` iterativamente riempito come di seguito:
caso base A[0] = 0
1a iter. A[1] = max(0, 2 + 0) = 2
2a iter. A[2] = max(2, 3 + 0) = 3
3a iter. A[3] = max(3, 4 + 0) = 4
4a iter. A[4] = max(4, 3 + 2) = 5
5a iter. A[5] = max(5, 5 + 0) = 5
6a iter. A[6] = max(5, 5 + 3) = 8
7a iter. A[7] = max(8, 5 + 4) = 9
8a iter. A[8] = max(9, 7 + 5) = 12
Il peso massimo sara`, quindi, A[n] = A[8] = 12 (corrispondente agli intervalli {I1, I4, I8}).
2
Esercizio 2
Testo: Scrivere un equazione di ricorrenza di programmazione dinamica per stabilirese esiste un cammino di lunghezza al piu` 4 tra un vertice i e un vertice j di un grafoG = (V,E) non pesato (orientato o non orientato).
Svolgimento: Sia T(k)i,j,p = Vero se esiste un cammino di lunghezza al piu` p tra i vertici
i e j passando soltanto per alcuni dei vertici {1, . . . , k}, e T (k)i,j,p = Falso altrimenti.Lequazione di programmazione dinamica e` la seguente (ricordiamo che la lunghezza
di un cammino e` definita come il numero di archi che lo compongono, quindi T(k)i,j,0 e`
sempre uguale a Falso):
Casi base
T(0)i,j,p =
{Vero se (i, j) E e p > 0Falso altrimenti
T(k)i,j,0 = Falso
Caso generale
T(k)i,j,p = or
T(k1)i,j,p (cioe` il vertice k non appartiene al cammino)
T(k1)i,k,p1
and T(k1)k,j,p2
con p1 + p2 p(cioe` il vertice k appartiene al cammino)
Il costo della soluzione ottima sara` data da T(n)i,j,4, dove n = |V |.
Nota: nello svolgimento di questi esercizi si raccomanda di indicare sempre, oltre alle-quazione di ricorrenza nei suoi casi base e generale, anche il significato che si attribuisce
alla variabile matematica in gioco (T(k)i,j,p, in questo caso) e come e` calcolato lottimo del
problema. Tutti questi elementi, infatti, sono determinanti per la corretta esposizionedello svolgimento.
3
Esercizio 3
Testo: Descrivere in pseudocodice una procedura di ricostruzione e stampa di uncammino 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 coloridei vertici, Falso altrimenti.
Svolgimento: Sia T(k)i,j = Vero se esiste un cammino che alterna i colori dei vertici tra
i e j passando soltanto per alcuni dei vertici {1, . . . , k}, e T (k)i,j = Falso altrimenti.Lequazione di programmazione dinamica, come visto a lezione, e`:
Caso base
T(0)i,j =
{Vero se (i, j) E e col(i) 6= col(j)Falso altrimenti
Caso generale
T(k)i,j = or
{T(k1)i,j (cioe` il vertice k non appartiene al cammino)
T(k1)i,k and T
(k1)k,j (cioe` il vertice k appartiene al cammino)
La procedura di stampa e` composta da due funzioni ricorsive. La prima (chiamata
pred) stabilisce, data una terna (i, j, k) tale che T (k)
i,j = Vero, quale caso si e`verificato durante il calcolo dellequazione di ricorrenza e restituisce il predecessore di j
sul cammino a vertici alternati da i a j. La seconda (chiamata Stampa-Percorso)ricostruisce (e stampa) a ritroso, tramite successive chiamate alla prima funzione, linteropercorso da un vertice i a un vertice j.
Si noti che le procedure pred e Stampa-Percorso sono corrette se e soltanto se
sono chiamate, rispettivamente, su una terna (i, j, k) tale che T (k)
i,j = Vero e su una
coppia (i, j) tale che T (n)i,j = Vero (precondizioni). In altre parole, sono corrette se esoltanto se esiste un percorso a vertici di colori alternati tra i vertici i e j.
Chiaramente, il percorso (a vertici di colori alternati) da un vertice i a un vertice j siottiene con la chiamata Stampa-Percorso(i, j).
4
Algorithm 2: pred : i, j, k 7 pInput : Tre vertici i, j, k tali che T (k
)i,j = Vero;
Output: Il vertice p che precede j in un cammino a vertici di colori alternati da i
a j passando solamente da alcuni vertici dellinsieme {1, . . . , k};if k = 0 then1
/* Dato che T (k=0)
i,j = Vero (per precondizione), allora per la definizione del caso
base si ha che (i, j) E e col(i) 6= col(j) */return i ;2
else // cioe` k > 03
if T(k1)i,j = Vero then // cioe` k
non appartiene al cammino4/* Il predecessore di j sul cammino da i a j e` il predecessore di j sul
cammino da i a j senza considerare k */
return pred(i, j, k 1) ;5else // cioe` k appartiene al cammino6
/* k appartiene al cammino da i a j, quindi il predecessore di j e` da
ricercare sul cammino da k a j */
return pred(k, j, k 1) ;7
Algorithm 3: Stampa-Percorso (i, j)
Input : Due vertici i, j tali che T (n)i,j = Vero;Output: Stampa (a video) un cammino a vertici di colori alternati da i a j;if i = j then1
Stampa il vertice i ;2else3
ppred(i, j, n) ;4Stampa-Percorso(i, p) ;5Stampa il vertice j ;6
end7
5
Esercizio 4
Testo: Definire unequazione di ricorrenza di Programmazione Dinamica per la solu-zione del seguente problema:
Problema 2. Longest Increasing Subsequence (LIS).Input: Una sequenza S = s1, s2, . . . , sn 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 mono-tona crescente che termina (esattamente) con lelemento si. Chiaramente, la soluzionefinale del problema sara`, poi, il massimo delle lunghezze cos` determinate.
Sia L[i] la lunghezza massima di una sottosequenza monotona crescente di S che termi-na con lelemento si. Si assuma che L[0] (cioe` la lunghezza massima di una sottosequenzadella 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 notiche la piu` lunga sottosequenza monotona crescente sj1sj2 . . . sjk di S che termina con si e`sicuramente composta (banalmente) dallelemento si (e quindi ha lunghezza almeno paria 1). La parte che precede lelemento si(= sjk) nella piu` lunga sottosequenza monotonacrescente (cioe` sj1sj2 . . . sjk1) sara` una piu` lunga sottosequenza monotona crescente delprefisso s1s2 . . . si1 che termina con un elemento sjk1 tale che sjk1 < si. Infatti se, perassurdo, cos` non fosse (cioe` se sj1sj2 . . . sjk1 non fosse una piu` lunga sottosequenza mo-notona crescente che termina con lelemento sjk1) allora esisterebbe una sottosequenzamonotona crescente piu` lunga di sj1sj2 . . . sjk che contraddice lipotesi di ottimalita` disj1sj2 . . . sjk .
Questo ragionamento si traduce immediatamente nella seguente equazione di ricorren-za:
Caso baseL[0] = 0
Caso generaleL[i] = 1 + max{L[j] | j < i and sj < si}
Per quanto gia` detto, la soluzione del problema (cioe` la lunghezza della piu` lungasottosequenza monotona crescente di S) sara` pari a max{L[i] | 1 i n} mentre iltempo di calcolo necessario e` pari a O(n2 + n), cioe` O(n2) (si noti infatti che il temporichiesto per calcolare ciascun valore L[i] e` pari a O(i)).
6
Esercizio 5
Testo: Definire unequazione di ricorrenza di Programmazione Dinamica per la solu-zione del seguente problema:
Problema 3. Longest Common Increasing Subsequence (LCIS).Input: Due sequenza S = s1, s2, . . . , sn e T = t1, t2, . . . , tm di numeri naturali;Output: La lunghezza massima di una sottosequenza monotona crescente comune a S eT .
Svolgimento: La soluzione di questo problema combina le idee usate per risolvere ilproblema della Longest Common Subsequence (LCS) e del precedente Longest IncreasingSubsequence (LIS).
Infatti, sia L[i, j] la lunghezza di una sottosequenza monotona crescente comune a Se T che termina (esattamente) con gli elementi si e tj . Se si e tj sono diversi, allorauna sottosequenza comune che termina con si e tj , chiaramente, non puo` esistere e, inquesto caso, assumiamo di porre L[i, j] uguale a 0. Come per il problema precedente eper il problema della LCS assumiamo che L[i, 0] e L[0, j] siano uguali a 0.
Lequazione di Programmazione Dinamica risultante sara` la seguente:
Caso baseL[0, 0] = 0
L[i, 0] = 0
L[0, j] = 0
Caso generale
L[i, j] =
{1 + max{L[i, j] | (i < i) (j < j) (si = tj) (si < si)} se si = tj0 altrimenti
Essenzialmente il caso generale dellequazione di ricorrenza pone L[i, j] uguale a 0 se idue elementi si e tj sono differenti (per il motivo spiegato sopra) o, altrimenti, aggiunge1 alla lunghezza della piu` lunga sottosequenza monotona crescente comune ai prefissis1 . . . si1 e t1 . . . tj1 che termina con un elemento strettamente minore di si (e tj , chee` uguale a si).
Si noti che la condizione (si = tj) e` in realta` superflua perche se si 6= tj allora L[i, j]sarebbe uguale a 0 e indicherebbe che non esiste nessuna sottosequenza comune chetermina esattamente con gli elementi di quelle posizioni. Loperatore max andrebbequindi a preferire (se esiste) qualsiasi altra coppia di posizioni (i, j) strettamenteminori di, rispettivamente, i e j tale che si = tj .
La soluzione del problema sara`, invece:
max1in1jm
L[i, j]
Considerato che il tempo per calcolare ciascun elemento L[i, j] e` O(ij), il tempo dicalcolo totale per risolvere il problema e` O(n2m2).
7