1 Analisi ammortizzata Si considera il tempo richiesto per eseguire, nel caso pessimo, una intera sequenza di operazioni. Se le operazioni costose sono.

Slides:



Advertisements
Presentazioni simili
Cosa sono? Come si risolvono?
Advertisements

Strutture dati per insiemi disgiunti
Iterazione A. Ferrari.
Strutture dati lineari
PROGRAMMARE IN PASCAL (le basi)
Algoritmi e Programmazione
Informatica Generale Marzia Buscemi
esponente del radicando
Hash Tables Indirizzamento diretto Tabelle Hash Risoluzioni di collisioni Indirizzamento aperto.
Strutture dati elementari
Alberi binari di ricerca
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Iterazione enumerativa (for)
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Algoritmi Paralleli e Distribuiti a.a. 2008/09
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente) ITERAZIONE: ripetere piu volte una sequenza di operazioni istruzioni: for, while, do.
DAL PROBLEMA ALL'ALGORITMO Problemi e Programmi Paolo Amico
Il Linguaggio Macchina
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
memoria gestita staticamente:
Programmazione in Java Claudia Raibulet
Tavole dinamiche Spesso non si sa a priori quanta memoria serve per memorizzare dei dati in un array, in una tavola hash, in un heap, ecc. Può capitare.
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
Metodo della moltiplicazione
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
CODIFICA Da flow-chart a C++.
Strutture dati per insiemi disgiunti
Radix-Sort(A,d) // A[i] = cd...c2c1
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua.
RB-insert(T, z) // z.left = z.right = T.nil Insert(T, z) z.color = RED // z è rosso. Lunica violazione // possibile delle proprietà degli alberi // rosso-neri.
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni.
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Valutare la difficoltà dei problemi
Complessità del problema Se non facciamo ipotesi sul tipo degli elementi della sequenza le uniche operazioni permesse sono confronti e assegnazioni. Problema.
Implementazione di dizionari Problema del dizionario dinamico Scegliere una struttura dati in cui memorizzare dei record con un campo key e alcuni altri.
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
Introduzione a Javascript
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.

Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Allievi Elettrici - AA Le funzioni ricorsive in C
Risoluzione delle collisioni con indirizzamento aperto Con la tecnica di indirizzamento aperto tutti gli elementi stanno nella tavola. La funzione hash.
Algoritmi e Strutture Dati Strutture Dati Elementari.
Algoritmi e Strutture Dati
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
Rappresentazione dell’informazione
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
Rappresentazioni a lunghezza fissa: problemi
Master Bioinformatica 2002: Visite di Grafi La struttura dati D è una PILA (STACK) Visita in profondità o Depth-First-Search (DFS)
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Rappresentazione dell'informazione
Rappresentazione dell'informazione 1 Se ho una rappresentazione in virgola fissa (es. su segno e 8 cifre con 3 cifre alla destra della virgola) rappresento.
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Esercizi.
Conversione binario-ottale/esadecimale
Informatica 3 V anno.
6. LIMITI Definizione - Funzioni continue - Calcolo dei limiti
I sistemi di numerazione
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Numeri con segno ed in virgola Marco D. Santambrogio – Ver. aggiornata al 20 Marzo.
La numerazione ottale. Il sistema di numerazione ottale ha ampio utilizzo in informatica E’ un sistema di numerazione posizionale La base è 8 Il sistema.
Criteri di divisibilità
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi Simulazione di lettura e scrittura concorrente Tecnica dell’accelerated cascading Lezione.
Prof.ssa Rossella Petreschi Lezione del 3 /10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 18 del testo Cormen, Leiserson, Rivest.
Transcript della presentazione:

1 Analisi ammortizzata Si considera il tempo richiesto per eseguire, nel caso pessimo, una intera sequenza di operazioni. Se le operazioni costose sono relativamente meno frequenti allora il costo richiesto per eseguirle può essere ammortizzato con l’esecuzione delle operazioni meno costose. Analisi ammortizzata

2 Metodo dell’aggregazione Si calcola la complessità O(f(n)) dell’esecuzione di una sequenza di n operazioni nel caso pessimo. Il costo ammortizzato della singola operazione si ottiene quindi dividendo per n tale complessità ottenendo O(f(n)/n). In questo modo viene attribuito lo stesso costo ammortizzato a tutte le operazioni. Illustriamo il metodo con due esempi. Metodo di aggregazione

3 operazioni su di una pila Sia P una pila di interi con le solite operazioni: Push(P, x) aggiunge x alla pila P Pop(P) toglie il primo elemento dalla pila Top(P) restituisce il primo elemento di P (senza toglierlo) Empty(P) ritorna true se la pila è vuota ed una ulteriore operazione: MultiPop(P, k) while not Empty(P) and k > 0 do Pop(P), k  k-1 che toglie dalla pila i primi k elementi, oppure vuota la pila se essa contiene meno di k elementi. Operazione su una pila

