Prof.ssa Rossella Petreschi Lezione del 29/10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 19 del testo Cormen, Leiserson, Rivest,

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.
Capitolo 8 Code con priorità Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Prof.ssa Rossella Petreschi Lezione del 15 /10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Paragrafo 7.4 del testo Kingston “Algorithms and.
Prof.ssa Rossella Petreschi Lezione del 15 /10/2012 del Corso di Algoritmica B-alberi Lezione n°5.
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.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
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
Cammini minimi in grafi:
Inserzione e Cancellazione
Branch and Bound Lezione n°19 Prof.ssa Rossella Petreschi
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
Complessità ammortizzata degli algoritmi Union Find
Lezione n°14 Reti di flusso Prof.ssa Rossella Petreschi
La gestione degli insiemi disgiunti
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Lezione n°4 Prof.ssa Rossella Petreschi
Paths, tree and flowers Lezione n°14
Algoritmi e Strutture Dati
Lezione n°11 Prof.ssa Rossella Petreschi
UNION FIND Lezione n°8 Prof.ssa Rossella Petreschi
Rappresentazione di alberi
Algoritmi e Strutture Dati
Algoritmi per il flusso nelle reti
Lezione n°6 Prof.ssa Rossella Petreschi
Gestione dinamica di tabelle
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Progettare algoritmi veloci usando strutture dati efficienti
Automi e stringhe Lezione n°24 Prof.ssa Rossella Petreschi
* 07/16/96 Sez. 2: Ordinamento La consultazione di banche dati è sempre più cruciale in tutte le applicazioni dell’Informatica. Se vogliamo consultare.
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
Alberi di ricerca Lezione n°4
Cammini minimi in grafi:
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
Il problema del flusso nelle reti
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:

Prof.ssa Rossella Petreschi Lezione del 29/10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 19 del testo Cormen, Leiserson, Rivest, Stein “Introduzione agli algoritmi” Edizioni: Jackson Libri Heap di Fibonacci Lezione n°8

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)

Funzione potenziale  (F) = t(F) + 2m(F) Con t(F) numero degli alberi e m(F) numero dei nodi marcati

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 = c i +  (D i ) -  (D i-1 ) =  (1) + (t(F i ) + 2m(F i )) - (t(F i-1 ) + 2m( F i-1 )) =  (1) + ((t(F i-1 )+1) + 2m(F i-1 )) - (t(F i-1 ) + 2m( F i-1 )) =  (1) + 1 =  (1) 

Estrazione del minimo dall’Heap Trova il minimo è costante sia nell’Heap che nell’Heap diFibonacci 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). 

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 = c i +  (D i ) -  (D i-1 ) =  d(n)+ t(F i )  + ((d(n)+1) + 2m(F i-1 )) - (t(F i-1 ) + 2m( F i-1 )) =  d(n))+  (t(F i )  + d(n)+1 - t(F i-1 ) =  d(n)) 

Estrazione del minimo dall’Heap di Fibonacci(2) 

Estrazione del minimo dall’Heap di Fibonacci (3)

Estrazione del minimo dall’Heap di Fibonacci (4)

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 = c i +  (D i ) -  (D i-1 ) =  (1) + (t(F i ) + 2m(F i )) - ((t(F 1 i-1 ) + 2m( F 1 i-1 )) + (t(F 2 i- 1 ) + 2m( F 2 i-1 )) =  (1) + 0 =  (1) 

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. c i = (cost-1)  (1) +  (1) =  (cost)  i = c i +  (D i ) -  (D i-1 ) =  (cost) + (t(F i ) + 2m(F i )) - (t(F i-1 ) + 2m( F i-1 )) =  (cost) +((t(F i-1 )+cost)+2(m(F i-1 ) – (cost-1) + 1)) - (t(F i-1 ) + 2m( F i-1 ))=  (cost) cost =  (1) 

Eliminazione di un nodo Heap: scambia il contenuto del nodo x da cancellare con la foglia più a destra 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)) 

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) ≥ F k+2 Per il LemmaII. n ≥  k da cui k ≤ log  n ≤ log  n (log  n = log  n / log   ) LemmaI. size (x) ≥ F k+2 (F 0 = 0; F 1 = 1; F k = F k-1 + F k-2 ) (x è in size(x)) LemmaII. F k+2 = 1 +  F i ≥  k, con i = 0,…,k (con  1+√5)/2  LemmaIII. Siano y 1,y 2,…y k 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(y 1 )≥ 0, d(y i )≥ i-2 

Lemma I. LemmaI. size (x) ≥ F k+2 Prova per induzione : sia s k la più piccola size(z) fra tutti i nodi z con d(z) = k; s 0 = 1; s 1 = 2; s 2 = 3. Come da LemmaIII, siano y 1,y 2,…y k i figli di x, si ha: size (x)≥ s k ≥ 2 +  s i-2 per i =2,…k Passo base e hp. induttiva: s 0 ≥ F 2 (1=1); s 1 ≥ F 3 (2=2); fino a s k-1 ≥ F k+1 Prova: s k ≥ 2 +  s i-2 ≥ 2 +  F i per i =2,…k = 1 +  F i per i =0,…k = F k+2 LemmaIII. Siano y 1,y 2,…y k 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(y 1 )≥ 0, d(y i )≥ i-2 

Lemma II. LemmaII. F k+2 = 1 +  F i, per i = 0,…,k, per tutti gli interi k ≥ 0 Dimostrazione per induzione: Passo base: 1 + F 0 = = 1 = F 2 Ipotesi induttiva: F k+1 = 1 +  F i, per i = 0,…,k-1 Prova: F k+2 = F k + F k+1 = F k + (1 +  F i, per i = 0,…,k-1) = = 1 +  F i, per i = 0,…,k Dalla teoria dei numeri di Fibonacci: F k+2 ≥  k (con  (1+ √5)/2, ovvero  a+b)/a = a/b  

Lemma III. LemmaIII. Siano y 1,y 2,…y k 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(y 1 ) ≥ 0, d(y i )≥ i-2 Prova: Banalmente d(y 1 )≥ 0. Quando y i è stato connesso ad x, questi già aveva y 1,y 2,…y i-1 come figli. Quindi d(x) = d(y i ) ≥ i-1. Ma il nodo y i per rimanere figlio di x può al più aver perso un figlio, quindi d(y i ) ≥ i-2 

Algoritmo di Dijkstra

Costo dell’algoritmo di Dijkstra Worst case generale W(n,m) =  (n inserzioni + n elimina minimo + m decrementa chiave) Lista  (n 1 + n n + m 1) =  (n 2 )  Heap  (n logn + n logn + m logn) =  (m logn) Heap Fib  (n 1 + n logn + m 1) =  (n logn + m) Si può mostrare che  (nlogn + m) è la migliore complessità asintotica raggiungibile