Analisi ammortizzata Lezione n 3 Prof ssa Rossella

  • Slides: 15
Download presentation
Analisi ammortizzata Lezione n° 3 Prof. ssa Rossella Petreschi Lezione del 8 /10 /2013

Analisi ammortizzata Lezione n° 3 Prof. ssa Rossella Petreschi Lezione del 8 /10 /2013 del Corso di Algoritmica

Incremento di un contatore (metodo del potenziale) ti + 1 : costo effettivo della

Incremento di un contatore (metodo del potenziale) ti + 1 : costo effettivo della i-esima operazione, ovvero ti bit posti a 0 e al più 1 bit posto ad 1 1 - ti : differenza di potenziale dopo la i-esima operazione, ovvero differenza fra il numero di bit uguali ad 1 (bi) prima e dopo la i-esima operazione (Di) - (Di-1) = (bi-1 - ti + 1) - bi-1 = 1 - ti i = ci + (Di) - (Di-1) = (ti + 1)+ (1 - ti ) = 2 Analisi ammortizzata: Una sequenza di n operazioni INCREMENTO su di un contatore inizialmente posto a 0 può costare al più O(n)

Tabelle dinamiche Tabelle (pile, heaps, tabelle hash, …) su cui è possibile effettuare operazioni

Tabelle dinamiche Tabelle (pile, heaps, tabelle hash, …) su cui è possibile effettuare operazioni d’inserimento (di cancellazione) di un elemento in (da) una singola posizione. fattore di carico (T): num (T)/ size (T) num (T): numero di elementi caricati in T size (T): numero totale di posizioni di T Una tabella è piena quando (T) = 1 (Tabella vuota: size(T)= 0, (T) = 1)

Inserimento in tabella ( caso peggiore) Costo ci della i-esima operazine di inserimento ci

Inserimento in tabella ( caso peggiore) Costo ci della i-esima operazine di inserimento ci = 1 se lo spazio è sufficiente ci = (i-1) + 1 se lo spazio non è sufficiente, dove (i-1) è il costo per copiare tutti i vecchi elementi nella nuova tabella (ESPANSIONE) Nota: si richiede che la quantità di spazio non utilizzata non superi mai la metà dello spazio totale riservato alla tabella Analisi del caso peggiore: Una sequenza di n operazioni di inserimento su una tabella inizialmente vuota richiede tempo O(n 2)perché O(n)è il tempo nel caso pessimo della singola operazione di inserimento

Inserimento in tabella (metodo degli aggregati) c(i) = i se i-1 è una potenza

Inserimento in tabella (metodo degli aggregati) c(i) = i se i-1 è una potenza di 2, 1 altrimenti la tabella, quando espande, raddoppia (vedi nota della pagina precedente) Analisi ammortizzata: • Una sequenza di n operazioni di inserimento su di una tabella inizialmente vuota richiede costo totale 3 n. ∑c(i) = n+ ∑ 2 j ≤ n+((2 logn +1 -1)/(2 -1)) < n + 2 logn 2 = n+2 n = 3 n, per i = 1, …, n e j = 0, …, logn (serie geometrica ∑ xk = x(n+1)-1/x-1, k=0, …, n) • Il tempo ammortizzato di ogni singola operazione, è 3 n/n = 3

Inserimento in tabella (metodo degli accantonamenti) Inserimento di un elemento ca = 3 dove

Inserimento in tabella (metodo degli accantonamenti) Inserimento di un elemento ca = 3 dove 1 per il proprio inserimento nella tabella corrente; 1 per l’eventuale spostamento dovuto ad una futura espansione; 1 per uno degli elementi nella vecchia metà della tabella. Analisi ammortizzata: Una sequenza di n operazioni di inserimento su di una tabella inizialmente vuota costa 3 n.

Inserimento in tabella (metodo del potenziale) Definiamo: (T) = 2 num(T) - size(T), con

Inserimento in tabella (metodo del potenziale) Definiamo: (T) = 2 num(T) - size(T), con num(T) >= size(T)/2 e (T) > = 0 Subito dopo una espansione: (T) = 2 size(T)/2 - size(T) = 0 Immediatamente prima di una espansione: (T) = 2 num(T) - num(T)= num(T) Se lo i-esimo inserimento non attiva una espansione: i = ci + (Ti) - (Ti-1) = 1+(2 num(Ti) - size(Ti)) - (2 num(Ti-1) - size(Ti-1)) = 1 + (2 num(Ti) - size(Ti)) - (2(num(Ti)-1)) - size(Ti)) = 3 Se lo i-esimo inserimento attiva una espansione: i = ci + (Ti) - (Ti-1) = num(Ti) +(2 num(Ti) - size(Ti)) - (2 num(Ti-1) - size(Ti-1)) = num(Ti) + (2 num(Ti) – 2(num(Ti) -1)) - (2(num(Ti)-1) - (num(Ti)-1)) = num(Ti) + 2 - (num(Ti) -1) = 3 Analisi ammortizzata: Una sequenza di n operazioni di inserzione su di un tabella inizialmente vota può costare al più O(n)

