Espressione - Dipartimento di Informatica

Algoritmi e Strutture Dati
Autunno 02
Espressione minima di valore dato
Dip. Informatica ed Appl.
Prof. G. Persiano
Università di Salerno
Consideriamo il seguente problema. Riceviamo in input un insieme X di n interi positivi ed un intero target
T . Desideriamo calcolare il costo minimo di un’espressione X-legale con valore T . Un’espressione con valore
T è X-legale (o semplicemente legale quando l’insieme X è chiaro dal contesto) che contiene solo gli elementi
di X (anche ripetuti), addizioni ed al più una moltiplicazione.
Ad esempio se X = {2, 4, 5, 11, 21} allora E1 = ((4 + 5) ∗ (2 + 11)) + 4 è un’espressione legale con valore
121. L’espressione E2 = ((4 + 5) ∗ (2 + 11)) ∗ 4 non è invece un’espressione legale in quanto comprende
due moltiplicazioni. Ogni addizione costa 1 ed ogni moltiplicazione costa 3. Il costo di un’espressione è
semplicemente la somma del costo delle sue operazioni. Ad esempio, E1 costa 6.
1. Indichiamo con S(t) l’insieme di tutte l’espressioni legali con valore t e con C(t) il minimo dei costi delle
espressioni in S(t).
2. L’insieme di tutte le espressioni di valore t può essere partizionato in due insiemi: l’insieme S(t, 0)
delle espressioni che non contengono moltiplicazioni e l’insieme S(t, 1) delle espressioni che contengono
esattamente una moltiplicazione. Denotando con C(t, 0) e C(t, 1) il costo della minima espressione di
ciascun insieme, abbiamo che C(t) = min{C(t, 0), C(t, 1)}.
3. In ogni espressione è possibile individuare l’operazione che è eseguita per ultima e questa può essere
un’addizione o una moltiplicazione. Pertanto, poniamo le seguenti definizioni:
• S(t, 1, ∗) è l’insieme di tutte le espressioni che hanno valore t, contengono una moltiplicazione e
l’ultima operazione è una moltiplicazione e denotiamo con C(t, 1, ∗) il costo minimo di un’espressione
di questo insieme.
• S(t, 1, +) è l’insieme di tutte le espressioni che hanno valore t, contengono una moltiplicazione e
l’ultima operazione è una addizione e denotiamo con C(t, 1, +) il costo minimo di un’espressione di
questo insieme.
• S(t, 0, +) è l’insieme di tutte le espressioni che hanno valore t, non contengono moltiplicazioni e
l’ultima operazione è una addizione e denotiamo con C(t, 0, +) il costo minimo di un’espressione di
questo insieme.
Notiamo ora che S(t, 1) = S(t, 1, ∗) ∪ S(t, 1, +) e quindi C(t, 1) = min{C(t, 1, ∗), C(t, 1, +)}. Inoltre,
abbiamo S(t, 0, +) = S(t, 0) e quindi C(t, 0, +) = C(t, 0);
4. Un’espressione E di S(t, 0, +) ha la forma E = E1 + E2 ove E1 ha valore a, con 1 ≤ a ≤ t − 1 e
non contiene alcuna moltiplicazione (quindi E1 ∈ S(a, 0)) e E2 ha valore (t − a) e non contiene alcuna
moltiplicazione (quindi E2 ∈ S(t − a, 0)).
Inoltre osserviamo che se E è l’espressione di costo minimo tra quelle di S(t, 0, +) allora anche E1 ed E2
hanno costo minimo in S(a, 0) e S(t − a, 0), rispettivamente.
Possiamo quindi affermare che
C(t, 0, +) =
min {C(a, 0) + C(t − a, 0) + 1}.
1≤a≤t−1
5. Un’espressione E di S(t, 1, +) ha la forma E = E1 + E2 ove E1 ha valore a, con 1 ≤ a ≤ t − 1 e contiene
una moltiplicazione (quindi E1 ∈ S(a, 1)) e E2 ha valore (t − a) e non contiene alcuna moltiplicazione
(quindi E2 ∈ S(t − a, 0)).
Come al passo precedente osserviamo che se E ha costo minimo anche E1 ed E2 avranno costo minimo
(in S(a, 1) e S(t − a, 0), rispettivamente) e quindi deduciamo che
C(t, 1, +) =
min {C(a, 1) + C(t − a, 0) + 1}.
1≤a≤t−1
Espressione minima di valore dato
2
6. Un’espressione E di S(t, 1, ∗) ha la forma E = E1 ∗ E2 ove E1 ha valore a, con 2 ≤ a ≤ t − 1 e a divisore
di t, e non contiene alcuna moltiplicazione (quindi E1 ∈ S(a, 0)) e E2 ha valore (t/a) e non contiene
alcuna moltiplicazione (quindi E2 ∈ S(t/a, 0)).
Seguendo un ragionamento simile a quello del passo precedente abbiamo
C(t, 1, ∗) =
min {C(a, 0) + C(t/a, 0) + 3}.
a|t
2≤a≤t−1
Abbiamo pertanto il seguente algoritmo
MinEspressioneLegale(X, T )
01. for t = 1 to T
02.
if t ∈ X then
03.
C(t, 0) = C(t, 1) = 0;
04.
else
05.
C(t, 1, +) = min1≤a≤t−1 {C(a, 1) + C(t − a, 0) + 1};
06.
C(t, 1, ∗) = min a|t {C(a, 0) + C(t/a, 0) + 3};
2≤a≤t−1
07.
C(t, 1) = min{C(t, 1, +), C(t, 1, ∗)};
08.
C(t, 0) = min1≤a≤t−1 {C(a, 0) + C(t − a, 0) + 1};
09. end;
10. return min{C(T, 0), C(T, 1)};
Nel calcolo del minimo ai passi 5, 6, 7, 8 assumiamo che il minimo di un insieme vuoto sia +∞. Notiamo
che alla t-esima iterazione del ciclo for, l’algoritmo calcola i valori di C(·, ·) e C(·, ·, ·) usando i valori della
funziona per valori del primo argomento minori di t che sono stati già calcolati ai passi precedenti. L’algoritmo
impiega tempo O(T 2 ) ed è pertanto pseudopolinomiale.