Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi

Slides:



Advertisements
Presentazioni simili
Fibonacci Heaps e il loro utilizzo nell’algoritmo di Prim
Advertisements

Vediamo cos’è di preciso l’Heap (in italiano Pila) di Fibonacci.
Prof.ssa Rossella Petreschi Lezione del 15 /10/2012 del Corso di Algoritmica B-alberi Lezione n°5.
Prof.ssa Rossella Petreschi Lezione del 29/10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 19 del testo Cormen, Leiserson, Rivest,
Fondamenti di Informatica A - Massimo Bertozzi ALBERI E ALBERI BINARI DI RICERCA (BST)
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
Code con priorità Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
Prof.ssa Rossella Petreschi Lezione del 3/12/2013 del Corso di Algoritmica GRAFI e PLANARITA’ Lezione n°15.
Prof.ssa Rossella Petreschi Lezione del 29 /10/2014 del Corso di Algoritmica Lezione n°8.
Alberi autoaggiustanti
Alberi di ricerca di altezza logaritmica
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Progettare algoritmi veloci usando strutture dati efficienti
Inserzione e Cancellazione
Branch and Bound Lezione n°14 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
Progettare algoritmi veloci usando strutture dati efficienti
Alberi di ricerca di altezza logaritmica
Analisi di sequenze di operazioni Union-Find
Lezione n°9 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Lezione n°7 Prof.ssa Rossella Petreschi
La funzione Path e le forme a cespuglio
Alberi binari Definizione Sottoalberi Padre, figli
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Rappresentazione di alberi
Correzione 1° Esonero Lezione n°13
Rappresentazione di alberi binari
B-alberi e alberi autoaggiustanti
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Complessità ammortizzata degli algoritmi Union Find
La gestione degli insiemi disgiunti
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Lezione n°4 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
Paths, tree and flowers Lezione n°14
K4 è planare? E K3,3 e K5 sono planari? Sì!
Algoritmi e Strutture Dati
UNION FIND Lezione n°8 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
Lezione n°6 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Progettare algoritmi veloci usando strutture dati efficienti
* 07/16/96 Sez. 2: Ordinamento La consultazione di banche dati è sempre più cruciale in tutte le applicazioni dell’Informatica. Se vogliamo consultare.
Ottimizzazione distribuita
Estensione di strutture dati e
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
Algoritmi e Strutture Dati
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
LINGUAGGIO C Alberi e livelli
Backtracking Lezione n°17 Prof.ssa Rossella Petreschi
Alberi di ricerca Lezione n°4
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Lezione n°7 Splay-Trees e Heaps Prof.ssa Rossella Petreschi
concetti ed applicazioni
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Insiemi disgiunti.
Algoritmi e Strutture Dati
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Unione per ranghi compressi
Tabelle dinamiche Lezione n°3
Analisi ammortizzata Lezione n°2
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Transcript della presentazione:

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 ≤ logn ≤ logn (logn = 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