Algoritmi e Strutture Dati IV. Heap e Code di Priorità

Slides:



Advertisements
Presentazioni simili
Algoritmi e Strutture Dati
Advertisements

1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Code a priorità (Heap) Definizione
Alberi binari di ricerca
Code con priorità Ordinamento
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°13 Heap massimo.
Esercizi su alberi binari
Algoritmi e strutture Dati - Lezione 7
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
Algoritmi e Strutture Dati (Mod. A)
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Dizionari alberi bilanciati.
tipo astratto, implementazione, algoritmi
Hashing.
Algoritmi e Strutture Dati
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su alberi binari
Heap binari e HeapSort.
Heap binomiali Gli heap binomiali sono strutture dati su cui si possono eseguire efficientemente le operazioni: Make(H) : crea uno heap vuoto Insert(H,
Algoritmi e strutture dati
RB-insert(T, z) // z.left = z.right = T.nil Insert(T, z) z.color = RED // z è rosso. Lunica violazione // possibile delle proprietà degli alberi // rosso-neri.
Heap Ordinamento e code di priorità Ugo de Liguoro.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Esercizi.
Soluzione: Algoritmo Heap-Sort Un array A[1..n] può essere interpretato come un albero binario: A[1] è la radice, A[2i] e A[2i+1] sono i figli di A[i]
1/32 Algoritmi e Strutture Dati HEAP Anno accademico
1 Un esempio con iteratore: le liste ordinate di interi.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
AlgoLab - Code unificabili Code unificabili con alberi binomiali Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
AlgoLab - MST code binomiali Algoritmi per il calcolo di MST: uso di code unificabili Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Algoritmi e Strutture Dati Strutture Dati Elementari.
Capitolo 8 Code con priorità Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
1 Un esempio: le liste ordinate di interi. 2 Liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
Algoritmi e strutture dati
Esercitazione sull’ ordinamento 20 maggio 2003
1 Un esempio con iteratore: le liste ordinate di interi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Progettare algoritmi.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Progettare algoritmi veloci usando strutture dati efficienti
Progettare algoritmi veloci usando strutture dati efficienti
concetti ed applicazioni
Transcript della presentazione:

Algoritmi e Strutture Dati IV. Heap e Code di Priorità

heap heap = catasta condizione di heap albero binario perfettamente bilanciato ogni nodo contiene una chiave maggiore o eguale di quelle presenti negli eventuali figli non memorizza un ordinamento totale le visite in ampiezza e in pre- in- post-ordine non forniscono un ordinamento delle chiavi maggio 2002 ASD - Heap

heap? 67 68 89 66 1 65 5 4 64 67 68 89 2 1 66 65 3 4 5 6 67 67 1 66 65 89 maggio 2002 ASD - Heap

max- e min-heap la struttura definita è detta max-heap variante: min-heap ogni nodo contiene una chiave minore o eguale di quelle presenti negli eventuali figli 13 22 6 32 23 33 24 44 27 56 81 min-heap maggio 2002 ASD - Heap

Implementa tipo di dato astratto Coda di Priorità Insert(key) inserisce nuovo oggetto nello heap occorre mantenere la condizione di heap deleteMax() cancella oggetto di chiave maggiore dallo heap getMax() restituisce l’oggetto di chiave max nello heap non modifica lo heap maggio 2002 ASD - Heap

rappresentazione degli heap tutte le rappresentazione usate per gli alberi binari sono ammissibili rappresentazione collegata, eventualmente con puntatori figli-genitore rappresentazione tramite array particolarmente efficiente maggio 2002 ASD - Heap

rappresentazione tramite array ogni nodo v è memorizzato in posizione p(v) se v è la radice allora p(v)=0 se v è il figlio sinistro di u allora p(v)=2p(u)+1 se v è il figlio destro di u allora p(v)=2p(u)+2 65 66 67 1 43 21 5 4 68 89 64 6 7 8 9 10 11 3 2 12 67 68 89 43 1 66 65 21 5 4 64 maggio 2002

heap su array vantaggi svantaggio grande efficienza in termini di spazio l’occupazione può essere minima facilità di navigazione genitore i -> figli j j = 2i + 1, 2i + 2 figlio i -> genitore j j = (i – 1) / 2 svantaggio implementazione statica possono essere necessari progressivi raddoppiamenti/dimezzamenti dell’array di supporto maggio 2002 ASD - Heap

rappresentazione in Java public class Heap { public static final int DEFAULTCAPACITY = 50; private Comparable[] storage; private int size; public Heap() { this(DEFAULTCAPACITY); } public Heap(int dim) { storage = new Comparable[dim]; size = 0; // metodi… maggio 2002 ASD - Heap

rappresentazione in Java/2 public boolean isLeaf(int i) { return getLeftIndex(i) >= size; } public boolean isRoot(int i) { return i == 0; public boolean isEmpty() { return size == 0; public boolean isFull() { return size == storage.length; svantaggio implementazione statica possono essere necessari progressivi raddoppiamenti/dimezzamenti dell’array di supporto maggio 2002 ASD - Heap

rappresentazione in Java/3 private int getLeftIndex(int i) { return 2 * i + 1; } private int getRightIndex(int i) { return getLeftIndex(i) + 1; private int getParentIndex(int i) { return (i - 1) / 2; public String toString() {…} public Object clone(){…} public Object equals(){…} svantaggio implementazione statica possono essere necessari progressivi raddoppiamenti/dimezzamenti dell’array di supporto maggio 2002 ASD - Heap

algoritmi su heap operazioni altri algoritmi getMax() Insert(key) deleteMax() altri algoritmi Array2Heap conversione di un array in heap HeapSort ordinamento di un array basato su heap maggio 2002 ASD - Heap

getMax il max è contenuto nella cella 0 dell’array operazione di costo costante O(1) public Comparable getMax() throws Exception { if(!isEmpty()) return storage[0]; else throw new Exception("getMax requested to empty heap"); } maggio 2002 ASD - Heap

insert 1. inserisci elemento alla fine dello heap 2. while (elemento non è radice) and (elemento > genitore(elemento)) 3. scambia elemento con genitore maggio 2002 ASD - Heap

insert/2 maggio 2002 ASD - Heap

insert/3 public void insert(Comparable key) throws Exception{ if (this.isFull()) throw new Exception("Full heap"); else{ storage[this.size]=key; //put the new key at the end of this heap. int index = size++; int parent = getParentIndex(index); while(!isRoot(index) && (storage[index].compareTo(storage[parent])>0)) { exchange(index, parent); // sswap celle di storage index = parent; parent = getParentIndex(index); } maggio 2002 ASD - Heap

Heapify(i) operazione heapify(i) considera l'albero avente radice nella cella i e, qualora la condizione di heap non è rispettata, la ristabilisce attraverso una sequenza di scambi while (i non è foglia) and (key[i] < un figlio) scambia i con il suo figlio maggiore maggio 2002 ASD - Heap

Heapify public void heapify(int i) { if(isLeaf(i)) return; else { int j = 0; try { j = getMaxChildIndex(i); } catch(Exception e) { // only if i is a leaf.... already checked if(storage[i].compareTo(storage[j])<0){ exchange(i, j); heapify(j);} maggio 2002 ASD - Heap

deleteMax 1 Sostituisci il primo elemento con l’ultima foglia Elimina l’ultima foglia Invoca Heapify sulla radice maggio 2002 ASD - Heap

deleteMax/2 maggio 2002 ASD - Heap

Heapsort/1 Ordinamento di un insieme di n interi Costruisci l’Heap inserendo gli elementi uno ad uno. Complessità: O(nlog n) Applica ripetutuamente deleteMax Complessità: O(n log n) maggio 2002 ASD - Heap

Heapsort/2 public static void heapSort(Comparable[] data) { Heap aHeap = array2heap(data); for(int i = aHeap.size - 1; i > 0; i--) { aHeap.exchange(0, i); aHeap.size--; aHeap.heapify(0); } System.arraycopy(aHeap.storage, 0, data, 0, aHeap.storage.length); maggio 2002 ASD - Heap

Costruzione di un Heap in O(n)/1 Disponi l’insieme di elementi in un array For (i= indice ultimo nodo non foglia; i>=0, i--) Invoca heapify (i) public static Heap array2heap(Comparable[] data) { Heap aHeap = new Heap(data.length); aHeap.size = data.length; System.arraycopy(data, 0, aHeap.storage, 0, data.length); for(int i = aHeap.getParentIndex(aHeap.size-1); i >= 0; i--) aHeap.heapify(i); return aHeap; } maggio 2002 ASD - Heap

maggio 2002 ASD - Heap

Costruzione di un Heap in O(n)/2 Assumi n=2k-1, heap di k-1 livelli Heapify invocata (n+1)/2 volte sui nodi dal penultimo livello fino al primo. (n+1)/4 nodi del penultimo livello. Heapify richiede al più 1 scambio (n+1)/2i nodi di livello k-i-1. Heapify su nodo di livello k-i-1 provoca al più i-1 scambi maggio 2002 ASD - Heap

Costruzione di un Heap in O(n)/2 Heap di n nodi ha al più lg(n) livelli i-esimo livello dal basso: (n+1)/2i nodi i-1 scambi compiuti da Heapify maggio 2002 ASD - Heap

Domande Dove si trova l’elemento più piccolo di un heap? Mostrare l’implementazione di una coda con una coda di priorità Mostrare l’implementazione di una pila con una coda di priorità Discutere un algoritmo che elimini un elemento qualsiasi dell’Heap in tempo O(log n) Discutere una struttura datio che implementi una coda di priorità che permetta di aumentare la priorità di un elemento. maggio 2002 ASD - Heap