4 Se la pila contiene m elementi il ciclo while è iterato min(m,k) volte e quindi MultiPop ha complessità O(min(m,k)). Consideriamo una sequenza di n operazioni eseguite a partire dalla pila vuota. L’operazione più costosa MultiPop richiede tempo O(n) nel caso pessimo. Moltiplicando per n otteniamo il limite superiore O(n 2 ) per il costo della sequenza di n operazioni.

5 Di conseguenza il numero totale di operazioni Pop, comprese quelle eseguite nelle operazioni MultiPop, non può superare il numero totale di operazioni Push ed è quindi minore di n. Il metodo dell’aggregazione fornisce un limite più stretto. Un elemento può essere tolto dalla pila soltanto dopo che è stato inserito!

6 Se dal tempo richiesto per eseguire MultiPop togliamo il tempo per eseguire le iterazioni del ciclo while rimane un tempo costante. Quindi il tempo richiesto per eseguire l’intera sequenza di n operazioni è O(n) più il tempo richiesto per eseguire tutte le iterazioni del ciclo while delle operazioni MultiPop presenti nella sequenza.

7 Siccome una singola iterazione richiede tempo costante e il numero totale di iterazioni è minore di n anche l’esecuzione di tutte le iterazioni del ciclo while richiede tempo totale O(n). Il costo dell’intera sequenza di operazioni è quindi O(n) e pertanto il costo ammortizzato di ciascuna operazione è O(n)/n = O(1).

8 incremento di un contatore binario Implementiamo un contatore binario di k bit con un array di bit A[0..k-1] Un numero binario x registrato in A ha il bit meno significativo in A[0] e il più significativo in A[k-1] per cui Incremento contatore binario

9 Increment(A) i  0 while i < k and A[i] = 1 do A[i]  0, i  i +1 if i < k then A[i]  1 Supponiamo che A venga usato per contare a partire da x = 0 usando l’operazione di incremento:

10 Una singola operazione di incremento richiede tempo O(k) nel caso pessimo il che fornisce un limite superiore O(nk) per una sequenza di n incrementi. Possiamo però osservare che il tempo necessario ad eseguire l’intera sequenza è proporzionale al numero di bit che vengono modificati. Quanti bit vengono modificati? Vediamo cosa succede con un contatore di k = 8 bit.

x A[7] A[6] A[5] A[4] A[3] A[2] A[1] A[0] costo

12 Si vede che A[0] viene modificato ad ogni incremento del contatore, A[1] viene modificato ogni due incrementi, A[2] ogni 4 incrementi ed in generale A[i] viene modificato ogni 2 i incrementi.

13 Dunque il numero totale di bit modificati è La complessità di n operazioni di incremento a partire da x = 0 è quindi O(n) e di conseguenza la complessità ammortizzata di una operazione di incremento è O(n)/n = O(1).

14 Esercizio 11. Mostrare che se al contatore binario di k bit aggiungiamo anche una operazione Decrement che decrementa di una unità il valore del contatore allora una sequenza di n operazioni può costare  (nk). Esercizio 11

15 Esercizio 12. Su di una certa struttura dati viene eseguita una sequenza di n operazioni. L’operazione i-esima costa i quando i è una potenza di 2 mentre ha costo 1 negli altri casi. Mostrare che tali operazioni hanno costo ammortizzato costante. Esercizio 12

16 Metodo degli accantonamenti Si caricano le operazioni meno costose di un costo aggiuntivo che viene assegnato come credito prepagato a certi oggetti nella struttura dati. Illustriamo questo metodo con i soliti due esempi. Metodo degli accantonamenti I crediti accumulati saranno usati per pagare le operazioni più costose su tali oggetti. Il costo ammortizzato delle operazioni più costose è il costo effettivo diminuito del credito prepagato. Il costo ammortizzato delle operazioni meno costose è il costo effettivo aumentato del costo aggiuntivo.

17 operazioni su di una pila Ricordiamo che i costi effettivi delle operazioni sulla pila sono: Push 1 Pop 1 Top 1 Empty 1 MultiPop min(k,m) A tali operazioni attribuiamo i seguenti costi ammortizzati: Push 2 Pop 0 Top 1 Empty 1 MultiPop 0

18 Quando effettuiamo una Push usiamo una unità di costo per pagare il costo effettivo dell’operazione mentre l’altra unità di costo la attribuiamo come credito prepagato all’oggetto inserito nella pila. Quando eseguiamo una Pop paghiamo il costo dell’operazione utilizzando il credito attribuito all’oggetto che viene tolto dalla pila.

