Title: Fibonacci Heaps e il loro utilizzo nell
1Fibonacci Heaps e il loroutilizzo
nellalgoritmo di Prim
2Cosa 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
3Gli 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
4Gli 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.
5Cosè 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 reale costo amm.
INSERISCI O(1) O(1)
TROVA-MIN O(1) O(1)
ESTRAI-MIN O(lg(n) t(H)) O(lg(n))
UNIONE O(1) O(1)
DECR-CHIAVE O(lg(n)) O(1)
CANCELLA O(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
11Minimum Spanning Treenozioni 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
12Minimum Spanning Treealgoritmi
- Gli algoritmi più noti sono
- Algoritmo di Prim
- Algoritmo di Kruskal
13Algoritmo di Kruskal
- 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(mlog n)
14Algoritmo di Prim
- Grafo G(N, E1) -gt grafo
- Albero T(N, E2) -gt 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
-
15Algoritmo 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
16Algoritmo di Primle 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).
archi presenti nella SD
arco con chiave minima
a
a
q
p
p
q
T
T
b
min
q lt p
17Algoritmo di Primutilizzo degli Heap di
Fibonacci
- 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
18Algoritmo di Primutilizzo degli Heap di
Fibonacci
- 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
-
n-1
2m
19Algoritmo di Primcomplessità 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))
20Algoritmo di Primosservazioni 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))
21Algoritmo di Primosservazioni finali (2)
- 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
-
22Algoritmo di Primesempio (1)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5
23Algoritmo di Primesempio (2)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5
24Algoritmo di Primesempio (3)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5
25Algoritmo di Primesempio (4)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5
26Algoritmo di Primesempio (5)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5
27Algoritmo di Primesempio (6)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5
28Algoritmo di Primesempio (7)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5
29Algoritmo di Primesempio (8)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5
30Algoritmo di Primesempio (8)
2
18
6
6
1
8
13
4
10
17
8
12
15
1
14
7
4
3
3
20
5