Fonte: prima parte delle simulazioni d'esame di Algoritmi per l'Ingegneria, Ing. Informatica UniPD (2023-24 e 2025-26). Le due simulazioni hanno la stessa prima parte: dieci domande a risposta unica o a scelta multipla, in cui non si riporta il procedimento ma solo la risposta. Due riguardano la programmazione dinamica, una sulla LCS e una sulla Matrix Chain Multiplication. Qui sono svolte per esteso, con il metodo veloce da usare nel compito e la verifica con l'algoritmo. Le altre otto domande sono raccolte con gli argomenti di cui trattano.
Domanda 1: LCS dei prefissi
Testo. Siano X=⟨a,f,r,a⟩ e Y=⟨a,f,a⟩. Per 0≤i≤4 e 0≤j≤3, si denoti con l(i,j) la lunghezza di una LCS dei prefissi Xi e Yj. Determinare l(2,2)+l(4,3).
Risposta: 5.
Metodo veloce
Si traducono l(2,2) e l(4,3) nelle coppie di prefissi e si ragiona direttamente (Longest Common Subsequence - ricorrenza, tabella e ricostruzionela LCS di X (m caratteri) e Y (n caratteri) è la sottosequenza comune più lunga. Sottoistanze = coppie di prefissi (Theta(mn)). Ricorrenza: l(i,j) = 0 se i = 0 o j = 0; 1 + l(i-1,j-1) se x_i = y_j; max{l(i-1,j), l(i,j-1)} altrimenti. Bottom-up con tabelle l e b (freccia): mn confronti; ricostruzione in O(m+n). Il D&C sulla stessa ricorrenza costa C(m+n,m) - 1 nodi interni nel caso peggiore (esponenziale). Memoizzazione: stessa complessità nel caso peggiore, ma molto meno lavoro su stringhe simili. Spazio ridotto a Theta(min{m,n}) se serve solo la lunghezza.Longest Common Subsequence - ricorrenza, tabella e ricostruzione →):
- X2=⟨a,f⟩ e Y2=⟨a,f⟩ sono uguali, quindi l(2,2)=∣LCS(⟨a,f⟩,⟨a,f⟩)∣=2;
- X4=⟨a,f,r,a⟩ e Y3=⟨a,f,a⟩: Y3 è una sottosequenza di X4 (si cancella la r), quindi la LCS è Y3 stessa e l(4,3)=3 (non può superare ∣Y3∣=3).
Somma: l(2,2)+l(4,3)=2+3=5.
Regola utile: se una delle due stringhe è sottosequenza dell'altra, la LCS è la più corta e la sua lunghezza è min{i,j}.
Con l'algoritmo
Si riempie la tabella con la ricorrenza l(i,j)=1+l(i−1,j−1) se xi=yj, altrimenti max{l(i−1,j),l(i,j−1)}, con riga 0 e colonna 0 a zero.
|
ε |
a |
f |
a |
| ε |
0 |
0 |
0 |
0 |
| a |
0 |
1↖ |
1← |
1↖ |
| f |
0 |
1↑ |
2↖ |
2← |
| r |
0 |
1↑ |
2↑ |
2↑ |
| a |
0 |
1↖ |
2↑ |
3↖ |
Le celle in grassetto sono l(2,2)=2 e l(4,3)=3: 2+3=5. Per esempio l(2,2): x2=f=y2, quindi 1+l(1,1)=1+1=2. E l(4,3): x4=a=y3, quindi 1+l(3,2)=1+2=3. La ricostruzione dà ⟨a,f,a⟩. Tabella controllata con Python.
Domanda 2: costo della parentesizzazione ottima
Testo. Sia p=(1,9,10,4) il vettore delle dimensioni di una catena di 3 matrici rettangolari. Si calcoli il numero di moltiplicazioni tra scalari nella parentesizzazione ottima.
Risposta: 130.
Metodo veloce
Le matrici sono A1∈1×9, A2∈9×10, A3∈10×4 (Ai ha dimensioni pi−1×pi). Con tre matrici ci sono solo due parentesizzazioni: basta confrontarle, ricordando che un prodotto (a×b)(b×c) costa a⋅b⋅c (Matrix Chain Multiplication - parentesizzazione ottimadato il vettore p delle dimensioni di una catena di n matrici compatibili (A_i è p_(i-1) x p_i), si cerca la parentesizzazione che minimizza il numero di prodotti tra scalari. Le parentesizzazioni sono numeri di Catalan (esponenziali). Sottostruttura: i due sottoalberi dell'ultimo prodotto sono ottimi (cut-and-paste). Ricorrenza c(i,j) = min su k di c(i,k) + c(k+1,j) + p_(i-1) p_k p_j, c(i,i) = 0. D&C: 3^(n-1) - 1 operazioni. Bottom-up per diagonali crescenti con tabelle m e s: (n^3 - n)/3 prodotti, Theta(n^3). La memoizzazione ha lo stesso costo e non risparmia mai.Matrix Chain Multiplication - parentesizzazione ottima →).
- ((A1A2)A3): A1A2 costa 1⋅9⋅10=90 e dà una matrice 1×10; poi (A1A2)A3 costa 1⋅10⋅4=40. Totale 90+40=130.
- (A1(A2A3)): A2A3 costa 9⋅10⋅4=360 e dà una matrice 9×4; poi A1(A2A3) costa 1⋅9⋅4=36. Totale 360+36=396.
Il minimo è 130, con ((A1A2)A3).
Con l'algoritmo
m[i,i]=0; per le sottocatene di lunghezza 2: m[1,2]=p0p1p2=1⋅9⋅10=90 e m[2,3]=p1p2p3=9⋅10⋅4=360. Per m[1,3] si provano i due k:
- k=1: m[1,1]+m[2,3]+p0p1p3=0+360+1⋅9⋅4=396;
- k=2: m[1,2]+m[3,3]+p0p2p3=90+0+1⋅10⋅4=130.
Quindi m[1,3]=130 con s[1,3]=2, cioè ((A1A2)A3).
Varianti per esercitarsi
Stesso formato della prima parte (solo risposta). Le risposte sono state ottenute con l'algoritmo in Python e controllate a mano.
- X=⟨m,a,r,e⟩ e Y=⟨a,m,o,r,e⟩. Determinare l(2,2)+l(4,5).
Risposta: 4. l(2,2)=∣LCS(⟨m,a⟩,⟨a,m⟩)∣=1 (una sola delle due lettere si può tenere, nell'ordine), l(4,5): X è lunga 4 e ⟨m,r,e⟩ (o ⟨a,r,e⟩) è sottosequenza comune di lunghezza 3, e non esiste di lunghezza 4 perché X intera non è sottosequenza di Y (m viene dopo a in Y): l(4,5)=3. Somma 1+3=4.
- X=⟨p,a,s,t,a⟩ e Y=⟨t,a,s,t,o⟩. Determinare l(3,3)+l(5,5).
Risposta: 5. l(3,3)=∣LCS(⟨p,a,s⟩,⟨t,a,s⟩)∣=∣⟨a,s⟩∣=2; l(5,5)=∣⟨a,s,t⟩∣=3.
- p=(2,5,3,4), catena di 3 matrici. Costo della parentesizzazione ottima?
Risposta: 54. ((A1A2)A3): 2⋅5⋅3+2⋅3⋅4=30+24=54; (A1(A2A3)): 5⋅3⋅4+2⋅5⋅4=60+40=100.
- p=(5,2,6,3,4), catena di 4 matrici. Costo ottimo e parentesizzazione?
Risposta: 100, con (A1((A2A3)A4)): A2A3 costa 2⋅6⋅3=36; (A2A3)A4 costa 2⋅3⋅4=24; A1×(…) costa 5⋅2⋅4=40; totale 36+24+40=100. La tabella m ha m[1,2]=60, m[2,3]=36, m[3,4]=72, m[1,3]=66, m[2,4]=60, m[1,4]=100.
- Quante parentesizzazioni distinte ha una catena di 6 matrici? Quanti prodotti tra scalari esegue
MCM (con costo due per ogni k, vedi la nota) su 6 matrici?
Risposta: 42 (numero di Catalan); 3n3−n=3216−6=70.
Versione ripasso
Testo. Le due simulazioni (2023-24 e 2025-26) hanno la stessa prima parte, a sola risposta. Due domande sono di DP: (1) X=⟨a,f,r,a⟩, Y=⟨a,f,a⟩, l(i,j)=∣LCS(Xi,Yj)∣, calcolare l(2,2)+l(4,3); (2) p=(1,9,10,4), catena di 3 matrici, numero di moltiplicazioni tra scalari della parentesizzazione ottima.
- Domanda 1, metodo veloce (Longest Common Subsequence - ricorrenza, tabella e ricostruzionela LCS di X (m caratteri) e Y (n caratteri) è la sottosequenza comune più lunga. Sottoistanze = coppie di prefissi (Theta(mn)). Ricorrenza: l(i,j) = 0 se i = 0 o j = 0; 1 + l(i-1,j-1) se x_i = y_j; max{l(i-1,j), l(i,j-1)} altrimenti. Bottom-up con tabelle l e b (freccia): mn confronti; ricostruzione in O(m+n). Il D&C sulla stessa ricorrenza costa C(m+n,m) - 1 nodi interni nel caso peggiore (esponenziale). Memoizzazione: stessa complessità nel caso peggiore, ma molto meno lavoro su stringhe simili. Spazio ridotto a Theta(min{m,n}) se serve solo la lunghezza.Longest Common Subsequence - ricorrenza, tabella e ricostruzione →): X2=Y2=⟨a,f⟩, quindi l(2,2)=2; Y3=⟨a,f,a⟩ è sottosequenza di X4 (si toglie r), quindi l(4,3)=3. Somma 5. Se una stringa è sottosequenza dell'altra, la LCS è la più corta.
- Con l'algoritmo: l(i,j)=1+l(i−1,j−1) se xi=yj, altrimenti max{l(i−1,j),l(i,j−1)}; riga e colonna 0 a zero.
|
ε |
a |
f |
a |
| ε |
0 |
0 |
0 |
0 |
| a |
0 |
1↖ |
1← |
1↖ |
| f |
0 |
1↑ |
2↖ |
2← |
| r |
0 |
1↑ |
2↑ |
2↑ |
| a |
0 |
1↖ |
2↑ |
3↖ |
Celle in grassetto: l(2,2)=2, l(4,3)=3; somma 5.
- Domanda 2, metodo veloce (Matrix Chain Multiplication - parentesizzazione ottimadato il vettore p delle dimensioni di una catena di n matrici compatibili (A_i è p_(i-1) x p_i), si cerca la parentesizzazione che minimizza il numero di prodotti tra scalari. Le parentesizzazioni sono numeri di Catalan (esponenziali). Sottostruttura: i due sottoalberi dell'ultimo prodotto sono ottimi (cut-and-paste). Ricorrenza c(i,j) = min su k di c(i,k) + c(k+1,j) + p_(i-1) p_k p_j, c(i,i) = 0. D&C: 3^(n-1) - 1 operazioni. Bottom-up per diagonali crescenti con tabelle m e s: (n^3 - n)/3 prodotti, Theta(n^3). La memoizzazione ha lo stesso costo e non risparmia mai.Matrix Chain Multiplication - parentesizzazione ottima →): A1∈1×9, A2∈9×10, A3∈10×4. Con tre matrici solo due ordini. ((A1A2)A3): 1⋅9⋅10+1⋅10⋅4=90+40=130. (A1(A2A3)): 9⋅10⋅4+1⋅9⋅4=360+36=396. Minimo 130.
- Con l'algoritmo: m[1,2]=90, m[2,3]=360, m[1,3]=min{396, 130}=130, s[1,3]=2.
- Varianti con risposta: mare e amore: l(2,2)+l(4,5)=4; pasta e tasto: l(3,3)+l(5,5)=5; p=(2,5,3,4): 54; p=(5,2,6,3,4): 100; parentesizzazioni di 6 matrici: 42;
MCM su 6 matrici: 70.
- Errori tipici: scrivere pipkpj invece di pi−1pkpj; dimenticare che Ai è pi−1×pi; sommare invece di confrontare le due parentesizzazioni; nella LCS contare un simbolo quando xi=yj; confondere i prefissi Xi,Yj con le lunghezze totali.