Algoritmi e Strutture Dati
Tecniche algoritmiche
Luigi Laura
Algoritmi e strutture dati
Luigi Laura
1. Divide et impera
2. Programmazione dinamica
3. Greedy
2
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Divide et impera
Tecnica top-down:
1. Dividi il problema in due o più sottoproblemi
2. Risolvi (ricorsivamente) i sottoproblemi
3. Ricombina soluzioni dei sottoproblemi per
ottenere la soluzione del problema originario
Esempi: ricerca binaria, mergesort, quicksort, …
3
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Moltiplicazione di interi di
lunghezza arbitraria
Moltiplicare (o sommare) due numeri non è
sempre eseguibile in tempo costante:
– se i numeri occupano più di una parola di memoria,
anche le operazioni elementari potrebbero richiedere
tempo superiore a O(1)
Moltiplicare due numeri a n cifre, con l’algoritmo
classico (scuola elementare), richiede O(n2).
Possiamo fare di meglio?
4
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Rappresentazione decimale di interi
a n cifre
• Dividiamo X e Y a metà:
– X1 (Y1) = n/2 cifre più significative di X (Y)
– X0 (Y0) = n/2 cifre meno significative di X (Y)
5
Algoritmi e strutture dati
da Demetrescu et al. McGraw Hill 2004
Luigi Laura
Divisione del problema
6
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Osservazioni
• Moltiplicare un numero per 10k = shift a sinistra delle
cifre del numero di k posizioni
• Somma di due numeri di k cifre: tempo O(k)
• La moltiplicazione di due numeri a n cifre si riduce
quindi a:
– quattro moltiplicazioni di numeri a n/2 cifre
– un numero costante di operazioni implementabili in
tempo O(k)
da Demetrescu et al. McGraw Hill 2004
7
Algoritmi e strutture dati
Luigi Laura
Equazione di ricorrenza
La soluzione è Θ(n2) dal Teorema Master
Cosa abbiamo guadagnato?
8
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Ridurre il numero di moltiplicazioni
da Demetrescu et al. McGraw Hill 2004
9
Algoritmi e strutture dati
Luigi Laura
Analisi
Eseguiamo tre moltiplicazioni e un numero
costante di somme e shift
La soluzione è Θ(n log23) = Θ(n1.59) dal Teorema
Master
10
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Programmazione Dinamica
da Demetrescu et al. McGraw Hill 2004
11
Algoritmi e strutture dati
Luigi Laura
Programmazione Dinamica
Per evitare di risolvere più volte lo stesso
sottoproblema, memorizziamo la soluzione dei
vari sottoproblemi:
algoritmo fibonacci3(intero n) → intero
sia Fib un array di n interi
Fib[1] ← Fib[2] ← 1
for i = 3 to n do
Fib[i] ← Fib[i-1] + Fib[i-2]
return Fib[n]
12
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Programmazione dinamica
Tecnica bottom-up:
1. Identifica sottoproblemi del problema originario,
procedendo logicamente dai problemi più piccoli
verso quelli più grandi
2. Utilizza una tabella per memorizzare soluzioni dei
sottoproblemi incontrati: quando incontri lo stesso
sottoproblema, leggi la soluzione nella tabella
3. Si usa quando i sottoproblemi non sono indipendenti,
(lo stesso sottoproblema può apparire più volte)
Esempio: numeri di Fibonacci
13
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Distanza tra stringhe
Siano X e Y due stringhe di lunghezza m ed n:
Vogliamo calcolare la “distanza” tra X e Y, ovvero il
minimo numero di operazioni elementari che consentono
di trasformare X in Y
14
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Trasformare RISOTTO in PRESTO:
da Demetrescu et al. McGraw Hill 2004
15
Algoritmi e strutture dati
Luigi Laura
Approccio
•
Indichiamo con δ(X,Y) la distanza tra X e Y
•
Indichiamo con Xi il prefisso di X fino all’i-esimo
carattere, per 0 ≤ i ≤ m (X0 è la stringa vuota):
•
Risolveremo il problema di calcolare δ(X,Y)
calcolando δ(Xi,Yj) per ogni i, j tali che 0 ≤ i ≤ m e
0≤j≤n
Manterremo le informazioni in una tabella D di
dimensione m × n
•
16
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Inizializzazione della tabella
Alcuni sottoproblemi sono banali:
δ(X0,Yj) = j partendo dalla stringa vuota X0,
basta inserire uno ad uno i primi j caratteri di Yj
δ(Xi,Y0) = i partendo da Xi, basta rimuovere
uno ad uno gli i caratteri di Xi per ottenere Y0
Queste soluzioni sono memorizzate
rispettivamente nella prima riga e nella prima
colonna della tabella D
da Demetrescu et al. McGraw Hill 2004
17
Algoritmi e strutture dati
Luigi Laura
Avanzamento nella tabella (1/3)
• Se xi = yj, il minimo costo per trasformare Xi in
Yj è uguale al minimo costo per trasformare Xi-1
in Yi-1
D [ i , j ] = D [ i-1 , j-1 ]
• Se xi ≠ yj, distinguiamo in base all’ultima
operazione usata per trasformare Xi in Yj in una
sequenza ottima di operazioni
18
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Avanzamento nella tabella (2/3)
il minimo costo per trasformare Xi in Yj
è uguale al minimo costo per trasformare
Xi in Yj-1 più 1 per inserire il carattere yj
D [ i , j ] = 1 + D [ i , j-1 ]
il minimo costo per trasformare Xi in Yj è
uguale al minimo costo per trasformare
Xi-1 in Yj più 1 per la cancellazione del
carattere xi
D [ i , j ] = 1 + D [ i-1 , j ]
da Demetrescu et al. McGraw Hill 2004
19
Algoritmi e strutture dati
Luigi Laura
Avanzamento nella tabella (3/3)
il minimo costo per trasformare
Xi in Yj è uguale al minimo costo
per trasformare Xi-1 in Yj-1 più 1
per sostituire il carattere xi per yj
D [ i , j ] = 1 + D [ i-1 , j-1 ]
In conclusione:
20
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Pseudocodice
Tempo di esecuzione ed occupazione di
memoria: O(m n)
21
Algoritmi e strutture dati
da Demetrescu et al. McGraw Hill 2004
Luigi Laura
Esempio
La tabella D costruita
dall’algoritmo.
In grassetto sono
indicate due sequenze
di operazioni che
permettono di ottenere
la distanza tra le
stringhe
22
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Tecnica golosa (o greedy)
da Demetrescu et al. McGraw Hill 2004
23
Algoritmi e strutture dati
Luigi Laura
Problemi di ottimizzazione (1/2)
Usata in problemi di ottimizzazione (e.g., trovare cammino
più corto per andare da Napoli a Torino)
Ad ogni passo, algoritmo effettua la scelta “localmente” più
promettente
1. Insieme di candidati (e.g., città)
2. Insieme dei candidati già esaminati
3. Funzione ammissibile(): verifica se un insieme di
candidati rappresenta una soluzione, anche non ottima
(un insieme di città è un cammino da Napoli a Torino?)
24
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Problemi di ottimizzazione (2/2)
4. Funzione ottimo(): verifica se un insieme di
candidati rappresenta una soluzione ottima (un
insieme di città è il più breve cammino da Napoli a
Torino?)
5. Funzione seleziona(): indica quale dei candidati
non ancora esaminati è al momento il più promettente
6. Funzione obiettivo da minimizzare o massimizzare
(e.g., lunghezza del cammino da Napoli a Torino)
25
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Tecnica golosa
Perché goloso?
Sceglie sempre il candidato più promettente!
26
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Un problema di sequenziamento
Un server (e.g., una CPU, o un impiegato dell’ufficio postale) deve
“servire” n clienti
Il servizio richiesto dall’i-esimo cliente richiede ti secondi
Chiamiamo T(i) il tempo di attesa del cliente i
Vogliamo minimizzare il tempo di attesa medio, i.e.:
e quindi
27
Algoritmi e strutture dati
da Demetrescu et al. McGraw Hill 2004
Luigi Laura
Esempio
Sei possibili ordinamenti:
Qual è il migliore?
28
da Demetrescu et al. McGraw Hill 2004
Algoritmi e strutture dati
Luigi Laura
Un algoritmo goloso
•
Il seguente algoritmo genera l’ordine di servizio in
maniera incrementale secondo una strategia greedy.
•
Supponiamo di aver deciso di sequenziare i clienti i1,
i2, … im. Se decidiamo di servire il cliente j, il tempo
totale di servizio diventa:
•
•
Quindi al generico passo l’algoritmo serve la richiesta
più corta tra quelle rimanenti
Tempo di esecuzione: O(n log n), per ordinare le
richieste
29
Algoritmi e strutture dati
da Demetrescu et al. McGraw Hill 2004
Luigi Laura
Riepilogo
Tecniche algoritmiche:
– Divide et impera: altre applicazioni nella ricerca
binaria, mergesort, quicksort, moltiplicazione di
matrici
– Programmazione dinamica: altre applicazioni nel
calcolo dei numeri di Fibonacci, associatività del
prodotto tra matrici, cammini minimi tra tutte le
coppie di nodi (algoritmo di Floyd e Warshall)
– Tecnica greedy: altre applicazioni nel distributore
automatico di resto, nel calcolo del minimo albero
ricoprente (algoritmi di Prim, Kruskal, Boruvka) e
dei cammini minimi (algoritmo di Dijkstra)
30
da Demetrescu et al. McGraw Hill 2004