Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi Heap di Fibonacci Lezione n°3 Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi ASD a.a.2010/2011- Lezione n°3
Heap La struttura dati Heap (minimo) è un albero binario di n elementi, completo o quasi completo, tale che il valore associato ad ogni nodo sia maggiore o uguale a quello associato al padre. La radice contiene il valore minimo. (in modo analogo si parla di heap massimo). L’heap è efficientemente rappresentato con un vettore e ∀i , p(i) in posizione ëi/2û, fs(i) e fd(i) in posizione 2i e 2i+1 2 5 7 7 9 8 1 2 3 4 5 6 ASD a.a.2010/2011- Lezione n°3
Heap di Fibonacci:definizione Un Heap di Fibonacci è un insieme non ordinato di alberi con la seguente struttura: le radici degli alberi dell’heap, così come i figli di ogni singolo nodo, sono fra loro collegate da una lista doppiamente puntata; ogni nodo v contiene un puntatore al padre; un puntatore ad uno dei figli; il numero dei figli; un valore inferiore a quello associato ai figli (per ogni albero il valor minimo è associato alla radice); esiste un puntatore alla radice contenente il valore minimo di tutto l’heap. Infine ad ogni nodo v è associato un booleano. Il booleano Vero indica che v è marcato, dato che ha perso un figlio durante una delle operazioni sull’heap. ASD a.a.2010/2011- Lezione n°3
Heap di Fibonacci:immagine ASD a.a.2010/2011- Lezione n°3
Confronto dei costi HEAP HEAP DI FIBONACCI Creazione di un heap (1) (1) Inserisci un nuovo elemento (logn) (1) Trova il minimo (1) (1) Estrai il minimo (logn) (logn) Unisci due Heaps (n) (1) Decrementa una chiave (logn) (1) Cancella un nodo (logn) (logn) ASD a.a.2010/2011- Lezione n°3
Funzione potenziale (F) = t(F) + 2m(F) Con t(F) numero degli alberi e m(F) numero dei nodi marcati ASD a.a.2010/2011- Lezione n°3
Operazione di inserimento Heap: il nuovo nodo con valore x è inserito come foglia più a destra nell’ultimo livello dell’Heap preesistente. Viene poi riaggiustato l’Heap scambiando il nuovo nodo con il padre se il valore ad esso associato è maggiore di x. Il procedimento può iterare fino a raggiungere la radice. (logn). Heap di Fibonacci: si crea un semplice Heap di Fibonacci costituito dal solo nodo di valore x. Si uniscono le liste delle radici del nuovo Heap e di quello preesistente. Si aggiorna il valore del numero dei nodi nello heap e, se occorre,il puntatore al minimo. i = ci + (Di) - (Di-1) = (1) + (t(Fi) + 2m(Fi)) - (t(Fi-1) + 2m( Fi-1)) = (1) + ((t(Fi-1)+1) + 2m(Fi-1)) - (t(Fi-1) + 2m( Fi-1)) = (1) + 1 = (1) ASD a.a.2010/2011- Lezione n°3
Estrazione del minimo dall’Heap Trova il minimo è costante sia nell’Heap che nell’Heap di Fibonacci Estrai il minimo dall’Heap Si estrae il minimo e poi si sostituisce alla radice il valore della foglia più a destra nell’ultimo livello dell’Heap. Si elimina la foglia, riducendo di uno il numero di nodi nell’Heap. Si riaggiusta l’Heap scambiando il nuovo nodo radice con il figlio di valore minore, sempre che non sia uguale a quello associato alla radice. Il procedimento può iterare fino a raggiungere una foglia. (logn). ASD a.a.2010/2011- Lezione n°3
Estrazione del minimo dall’Heap di Fibonacci (1) Si portano i figli del nodo minimo al livello delle radici. Si elimina la radice minimo e il puntatore principale dell’Heap punta ad un nuovo nodo radice momentaneamente. Poi riaggiusta l’Heap con il seguente passo da ripetere fino a quando tutte le radici non avranno grado differente - siano x e y due radici con lo stesso numero di figli,(Val(y)> Val(x), y diviene figlio di x e viene eliminata dalla lista delle radici (si incrementa il grado di x, mentre si analizzano le radici si ripristina il puntatore principale) i = ci + (Di) - (Di-1) = d(n)+ t(Fi) + ((d(n)+1) + 2m(Fi-1)) - (t(Fi-1) + 2m( Fi-1)) = d(n))+ (t(Fi) + d(n)+1 - t(Fi-1) = d(n)) ASD a.a.2010/2011- Lezione n°3
Estrazione del minimo dall’Heap di Fibonacci(2) ASD a.a.2010/2011- Lezione n°3
Estrazione del minimo dall’Heap di Fibonacci (3) ASD a.a.2010/2011- Lezione n°3
Estrazione del minimo dall’Heap di Fibonacci (4) ASD a.a.2010/2011- Lezione n°3
Unione di Heaps Heap: ci sono due strategie: o costruire l’Heap a partire dal vettore disordinato di n+m elementi (n+m), oppure aggiungere uno alla volta gli elementi dell’Heap di dimensione minore a quello di dimensione maggiore (m log (n+m)) Heap di Fibonacci: si uniscono le liste delle radici dei due Heaps (si aggiorna il nuovo minimo e il numero totale dei nodi) i = ci + (Di) - (Di-1) = (1) + (t(Fi) + 2m(Fi)) - ((t(F1i-1) + 2m( F1i-1)) + (t(F2i-1) + 2m( F2i-1)) = (1) + 0 = (1) ASD a.a.2010/2011- Lezione n°3
Decremento di un valore Heap: si decrementa il nodo fissato x. Viene poi riaggiustato l’Heap scambiando il nuovo nodo con il padre se il valore ad esso associato è maggiore di x. Il procedimento può iterare fino a raggiungere la radice. (logn). Heap di Fibonacci: si decrementa il nodo fissato x. Se il valore di x è minore di quello del padre, si porta x alla radice. Se p(x) è marcato si porta anch’esso alla radice, ma smarcato. Il procedimento può iterare finchè un padre non è marcato o finchè non si arriva al livello delle radici. Sia (cost-1) il numero di volte che un padre viene portato alla radice e smarcato. ci = (cost-1) (1) + (1) = (cost) i = ci + (Di) - (Di-1) = (cost) + (t(Fi) + 2m(Fi)) - (t(Fi-1) + 2m( Fi-1)) = (cost) +((t(Fi-1)+cost)+2(m(Fi-1) – (cost-1) + 1)) - (t(Fi-1) + 2m( Fi-1))= (cost) + 4 - cost = (1) ASD a.a.2010/2011- Lezione n°3
Eliminazione di un nodo Heap: scambia il contenuto del nodo x da cancellare con la foglia più a destrs nell’ultimo livello. Elimina la foglia e riduci di uno la dimensione dell’Heap. Riaggiusta l’Heap scambiando il valore del nodo x con quello del padre se il valore ad esso associato è maggiore di x. Il procedimento può iterare fino a raggiungere la radice. (logn). Heap di Fibonacci: decrementa a 0 il nodo x. Applica prima la procedura decrementa e poi la cancella minimo i = (1) + (d(n)) = (d(n)) ASD a.a.2010/2011- Lezione n°3
Limitazione del grado massimo TH: il grado massimo d(n) di un qualunque nodo in un Heap di Fibonacci con n nodi è O(logn) Prova : sia k=d(x), con x nodo dell’HF di dimensione n. Per il LemmaI. vale n ≥ size (x) ≥ Fk+2 Per il LemmaII. n ≥ k da cui k ≤ logn ≤ logn (logn = log n / log ) LemmaI. size (x) ≥ Fk+2 (F0 = 0; F1 = 1; Fk= Fk-1 + Fk-2 ) (x è in size(x)) LemmaII. Fk+2 = 1 + Fi ≥ k , con i = 0,…,k (con 1+√5)/2 LemmaIII. Siano y1,y2,…yk i figli di un nodo x dati nell’ordine con cui sono stati collegati ad x (dal meno al più recente), si ha che: d(y1)≥ 0, d(yi)≥ i-2 ASD a.a.2010/2011- Lezione n°3
Lemma I. LemmaI. size (x) ≥ Fk+2 Prova per induzione : sia sk la più piccola size(z) fra tutti i nodi z con d(z) = k; s0 = 1; s1 = 2; s2 = 3. Come da LemmaIII, siano y1,y2,…yk i figli di x, si ha: size (x)≥ sk ≥ 2 + si-2 per i =2,…k Passo base e hp. induttiva: s0 ≥ F2 (1=1); s1 ≥ F3 (2=2); fino a sk-1 ≥ Fk+1 Prova: sk ≥ 2 + si-2 ≥ 2 + Fi per i =2,…k = 1 + Fi per i =0,…k = Fk+2 LemmaIII. Siano y1,y2,…yk i figli di un nodo x dati nell’ordine con cui sono stati collegati ad x (dal meno al più recente), si ha che: d(y1)≥ 0 , d(yi)≥ i-2 ASD a.a.2010/2011- Lezione n°3
Lemma II. LemmaII. Fk+2 = 1 + Fi , per i = 0,…,k, per tutti gli interi k ≥ 0 Dimostrazione per induzione: Passo base: 1 + F0= 1 + 0 = 1 = F2 Ipotesi induttiva: Fk+1 = 1 + Fi , per i = 0,…,k-1 Prova: Fk+2 = Fk + Fk+1 = Fk + (1 + Fi , per i = 0,…,k-1) = = 1 + Fi , per i = 0,…,k Dalla teoria dei numeri di Fibonacci: Fk+2 ≥ k (con (1+ √5)/2 , ovvero a+b)/a = a/b ASD a.a.2010/2011- Lezione n°3
Lemma III. LemmaIII. Siano y1,y2,…yk i figli di un nodo x dati nell’ordine con cui sono stati collegati ad x (dal meno recente al più recente), si ha che: d(y1) ≥ 0, d(yi)≥ i-2 Prova: banalmente d(y1)≥ 0. Quando yi è stato connesso ad x, questi già aveva y1,y2,…yi-1 come figli. Quindi d(x) = d(yi) ≥ i-1. Ma il nodo yi per rimanere figlio di x può al più aver perso un figlio, quindi d(yi) ≥ i-2 ASD a.a.2010/2011- Lezione n°3
Confronto dei costi HEAP HEAP DI FIBONACCI Creazione di un heap (1) (1) Inserisci un nuovo elemento (logn) (1) Trova il minimo (1) (1) Estrai il minimo (logn) (d(n))=(logn) Unisci due Heaps (n) (1) Decrementa una chiave (logn) (1) Cancella un nodo (logn) (d(n))=(logn) ASD a.a.2010/2011- Lezione n°3
Algoritmo di Dijkstra ASD a.a.2010/2011- Lezione n°3
Costo dell’algoritmo di Dijkstra Worst case generale W(n,m) = (n inserzioni + n eliminaminimo + m decrementa chiave) Lista (n 1 + n n + m 1) = (n2) Heap (n logn + n logn + m logn) = (m logn) Heap Fib (n 1 + n logn + m 1) = (n logn + m) Mostreremo che (n logn + m) è la migliore complessità asintotica raggiungibile ASD a.a.2010/2011- Lezione n°3