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