19 Quando eseguiamo una MultiPop le min(k,m) iterazioni del ciclo while vengono pagate utilizzando i min(k,m) crediti prepagati attribuiti uno a ciascun oggetto che viene tolto dalla pila. Ogni operazione ha costo (ammortizzato) costante!

20 incremento di un contatore binario Il costo effettivo di una operazione Increment è pari al numero di bit modificati. Tra questi vi è un certo numero t  0 di bit 1 trasformati in 0 e al più un solo bit 0 trasformato in 1. Increment(A) i  0 while i < k and A[i] = 1 do A[i]  0, i  i +1 if i < k then A[i]  1

21 Costi ammortizzati Quando eseguiamo 0  1: una delle due unità di costo è effettiva e l’altra è attribuita come credito prepagato al bit 1. Quindi ogni bit 1 nel contatore ha un credito prepagato, che si può usare per pagare interamente le operazioni 0  1. trasformazione 0  1 2 trasformazione 1  0 0

22 Quindi ogni Increment ha costo ammortizzato 2, e una sequenza di n operazioni costerà O(n).

23 Esercizio 13. Realizzare un contatore binario che prevede, oltre all’operazione Increment, anche una operazione Reset che azzera il contatore. Fare in modo che la complessità ammortizzata delle operazioni risulti costante. (Suggerimento: memorizzare la posizione del bit 1 più significativo.) Esercizio 13

24 Esercizio 14. Realizzare una pila P con operazioni di costo ammortizzato costante avendo a disposizione memoria per al più m elementi. Se la memoria è piena quando si esegue una Push, prima di eseguire l’operazione viene scaricata su disco una parte degli m elementi. Se una operazione Pop toglie l’ultimo elemento in memoria e ci sono degli altri elementi registrati su disco, dopo l’operazione se ne ricarica una parte in memoria. Esercizio 14

25 Metodo del potenziale Si associa alla struttura dati D un potenziale  (D) tale che le operazioni meno costose incrementino il potenziale mentre quelle più costose portino ad una diminuzione del potenziale della struttura. Il costo ammortizzato è quindi dato dalla somma algebrica del costo effettivo e della variazione di potenziale. Metodo del potenziale

26 In altre parole, se indichiamo con D i la struttura dati dopo l’esecuzione della i-esima operazione e con c i il costo effettivo della i-esima operazione allora il costo ammortizzato è: Il costo ammortizzato di una sequenza di n operazioni è:

27 Se la variazione di potenziale corrispondente all’esecuzione di tutta la sequenza non è negativa allora il costo ammortizzato è una maggiorazione del costo reale. Illustriamo anche questo metodo con i soliti esempi. In caso contrario la variazione di potenziale negativa relativa all’esecuzione di tutta la sequenza deve essere compensata da un aumento adeguato del costo ammortizzato delle operazioni.

28 operazioni su di una pila Come funzione potenziale  (P) prendiamo il numero m di elementi contenuti nella pila P per cui: Operazione costo differenza di costo effettivo potenziale ammortizzato Push Pop Top Empty Multi_Pop min(k,m) -min(k,m) 0

29 Osserviamo inoltre che all’inizio quando la pila è vuota  (P 0 ) = 0 mentre alla fine  (P n )  0 per cui la differenza di potenziale corrispondente all’esecuzione di tutta la sequenza di operazioni è non negativa.

30 incremento di un contatore binario Scegliamo come funzione potenziale  (A) il numero bit 1 presenti nel contatore. Ricordiamo che il costo effettivo di una operazione Increment è pari al numero di bit modificati e che tra questi vi è un certo numero t  0 di 1 trasformati in 0 e al più un solo 0 trasformato in 1 per cui: Operazione costo differenza di costo effettivo potenziale ammortizzato Increment 1+t -t+1 2

31 Osserviamo che l’esecuzione dell’intera sequenza di operazioni comporta una differenza di potenziale non negativa. Infatti all’inizio, quando il contatore vale 0, tutti i bit sono 0 e quindi è  (A 0 ) = 0 mentre alla fine  (A n )  0. Con il metodo del potenziale possiamo calcolare il costo ammortizzato dell’incremento di un contatore binario di k bit anche quando non si parte da 0 ma da un valore qualsiasi.

32 In questo caso la differenza di potenziale relativa ad una sequenza di n incrementi può risultare negativa ma pur sempre in modulo minore o uguale di k. Un incremento del costo ammortizzato di k/n unità di costo è quindi sufficiente a compensare la differenza di potenziale negativa. Il costo ammortizzato di Increment è quindi O(1+k/n) che nel caso in cui k = O(n) si riduce ad O(1).

33 Esercizio 15. Realizzare una coda Q di tipo FIFO utilizzando due normali pile P 1 e P 2 e le relative operazioni Push e Pop. Le operazioni PushQ e PopQ di inserimento ed estrazione dalla coda devono richiedere tempo ammortizzato costante. Esercizio 15