Algoritmi e Strutture Dati Code con priorità Tipo di dato CodaPriorità (1/2) 2
Tipo di dato CodaPriorità (2/2) 3 Tre implementazioni d-heap: generalizzazione degli heap binari visti per l ordinamento heap binomiali heap di Fibonacci 4
d-heap 5 Definizione Un d-heap è un albero radicato d-ario con le seguenti proprietà: 1. Struttura: è completo almeno fino al penultimo livello 2. Contenuto informativo: ogni nodo v contiene un elemento elem(v) ed una chiave chiave(v) presa da un dominio totalmente ordinato 3. Ordinamento a heap: per ogni nodo v (diverso dalla radice) chiave(v) chiave(parent(v)) 6
Esempio Heap d-ario con 18 nodi e d = 3 7 Proprietà 1. Un d-heap con n nodi ha altezza O(log d n) 2. La radice contiene l elemento con chiave minima (per via della proprietà di ordinamento a heap) 3. Può essere rappresentato implicitamente tramite vettore posizionale grazie alla proprietà di struttura 8
Procedure ausiliarie Utili per ripristinare la proprietà di ordinamento a heap su un nodo v che non la soddisfi T(n) = O(log d n) T(n) = O(d log d n) 9 findmin T(n) = O(1) 10
insert(elem e, chiave k) T(n) = O(log d n) ( muovialto ) 11 delete(elem e) e deletemin T(n) = O(d log d n) ( muovibasso ) Può essere usata anche per implementare cancellazione del minimo 12
decreasekey(elem e, chiave d) T(n) = O(log d n) ( muovialto ) 13 increasekey(elem e, chiave d) T(n) = O(d log d n) ( muovibasso ) 14
Heap binomiali 15 Alberi binomiali Albero binomiale B h (definito ricorsivamente) : 1. B 0 consiste di un unico nodo 2. Per i 0, B i+1 ottenuto fondendo due alberi binomiali B i con radice di uno figlia della radice dell altro 16
Proprietà strutturali 17 Definizione di heap binomiale Un heap binomiale è una foresta di alberi binomiali con le seguenti proprietà: 1. Struttura: ogni albero B i nella foresta è un albero binomiale 2. Unicità: per ogni i, esiste al più un B i nella foresta 3. Contenuto informativo: ogni nodo v contiene un elemento elem(v) ed una chiave chiave(v) presa da un dominio totalmente ordinato 4. Ordinamento a heap: per ogni nodo v (diverso da una delle radici) chiave(v) chiave(parent(v)) 18
Proprietà In un heap binomiale con n nodi, vi sono al più log 2 n alberi binomiali, ciascuno con grado ed altezza O(log n) 19 Procedura ausiliaria Utile per ripristinare la proprietà di unicità in un heap binomiale T(n) è proporzionale al numero di alberi binomiali in input 20
Realizzazione (1/3) 21 Realizzazione (2/3) 22
Realizzazione (3/3) Tutte le operazioni richiedono tempo T(n) = O(log n) Durante l esecuzione della procedura ristruttura esistono infatti al più tre B i, per ogni i 0 23 Analisi Ammortizzata 24
Metodologie di analisi di algoritmi Finora abbiamo visto tre tipi di analisi: Analisi nel caso peggiore Analisi nel caso medio Analisi nel caso atteso (algoritmi randomizzati) Ne vedremo un altro: Analisi ammortizzata 25 Analisi ammortizzata Strutture dati con garanzia assoluta sui loro tempi di esecuzione: analisi di caso peggiore per operazione (esempio: analisi di heap in heapsort) Analisi ammortizzata: non ci interessa tanto caratterizzare tempo richiesto nel caso peggiore da un operazione sulla struttura dati quanto caratterizzare tempo totale richiesto dalle operazioni sulla struttura dati ovvero tempo medio di un operazione, dove la media è sulla sequenza di operazioni 26
Analisi ammortizzata Supponiamo di avere una sequenza di σ operazioni su una particolare struttura dati La sequenza richiede tempo totale O(σ t) per essere eseguita Diremo che il tempo ammortizzato per ogni operazione della sequenza è O(t) Media sulla sequenza: O(σ t) / σ = O(t) Nota: una singola operazione potrebbe richiedere più di O(t) nel caso peggiore! 27 Analisi ammortizzata Sequenza di σ operazioni richiede tempo O(σ t) Tempo ammortizzato: O(σ t) / σ = O(t) OK per molte applicazioni Abbiamo bisogno di utilizzare strutture dati su sequenze di operazioni Analizzare prestazioni su sequenze di prestazioni 28
Esempio 1 Pila con le seguenti due operazioni push(x): push elemento x sulla pila multipop(k): esegui k pop sulla pila (se la pila ha almeno k elementi) Analisi nel caso peggiore: push(x): O(1) multipop(k): O( min{ k, P } ) = O(n) dove P è la dimensione della pila 29 Esempio 1 Analisi nel caso peggiore: push(x): O(1) multipop(k): O( min { k, P } ) = O(n) dove P è la dimensione della pila Quanto tempo richiederà una sequenza di σ operazioni? O(σ n)? No! 30
Analisi ammortizzata dell Esempio 1 Intuizione: Prima di togliere un elemento x con una multipop dobbiamo averlo inserito con una push(x) Ogni sequenza di σ push e multipop richiede in totale tempo O(σ ) Tempo ammortizzato per operazione: O(σ ) / σ = Ο(1) Vedremo un analisi più formale di questo 31 Metodologie di analisi ammortizzata Tre tipologie di analisi diverse: Metodo cumulativo: Sequenza di σ operazioni richiede tempo O(σ t) Tempo ammortizzato: O(σ t) / σ = O(t) Metodo del banchiere: Per eseguire un passo dobbiamo pagare 1 EUR Allocare EUR in modo da pagare per tutti i passi Metodo del potenziale: Analogia con analisi potenziale (Fisica) 32
Metodo del Banchiere per Esempio 1 Quando esegui push(x) sborsa 2 EUR: 1 EUR per pagare lavoro richiesto da push(x) 1 EUR conservato nell elemento x Quando esegui multipop(k) sborsa 0 EUR: lavoro richiesto da multipop(k) pagato dagli EUR conservati negli elementi! 1. Per ogni operazione sborsi al più O(1) EUR 2. Tutti gli EUR sborsati sufficienti a pagare per lavoro richiesto dalle operazioni 33 Metodo del Potenziale Definisci potenziale Φ per struttura dati D Φ(D) misura potenzialità di D ad eseguire lavoro (configurazione attuale) Durante operazione i-esima, struttura dati passa da configurazione D i a configurazione D i+1 Passa da potenziale Φ(D i ) a potenziale Φ(D i+1 ) Tenere in conto variazione di potenziale Δ Φ = Φ(D i+1 ) - Φ(D i ) Operazione può essere molto costosa ma mette struttura dati in grado di eseguire più efficientemente operazioni future (costo operazione compensato da Δ Φ ) 34
Metodo del Potenziale Tipicamente potenziale Φ soddisfa le: Φ(D 0 ) = 0 e Φ(D i ) 0 per ogni i Definiamo tempo ammortizzato a i dell operazione i- esima: a i = t i + Φ(D i+1 ) - Φ(D i ) dove t i è il tempo (attuale) operazione i-esima Sommando su sequenza di operazioni Σ i a i = Σ i t i + Σ i ( Φ(D i+1 ) - Φ(D i ) ) Σ i a i = Σ i t i + ( Φ(D n ) - Φ(D 0 ) ) Σ i a i Σ i t i 35 Metodo del Potenziale per Esempio 1 Definiamo potenziale Φ della pila P: Nota che: Φ(P) = P Φ(P 0 ) = 0 e Φ(P i ) 0 per ogni i Tempo ammortizzato a i di operazione i-esima: a i = t i + Φ(D i+1 ) - Φ(D i ) Costo ammortizzato di push(x) : a i = t i + Φ(D i+1 ) - Φ(D i ) = 1 + 1 = 2 Costo ammortizzato di multipop(k) : a i = t i + Φ(D i+1 ) - Φ(D i ) = k + ( -k) = 0 36
Heap di Fibonacci 37 Heap di Fibonacci Heap binomiale rilassato: si ottiene da un heap binomiale rilassando la proprietà di unicità dei B i ed utilizzando un atteggimento più pigro durante l operazione insert (perché ristrutturare subito la foresta quando potremmo farlo dopo?) Heap di Fibonacci: si ottiene da un heap binomiale rilassato rilassando la proprietà di struttura dei B i che non sono più necessariamente alberi binomiali Analisi sofisticata: i tempi di esecuzione sono ammortizzati su sequenze di operazioni 38
Conclusioni: tabella riassuntiva L analisi di DHeap e HeapBinomiale è nel caso peggiore, mentre quella per HeapBinomialeRilassato e HeapFibonacci è ammortizzata 39