Prof.ssa Rossella Petreschi Lezione del 3 /10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 18 del testo Cormen, Leiserson, Rivest “Introduzione agli algoritmi” Edizioni: Jackson Libri Analisi ammortizzata Lezione n°2
Definizione Si definisce complessità ammortizzata su una sequenza di k operazioni, data una struttura dati di dimensione n, la media dei tempi delle operazioni della sequenza. Il tempo così calcolato tiene conto che: in generale i dati non possono sempre presentarsi nelle condizioni più sfavorevoli per k volte consecutive e quindi il costo richiesto per eseguire le operazioni più costose può essere ammortizzato dall’esecuzione delle operazioni meno costose; si deve studiare l’effetto sulla sequenza peggiore di tutte, quindi è un’analisi di caso pessimo sulla catena e non sulla singola operazione; quest’analisi non ha alcuna connotazione probabilistica e quindi differisce dall’analisi del caso medio
3 metodi Consideriamo tre diversi metodi per il calcolo dell’analisi ammortizzata a seconda che il costo ammortizzato di una singola operazione sia calcolato al termine della sequenza di k operazioni e sia uguale per ogni singola operazione (Metodo degli aggregati) sia precalcolato tramite “crediti prepagati” ai singoli oggetti della struttura dati (Metodo degli accantonamenti) o alla struttura dati nel suo complesso (Metodo del potenziale)
Operazioni su pile ( caso peggiore) PUSH(P,x): inserisce l’oggetto x in testa alla pila O(1) POP(P): toglie l’oggetto in testa alla pila O(1) MULTIPOP(P,t): toglie t oggetti dalla testa della pila O(min(t,p)) Analisi del caso peggiore: Una sequenza di k operazioni PUSH,POP e MULTIPOP su una pila di dimensione n costa O(kmin(t,p)) ovvero O(n 2 ).
Operazioni su pile (metodo degli aggregati) PUSH(P,x): inserisce l’oggetto x in testa alla pila O(1) POP(P): toglie l’oggetto in testa alla pila O(1) MULTIPOP(P,t): toglie t oggetti dalla testa della pila O(min(t,p) Analisi ammortizzata: Una sequenza di operazioni PUSH,POP e MULTIPOP su una pila di dimensione n può costare al più O(n). Il tempo ammortizzato di ogni singola operazione, è O(n)/n = O(1)
Operazioni su pile (metodo degli accantonamenti) PUSH(P,x): inserisce l’oggetto x in testa alla pila ca = 2 (contro O(1)) POP(P): toglie l’oggetto in testa alla pila ca = 0 (contro O(1)) MULTIPOP(P,t): toglie t oggetti dalla testa della pila ca = 0 (contro O(min(t,p))) Analisi ammortizzata: Una sequenza di operazioni PUSH,POP e MULTIPOP su una pila di dimensione n può costare al più O(n).
Metodo del potenziale D 0 :struttura dati iniziale su cui verrà eseguita la sequenza di operazioni D i :struttura dati che si ottiene come risultato della operazione i-esima sulla struttura dati D i-1 :funzione potenziale che associa un numero reale (D i ) a D i Analisi ammortizzata: costo ammortizzato della i-esima operazione i = c i + (D i ) - (D i -1) costo ammortizzato di n operazioni i = (c i + (D i ) - (D i-1 )) = c i + (D n ) - (D 0 )), per i = 1,…n (serie telescopica)
Operazioni su pile (metodo del potenziale) PUSH(P,x): ( D i ) - ( D i-1 ) = (p + 1) - p = 1; i = c i + ( D i ) - ( D i-1 )= 1+1 = 2 POP(P): ( D i ) - ( D i-1 ) = (p - 1) - p = -1; i = c i + ( D i ) - ( D i-1 )= 1-1 = 0 MULTIPOP(P,t): i = c i + ( D i ) - ( D i-1 ) = t+((p-t)-p)=0 Analisi ammortizzata: Una sequenza di operazioni PUSH,POP e MULTIPOP su una pila di dimensione n ha un costo O(n), in quanto ∑ i = ∑ c i + ( D n ) - ( D 0 )) ≤ n + n - 0 = 2n (per i = 1,…n)
Incremento di un contatore binario ( caso peggiore) Il contatore è realizzato da un vettore di bit A dove A(0) rappresenta il bit meno significativo, pertanto: x = A(i)2 i, per i = 0,…,k …. INCREMENTO: a partire da i=0 e finchè (i<k e A(i)=1) commuta A(i) in 0 e incrementa i; se i<k poni A(i)=1 Analisi del caso peggiore: Una sequenza di n operazioni INCREMENTO su di un contatore inizialmente a 0 richiede tempo O(nk) perché O(k) è il tempo nel caso pessimo della singola operazione
Incremento di un contatore (metodo degli aggregati) A(i) viene complementato n/2 i volte per i=0,1,…, logn A(i) non viene complementato per i > logn Numero totale di operazioni di modifica di bit n/2 i ≤ n 1/2 (per i = 0,…, logn )< n 1/2 i = 2n (per i = 0,…) (serie geometrica decrescente infinita: x i = 1/1-x, per i=0,…) Analisi ammortizzata: Una sequenza di n operazioni INCREMENTO su di un contatore inizialmente posto a 0 può costare al più O(n). Il tempo ammortizzato di ogni singola operazione, è O(n)/n = O(1)
Incremento di un contatore (metodo degli accantonamenti) Porre un bit a 1 ca = 2 ca= c osto a mmortizzato Porre un bit a 0 ca = 0 Analisi ammortizzata: Una sequenza di n operazioni INCREMENTO su di un contatore inizialmente posto a 0 può costare al più O(n) poiché: INCREMENTO commuta al più un solo bit ad 1 Il totale del credito è sempre ≥ 0 perché il numero totale di 1 non è mai negativo
Incremento di un contatore (metodo del potenziale) t i + 1 : costo effettivo della i-esima operazione, ovvero t i bit posti a 0 e al più 1 bit posto ad t i : differenza di potenziale dopo la i-esima operazione, ovvero differenza fra il numero di bit uguali ad 1 (b i ) prima e dopo la i-esima operazione (D i ) - (D i-1 ) = (b i-1 - t i + 1) - b i-1 = 1 - t i i = c i + (D i ) - (D i-1 ) = (t i + 1)+ (1 - t i ) = 2 Analisi ammortizzata: Una sequenza di n operazioni INCREMENTO su di un contatore inizialmente posto a 0 può costare al più O(n)