La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Fibonacci Heaps e il loro utilizzo nellalgoritmo di Prim Paolo Larcheri 52SI.

Presentazioni simili


Presentazione sul tema: "Fibonacci Heaps e il loro utilizzo nellalgoritmo di Prim Paolo Larcheri 52SI."— Transcript della presentazione:

1 Fibonacci Heaps e il loro utilizzo nellalgoritmo di Prim Paolo Larcheri 52SI

2 Cosa vedremo Cos è uno heap Cenni sullanalisi ammortizzata Cosa sono gli Heap di Fibonacci Gli algoritmi di Minimum Spanning Tree Lutilizzo degli Heap di Fibonacci nellalgoritmo di Prim Complessità dellalgoritmo di Prim Esempio di funzionamento dellalgoritmo di Prim

3 Gli heap Lo heap, in generale, è una struttura dati atta a contenere un insieme di dati ordinabili A prescindere dallimplementazione gli heap devono fornire le seguenti operazioni: INSERISCI: inserimento di un nuovo elemento TROVA-MIN: ricerca dell elemento con chiave minima ESTRAI-MIN: estrazione dellelemento con chiave minima UNIONE: fusione di due heap DECREMENTA-CHIAVE: dato un elemento dello heap e un nuovo e minore valore per la chiave dello stesso, aggiorna la chiave al nuovo valore CANCELLA: cancellazione di uno specifico elemento

4 Gli Heap di Fibonacci (1) Introdotti da Fredman e Tarjan nel 1987 Possono essere considerati unottima implementazione di Heap!! Sono stati progettati ispirandosi allanalisi ammortizzata al fine di ottenere ben precisi costi.

5 Cosè lanalisi ammortizzata Lanalisi ammortizzata mira ad esprimere il tempo di esecuzione di unintera sequenza di operazioni attribuendo un costo nominale ad ogni tipologia di operazione (inserimento, cancellazione, …). Anche se una singola operazione può forare il suo costo nominale, limportante e che il costo complessivo dellintera sequenza resti entro la somma dei costi nominali per le singole operazioni che la compongono. Ovviamente vogliamo dichiarare dei costi nominali il piu bassi possibili!

6 Gli Heap di Fibonacci (2) Le complessità delle operazioni: Operazione costo realecosto amm. INSERISCIO(1) TROVA-MINO(1) ESTRAI-MINO(lg(n) + t(H))O(lg(n)) UNIONEO(1) DECR-CHIAVEO(lg(n))O(1) CANCELLAO(lg(n) + t(H))O(lg(n)) t(H): numero di radici dello Heap di Fibonacci

7 Gli Heap di Fibonacci (3) Gli Heap di Fibonacci sono costituiti da una lista di alberi caratterizzati ciascuno dall ordinamento parziale dello heap: la chiave di ogni nodo è minore o uguale alla chiave dei figli; in questo modo è garantito che il nodo con chiave minima è una delle radici Ogni elemento dello Heap di Fibonacci punta al nodo-padre Ogni nodo punta alla lista dei figli

8 Gli Heap di Fibonacci (4) Ogni istanza di Heap di Fibonacci è costituita dai seguenti attributi: puntatore alla lista delle radici puntatore al nodo con chiave minima numero complessivo di alberi contenuti nello Heap numero totale di nodi presenti nello Heap

9 Gli Heap di Fibonacci (5) Ogni elemento dello Heap di Fibonacci è collegato direttamente al nodo-padre Inoltre i suoi figli sono collocati in una lista Gli attributi di ogni nodo sono: puntatore al nodo-padre puntatore alla lista dei figli 2 puntatori: uno al suo fratello destro e uno al suo fratello sinistro il grado (intero): numero dei suoi figli chiave: il valore del nodo

10 Gli Heap di Fibonacci (6) Rappresentazione logica di uno Heap di Fibonacci allinterno di un calcolatore:

11 Minimum Spanning Tree: nozioni fondamentali Dato un grafo G(N, E) connesso, pesato e non orientato è sempre possibile trovare il suo MST, cioè quellalbero T(N, E2) (E2 E) per cui la somma di tutti i pesi degli archi appartenenti a E2 è minima Chiaramente se il grafo G è un albero, il suo MST sarà G stesso Se G possiede archi con peso uguale è possibile che esistano più MST per G

