25/11/2013
Algoritmi e strutture di dati 2
Paola Vocca
Lezione 6: Analisi Ammortizzata
Lezione 6- Analissi Ammortizzata
1
Analisi ammortizzata
Si applica a una sequenza di n operazioni
Può fornire risultati migliori dell’analisi al caso
pessimo (= n x costo di una singola operazione)
Tecniche diffuse di analisi ammortizzata:
1.
2.
3.
metodo di aggregazione
metodo dei crediti
metodo del potenziale
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
2
1
25/11/2013
Tecniche di analisi ammortizzata:
aggregazione
• Conteggio del numero totale ( )di passi elementari
eseguiti e divisione per il numero di operazioni e
effettuate.
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
3
Tecniche di analisi ammortizzata:
Problema giocattolo
•
Problema del contatore:
o Contatore binario di cifre binarie (realizzato con array contatore
di dimensione )
o Il valore è dato da ∑ (contatore[ ] × 2 )
Algorithm: Incremento contatore
function Incrementa(contatore);
← 0;
while < − 1⋀!"#$%$"&'[ ] = 1 do
!"#$%$"&'[ ] ← 0;
← + 1;
!"#$%$"&'[ ] ← 1;
return
Complessità per operazione nel caso pessimo +( )
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
4
2
25/11/2013
Aggregazione
• Effettuando n incrementi:
o ,- ./.-01[2]cambia (da 0 a 1 o viceversa) a ogni incremento
#volte;
o il valore di !"#$%$"&'[1] cambia ogni due incrementi, quindi
3
volte;
4
o …
o il valore di ,- ./.-01[5]cambia ogni 65 incrementi e quindi
5 volte.
6
Il costo ammortizzato è
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
5
Tecniche di analisi ammortizzata:
crediti
• Fondo comune, in cui si depositano o si prelevano
crediti
• Il numero di crediti depositati deve essere sempre non
negativo
• Le operazioni possono sia depositare crediti nel fondo
che prelevarne, per coprire il proprio costo
computazionale
• il costo ammortizzato per ciascuna operazione e il
numero di crediti depositati da essa
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
6
3
25/11/2013
Problema giocattolo: Crediti
1.
2.
preleviamo un credito per ogni valore di contatore[i] cambiato
da 1 a 0
depositiamo un credito quando contatore[i] cambia da 0 a 1.
Analisi
o Per ogni singolo incremento:
• punto 1 può occorrere un numero variabile di volte
• punto 2 occorre esattamente una volta, lasciando un credito per quando quel
valore da 1 tornerà a essere 0.
o ogni volta che serve un credito per cambiare un bit da 1 a 0,
possiamo utilizzare il credito depositato quando lo stesso bit è
passato da 0 a 1 (inizialmente tutti 0)
o ogni volta che necessitiamo di un credito (pt 1), possiamo prelevare
dal fondo in quanto tale credito è stato sicuramente depositato da
un precedente incremento nel punto 2.
o Questo garantisce che ci sono sempre crediti disponibili nel fondo
per eseguire le varie operazioni, da cui deriva che il costo
ammortizzato per incremento è O(1), in effetti 1.
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
7
Tecniche di analisi ammortizzata:
potenziale
• Fondo comune, in cui si depositano o si prelevano
crediti
• Il numero di crediti depositati deve essere sempre non
negativo
• Le operazioni possono sia depositare crediti nel fondo
che prelevarne, per coprire il proprio costo
computazionale
• il costo ammortizzato per ciascuna operazione e il
numero di crediti depositati da essa
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
8
4
25/11/2013
Problema giocattolo: potenziale
•
Φ uguale al numero di bit di contatore uguali a 1 dopo l'i-esimo
incremento, con 1 ≤ ≤ #: quindi, Φ = 0
Analisi
• i-esimo incremento,
o 9 : numero di volte in cui !"#$%$"&' ← 0
o il costo, in termini di numero di bit cambiati, è quindi ! = 9 + 1 (9 valori pari a 1 diventano 0 e un valore pari a 0 diventa 1).
o differenza di potenziale misura la differenza tra il numero di bit
pari a 1 prima e dopo l'incremento
o Φ −Φ
= −9 + 19 sono diventati 0 da 1 che erano e 1 che è
diventato 1 da
o Costo ammortizzato
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
9
Analisi Ammortizzata
Metodo dei crediti: Array dinamici
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
10
5
25/11/2013
Array dinamici
•
•
•
Alcuni linguaggi (C++, C#, Java) prevedono array che
possono essere ridimensionati
Ridimensionare un array a ) aggiungere o eliminare
una posizione in fondo all’array.
Approccio inefficiente richiede O(n) tempo:
1.
2.
3.
4.
•
crea un nuovo array b
copia gli elementi di a in b
dealloca a (o farlo deallocare) dalla memoria
ridenomina b come a
E’ possibile pagare tale costo ogni Ω(#)
ridimensionamenti?
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
11
Array dinamici: approccio
“spalmato”
•
Idea: abbondare nel raddoppio e dimezzamento
n elementi in un array di d posizioni [alvie]
•
Con un raddoppio, n = d+1 elementi sono copiati in un array b di
2d elementi
Occorrono almeno n-1 inserimenti prima di un ulteriore
raddoppio
•
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
12
6
25/11/2013
Array dinamici: approccio
“spalmato”
• Con un dimezzamento, n = d/4 (perché?) elementi
sono copiati in un array b di d/2 elementi
• Occorrono almeno n/2 cancellazioni prima di un
ulteriore dimezzamento
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
13
Array dinamici: approccio
“spalmato”
d
•
Riassumendo:
o n = d+1
o n = d/4
•
raddoppia
dimezza
n
Dopo un raddoppio o dimezzamento:
o occorrono almeno n-1 inserimenti per un ulteriore raddoppio
o occorrono almeno n/2 cancellazioni per un ulteriore dimezzamento
•
Costo O(n) di ridimensionamento è spalmato su almeno n/2
operazioni ) costo O(1) “ammortizzato” in più per operazione.
o Ogni inserimento depositiamo 2 crediti;
o ogni volta che raddoppiamo la dimensione dell'array, ricopiando gli elementi
memorizzati dal vecchio al nuovo array, utilizziamo i crediti accumulati
3
dall'ultima volta in cui la dimensione è raddoppiata, che sono 2 × = #
4
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
14
7
25/11/2013
Analisi Ammortizzata
Metodo di aggregazione: Unione e appartenenza di insiemi
disgiunti
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
15
Liste disgiunte
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
16
8
25/11/2013
Liste disgiunte: Soluzione banale
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
17
Liste disgiunte: Soluzione alternativa
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
18
9
25/11/2013
Liste disgiunte: Soluzione alternativa
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
19
Liste disgiunte: Soluzione alternativa
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
20
10
25/11/2013
Liste disgiunte: Soluzione alternativa
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
21
Liste disgiunte: Soluzione alternativa
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
22
11
25/11/2013
Liste disgiunte: Soluzione alternativa
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
23
Liste per insiemi disgiunti (union-find)
Universo di m elementi partizionato in insiemi
disgiunti che vengono dinamicamente uniti
Operazioni:
appartieni(x, y ) determina se gli elementi x e y
appartengono o meno allo stesso insieme
–
unisci(x, y) unisce gli insiemi che contengono
rispettivamente x e y
Osservazioni:
–
1.
2.
possiamo assumere che, inizialmente, ciascuna lista
contenga solo un elemento (quindi m liste)
abbiamo n x m-1 operazioni unisci
Lezione 8 -Liste
24
12
25/11/2013
Semplice implementazione
1.Ogni insieme b è implementato come una lista b
1.Ogni lista b è non vuota e ha i seguenti campi
associati:
b.inizio (primo elemento della lista)
b.fine (ultimo elemento della lista)
b.lunghezza (numero di elementi nella lista)
1.Ogni elemento x della lista b ha i seguenti campi
associati:
x. dato e x.succ
x.lista = b, utilizzato come identificatore di lista
Lezione 8 -Liste
25
Creazione e appartenenza: O(1) tempo
[alvie]
Lezione 8 -Liste
26
13
25/11/2013
Operazione unisci(x, y)
• Regola intuitiva
recupera le liste a e b, contenenti x e y, e uniscile
dobbiamo cambiare il campo z.lista per gli elementi
z di una delle due liste a e b:
scegli gli elementi delle lista più corta tra a e b
Singola operazione union richiede sempre O(m) al caso
pessimo ma...
Lezione 8 -Liste
27
Unione
Lezione 8 -Liste
28
14
25/11/2013
Scegliere la lista più corta ripaga!
Il costo di unisci è dominato dal ciclo while:
proporzionale a quanti elementi z cambiamo z.lista
=>O(m) al caso pessimo ma...
Costo ammortizzato di una sequenza di n operazioni
unisci:
–
–
–
–
–
quante volte un elemento z vede cambiato z.lista?
equivale a contare quante iterazioni del ciclo while
ogni volta che z.lista cambia, z confluisce in una lista di
dimensione almeno doppia
se z.lista cambia i volte, la lista di z conterrà almeno 2i elementi
2i <= m => i = O(log m) =>n unioni richiedono O(m log m)
invece che O(m n) tempo! [nota: 2i <= n+1 se partiamo da
liste con un solo elemento e il costo è O(m log n)]
Lezione 8 -Liste
29
Analisi Ammortizzata
Metodo del potenziale: Splay tree (visti ad ASD1) e nelle liste
auto-organizzazione (prossima lezione).
.
Algoritmi e strutture di dati 2
Lezione 6- Analissi Ammortizzata
30
15