Contrazione di una tabella L’operazione di contrazione (quando il fattore di carico è troppo

Contrazione di una tabella L’operazione di contrazione (quando il fattore di carico è troppo piccolo) consiste nel: • creare una nuova tabella con un numero di posizioni minore di quella vecchia; • copiare tutti gli elementi della vecchia tabella nuova. Idealmente si vorrebbe che: • il fattore di carico sia sempre limitato inferiormente da una costante; • il costo ammortizzato di una operazione rimanga limitato superiormente da una costante.

Dimezzare e Duplicare Euristica: • duplicare (dimezzare) il numero di posizioni nella nuova tabella;

Dimezzare e Duplicare Euristica: • duplicare (dimezzare) il numero di posizioni nella nuova tabella; • (T) ≥ 1/2, quindi non si spreca mai più della metà dello spazio nella tabella Nel dimezzare : • il fattore di carico è quindi sempre limitato inferiormente da una costante; • ma il costo ammortizzato di una operazione non sempre rimane limitato superiormente da una costante.

Esempio Dopo una sequenza di 2 k-1 +1 operazioni di inserzione su una tabella

Esempio Dopo una sequenza di 2 k-1 +1 operazioni di inserzione su una tabella T, si prosegua con una sequenza di operazioni del tipo DDIID… Al termine dei primi 2 k-1 inserimenti num(T) = size(T)= n/2, quindi il 2 k-1+1 -esimo inserimento crea una espansione verso una tabella di dimensione n. Dopo di che, secondo l’euristica, ogni coppia di operazioni di eliminazione porterà ad una contrazione verso una tabella di dimensione n/2, mentre ogni coppia di operazioni di inserimento porterà ad una nuova espansione verso una tabella di dimensione n. Poiché il costo di ogni operazione di contrazione/espansione è pari a (n) ed n sono le operazioni, il costo totale sarà (n 2)e il costo ammortizzato di ogni singola operazione rimarrà (n).

Euristica modificata Espansione (se la tabella è piena, ovvero (T) = 1 ): Si

Euristica modificata Espansione (se la tabella è piena, ovvero (T) = 1 ): Si duplica il numero di posizioni nella nuova tabella, conseguentemente (T) ≥ 1/2. Contrazione (se la tabella è troppo vuota, ovvero (T) = 1/4): Si dimezza il numero di posizioni nella nuova tabella, conseguentemente (T) ≥ 1/2.

La funzione potenziale (T) = 2 num(T) - size(T) se (T) ≥ 1/2 (T)

La funzione potenziale (T) = 2 num(T) - size(T) se (T) ≥ 1/2 (T) = size(T)/2 - num(T) se (T) < 1/2 Vale: il costo ammortizzato totale di una sequenza di operazioni rispetto alla funzione potenziale è un limite superiore del costo effettivo delle operazioni in quanto (T) ≥ 0 sempre, dove (T) = 0 se la tabella è vuota Definiamo: (T) = 0 se (T) = 1/2 (T) = num(T) se (T) = 1 ( (T) può supportare l’espansione) (T) = num(T) se (T) = 1/4 ( (T) può supportare la contrazione)

Inserimento (metodo del potenziale) • (Ti-1) ≥ 1/2 i = 3 • (Ti-1) <

Inserimento (metodo del potenziale) • (Ti-1) ≥ 1/2 i = 3 • (Ti-1) < 1/2 e (Ti) < 1/2 i = ci + (Ti) - (Ti-1) = 1 + (size(Ti)/2 - num(Ti)) - (size(Ti-1)/2 - num(Ti-1)) = = 1 + (size(Ti)/2 - num(Ti)) - (size(Ti)/2 - (num(Ti)-1)) = 0 • (Ti-1) < 1/2 e (Ti) = 1/2 i = ci + (Ti) - (Ti-1) = 1 + (2 num(Ti) - size(Ti)) - (size(Ti-1)/2 - num(Ti-1)) = 1 + (2(num(Ti-1)+1) - size(Ti-1)) - (size(Ti-1)/2 - num(Ti-1)) = = 3 num(Ti-1) - 3/2 size(Ti-1)+3 = 3 (Ti-1) size(Ti-1) - 3/2 size(Ti-1) + 3 < < 3/2 size(Ti-1) - 3/2 size(Ti-1) + 3 = 3

Cancellazione (metodo del potenziale) • (Ti-1) < 1/2 e 1/4 < (Ti) < 1/2

Cancellazione (metodo del potenziale) • (Ti-1) < 1/2 e 1/4 < (Ti) < 1/2 i = ci + (Ti) - (Ti-1) = 1 + (size(Ti)/2 - num(Ti)) - (size(Ti-1)/2 - num(Ti-1)) = 1 + (size(Ti)/2 - num(Ti)) - (size(Ti)/2 - (num(Ti)+1)) = 2 • (Ti-1) < 1/2, e la i-esima operazione attiva una contrazione quindi (Ti) = 1/2 i = ci + (Ti) - (Ti-1) = (num(Ti)+1) + (2 num(Ti) - size(Ti)) - (size(Ti-1)/2 - num(Ti-1))= (num(Ti)+1) + (2 num(Ti) - 2 num(Ti)) – (2 num(Ti) - (num(Ti) +1) = 2 • (Ti-1) > 1/2 e (Ti) > 1/2 i = ci + (Ti) - (Ti-1) = 1+ (2 num(Ti) - size(Ti)- (2 num(Ti-1) - size(Ti-1)) = 1+ ((2 (num(Ti-1)-1) - size(Ti-1))- (2 num(Ti-1) - size(Ti-1))= -1 ≤ 0 • (Ti-1) = 1/2 e (Ti) < 1/2 i = ci + (Ti) - (Ti-1) = 1+ (size(Ti)/2 - num(Ti)) - (2 num(Ti-1) - size(Ti-1)) = 1+ (size(Ti)/2 -1)- (2 num(Ti-1) - 2 num(Ti-1)) = 2

Per concludere Abbiamo mostrato come tutte le operazioni di inserimento e di cancellazione su

Per concludere Abbiamo mostrato come tutte le operazioni di inserimento e di cancellazione su una tabella abbiano costo ammortizzato limitato superiormente da una costante. Quindi una qualunque sequenza di n operazioni su una tabella dinamica richiede tempo ammortizzato O(n)