12 Minimum Spanning Tree: algoritmi Gli algoritmi più noti sono Algoritmo di Prim Algoritmo di Kruskal

13 Lalgoritmo di Kruskal è di tipo Greedy. Consiste nellordinare tutti gli archi del grafo secondo il loro peso. Inizialmente T è composto da i soli nodi di G. Vanno aggiunti (seguendo lordine di peso) uno a uno tutti gli archi che non generano cicli in T. Loperazione più costosa è ordinare gli archi; utilizzando un buon algoritmo di ordinamento, lalgoritmo di Kruskal costa O(m log n)

14 Algoritmo di Prim Grafo G(N, E1) -> grafo Albero T(N, E2) -> MST NB: E2 E1 Albero Prim(Grafo) { considera T formato da un nodo e da nessun arco; while(esistono nodi in T adiacenti a un nodo non in T) { seleziona larco di peso minimo che collega un nodo in T con un nodo non in T; aggiungi a T sia larco selezionato che il nuovo nodo; } return T; }

15 Algoritmo di Prim Nellalgoritmo di Prim è indispensabile utilizzare una struttura dati che contenga ad ogni passo della computazione tutti gli archi candidati allinserimento in T, ossia gli archi che connettono un nodo in T con uno non in T Bisogna quindi ad ogni iterazione effettuare degli inserimenti e o delle sostituzioni

16 Algoritmo di Prim: le sostituzioni Ad ogni iterazione, per ogni nodo v non ancora in T, basta tenere traccia del miglior arco e(v) che lo connetta ad un nodo già in T. Di fatto, per ogni nodo v non in T, terremo traccia dellestremo in T di e(v), (NULL se nessun arco incidente in v ha laltro estremo in T). q < p T T min p q q a p a b = archi presenti nella SD= arco con chiave minima

17 Gli Heap di Fibonacci si prestano particolarmente bene a svolgere questa funzione mediante loperazione DECR-CHIAVE Come visto prima questa operazione ha costo (ammortizzato) costante Algoritmo di Prim: utilizzo degli Heap di Fibonacci

18 Albero Prim(Grafo G) { considera T formato da un nodo scelto a caso; FH.inserisci(tutti gli archi del nodo scelto); while(anew = FH.estraiMin()) { nnew = nodo dellarco appena estratto che non appartiene a T; T.inserisci(nnew, anew); for each(x congiunto a nnew da un arco y) { if(x non appartiene a T) if(FH contiene arco z che congiunge x a T) FH.decrChiave(z, y); else FH.inserisci(y); } return T; } Algoritmo di Prim: utilizzo degli Heap di Fibonacci 2m n-1

19 Algoritmo di Prim: complessità ammortizzata WHILE: a ogni iterazione viene effettuata una ESTRAI-MIN che come abbiamo visto ha costo ammortizzato pari a O(lg n) FOR EACH: a ogni iterazione viene eseguita una DECR-CHIAVE o una INSERISCI aventi entrambe costo ammortizzato costante TOTALE: il costo totale ammortizzato è quindi O(m + n(lg n))

20 Algoritmo di Prim: osservazioni finali (1) Il costo dellalgoritmo di Prim con gli Heap di Fibonacci dipende anche dal numero di archi Quindi: Per grafi densi la complessità risulta essere O(n²) Per grafi sparsi la complessità risulta essere O(n(lg n))

21 ATTENZIONE: per grafi densi risulta essere più efficiente lutilizzo di strutture dati semplici (es: liste) in quanto la complessità della struttura degli Heap di Fibonacci comporta unespansione della costante moltiplicativa non rilevabile a causa della notazione asintotica Per capirci: liste O(an ² ) Heap di Fibonacci O(bn ² ) a « b Algoritmo di Prim: osservazioni finali (2)

22 Algoritmo di Prim: esempio (1)

23 Algoritmo di Prim: esempio (2)

24 Algoritmo di Prim: esempio (3)

25 Algoritmo di Prim: esempio (4)

26 Algoritmo di Prim: esempio (5)

27 Algoritmo di Prim: esempio (6)

28 Algoritmo di Prim: esempio (7)

29 Algoritmo di Prim: esempio (8)

30 Algoritmo di Prim: esempio (8)


Scaricare ppt "Fibonacci Heaps e il loro utilizzo nellalgoritmo di Prim Paolo Larcheri 52SI."

Presentazioni simili


Annunci Google