Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ammortizzata
1/18
Analisi Ammortizzata
Nell’analisi ammortizzata si vuole definire il costo
computazionale di una sequenza di n operazioni.
Il tempo di esecuzione di una sequenza di operazioni è
definito come la media dei tempi di esecuzione delle
operazioni della sequenza.
Si considera l’efficienza nel caso pessimo di ciascuna
operazione, in cui tipicamente qualche operazione è
molto costosa.
Se le operazioni costose avvengono di rado, il costo
medio della sequenza è più basso di quando derivato
dalla somma dei casi pessimi.
2/18
Analisi ammortizzata
3/18
Esempio 1: Pila con multipop
Pila con una operazione addizionale: multipop(S,k), che
rimuove i primi k elementi in testa alla pila S.
Multipop(S,k)
while not(Stack-Empty(S)) and k0
do Pop(S)
k=k-1
Push e pop sono eseguite in O(1)
multipop richiede O(n) nel caso pessimo.
Una sequenza di n operazioni sulla pila ha quindi tempo nel
caso pessimo O(n2).
4/18
Esempio 1: Pila con multipop
5/18
Esempio 2: incremento di contatore binario
Contatore binario di k bit, array A[0 … k-1], con
A[0] LSB.
Per sommare 1 modulo 2k al valore corrente:
Increment(A)
i=0
while i<length[A] and A[i]==1
do A[i]=0
i=i+1
if i<length[A] then A[i]=1
Caso pessimo: tutti elementi a 1, tempo (k).
n operazioni increment, tempo O(nk).
6/18
Esempio 2: incremento di contatore binario
7/18
Il metodo degli aggregati
Lo si utilizza per dimostrare che, per tutti i
valori di n, una sequenza di n operazioni
richiede nel caso pessimo tempo T(n).
Quindi nel caso pessimo il costo
ammortizzato, costo medio di ogni operazione
è T(n)/n.
E’ un metodo meno preciso degli altri due,
dato che dà ad ogni operazione lo stesso
costo.
8/18
Il metodo degli aggregati: esempio pila
9/18
Il metodo degli aggregati: es.
contatore
A seguito di n operazioni di incremento (modulo
n), ogni i-esimo bit viene modificato n/2i volte.
Il numero totale di operazioni di modifica è
lg n
n / 2i n 1 / 2i 2n
i 0 i 0
11/18
Il metodo degli accantonamenti: es. pila
Costi ammortizzati:
2 per push
0 per pop e multipop.
NOTA: il costo ammortizzato di ogni operazione è O(1).
Le due unità guadagnate ad ogni push sono usate così:
• 1 unità per pagare il costo del push.
• 1 unità a credito per pagare i pop futuri.
Togliere un elemento costa 1, per poterlo togliere
bisogna prima averlo messo.
Una sequenza di n operazioni push, pop e multipop, ha
un costo ammortizzato di O(n), e questo è un upper
bound al costo effettivo.
12/18
Il metodo degli accantonamenti: es.
contatore
Costo ammortizzato di 2 per ogni operazione di bit a 1.
Quando si vuole mettere un bit a 1 si paga 1 e si
accantona 1 a credito su quel bit.
Il credito viene usato quando si vuole mettere a 0 quel
bit.
Per potersi pagare un passaggio di un bit a 0, bisogna
prima averlo messo a 1.
Ogni chiamata di increment porta a 1 un solo bit della
stringa.
Il numero di 1 nella stringa non è mai negativo (credito
sempre positivo).
Una sequenza di n increment ha costo ammortizzato
O(n).
13/18
Il metodo del potenziale
Notazione:
• Do struttura dati iniziale
• Di struttura dati dopo la iesima operazione
• ci costo effettivo della iesima operazione.
• la funzione potenziale associa alla struttura dati
Di il suo valore di potenziale (Di).
14/18
Il metodo del potenziale
Analisi ammortizzata
Il costo ammortizzato c* della iesima operazione è definito da
ci* ci ( Di ) ( Di 1 )
Quindi c* = costo effettivo + variazione di potenziale
Il costo ammortizzato totale diventa
i ci* i ci ( Dn ) ( D0 )
Richiedendo che ( Di ) ( D0 ) 0
Per ogni i, ci si assicura che il costo ammortizzato totale sia un
upper bound al costo effettivo di ogni sequenza di n
operazioni.
15/18
Il metodo del potenziale
16/18
Il metodo del poteziale: es. pila
Inizialmente la struttura dati D è una pila vuota.
Definendo (D) come il numero di elementi nella pila, si ha:
(D0) = 0 e (Di) 0 per ogni i
PUSH: se l’iesima operazione su D è un push:
(Di) - (Di-1) = (Di-1) +1 - (Di-1) = 1
Il costo ammortizzato di un push è:
ci* = ci + [(Di) - (Di-1)] = 1 + 1 = 2
MULTIPOP: se l’iesima operazione su D è un multipop(D,k) e k' = min{|D|,k}:
ci = k'
e
ci* = ci + [(Di) - (Di-1)] = k' - k' = 0
POP: se l’iesima operazione su D è un pop, si ha ci* = 0
Costi:
• Il costo ammortizzato di ogni operazione è O(1).
• Il costo ammortizzato di n operazioni è O(n).
• L’upper bound al costo totale è O(n).
17/18
Il metodo del poteziale: es. contatore
18/18