7
Algoritmi e Strutture Dati 2 Esercizi Svolti A.A. 2010/2011 Esercizio 1 Testo: Descrivere in pseudo-codice un algoritmo efficiente che, dato un insieme di n intervalli I = {I i =(s i ,e i ) | 1 i n} e i relativi pesi w(I i ) 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: I 1 = (1, 4) w(I 1 )=2 I 5 = (3, 8) w(I 5 )=5 I 2 = (3, 5) w(I 2 )=3 I 6 = (5, 9) w(I 6 )=5 I 3 = (0, 6) w(I 3 )=4 I 7 = (6, 10) w(I 7 )=5 I 4 = (4, 7) w(I 4 )=3 I 8 = (8, 11) w(I 8 )=7 Si assuma che ciascun intervallo includa l’estremo sinistro ma non includa l’estremo 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, l’indice dell’ultimo intervallo che termina prima dell’inizio dell’intervallo I i o 0, altrimenti. In altre parole: p[i]= ( 0 se e j >s i per ogni 1 j<i max 1j<i {j | e j s i } altrimenti dove, ricordiamo, s i e e i sono, rispettivamente, gli estremi sinistro e destro dell’intervallo I i (cio` e I i =(s i ,e i ) 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). 1

Es Svolti Bonizzoni 1011

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