Heap e code di priorità
|
|
|
- Veronica Costa
- 9 anni fa
- Просмотров:
Транскрипт
1 Heap e code di priorità Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati Heap e code di priorità AA 2009/2010 1/16
2 Problema Contesto S è un insieme dinamico di n elementi, ciascuno dei quali è dotato di una chiave o valore di priorità; in genere: minore è la chiave, massimo è il suo valore di priorità. Le chiavi sono ordinate (totalmente), ovvero per ogni coppia di chiavi k 1 e k 2 si ha k 1 k 2 oppure k 2 k 1. Vogliamo poter eseguire efficientemente le seguenti operazioni: inserire elementi; scegliere l elemento di S con massima priorità (valore minimo); cancellare l elemento di S con massima priorità. Esempio di applicazione Scheduling online di processi (ad opera del sistema operativo): i processi vanno eseguiti in base ad un certo valore di priorità, ma le richieste non arrivano necessariamente in questo ordine. Violetta Lonati Heap e code di priorità AA 2009/2010 2/16
3 Ordinamento tramite code di priorità Avendo a disposizione una coda di priorità, è possibile effettuare questo algoritmo di ordinamento: crea una nuova coda di priorità Q inserisci in Q un elemento di S alla volta finchè Q non è vuota estrai il minimo m da Q stampa m Se le operazioni di inserimento e estrazione del minimo si possono fare in tempo O(log n), allora otterremmo un algoritmo di ordinamento ottimale, ovvero di costo O(n log n), infatti: per ogni elemento di S, l inserimento in coda costa O(log n), quindi l inserimento degli n elementi costa O(n log n); l estrazione del minimo costa O(log n) quindi il ciclo finale costa O(n log n). Obiettivo: implementare queste operazioni con costo O(log n)!! Violetta Lonati Heap e code di priorità AA 2009/2010 3/16
4 Implementazioni naïf (1) Usando una lista con un puntatore all elemento minimo: l inserimento in testa ha costo O(1); la ricerca del minimo ha costo O(1); per estrarre il minimo devo aggiornare il puntatore, quindi devo scorrere la lista e il costo diventa O(n). Soluzione non ottimale Violetta Lonati Heap e code di priorità AA 2009/2010 4/16
5 Implementazioni naïf (2) Usando una struttura ordinata: la ricerca del minimo ha costo O(1); l estrazione del minimo ha costo O(1); l inserimento ha costo O(n): se uso un array: con una ricerca dicotomica trovo la posizione in cui inserire con costo O(log n) ma poi devo spostare tutti gli elementi più grandi e questo nel caso peggiore ha costo O(n); se uso una lista: l inserimento ha costo O(1), ma la ricerca della posizione in cui effettuarlo ha costo O(n) (devo scorrerre nel caso peggiore tutta la lista). Soluzione non ottimale Violetta Lonati Heap e code di priorità AA 2009/2010 5/16
6 Struttura dati Heap Uno heap è un albero binario completo (bilanciato) dove le chiavi rispettano questa proprietà: la chiave di un nodo è sempre minore della chiave dei sui figli. per ogni nodo i : key(father(i)) key(i) Violetta Lonati Heap e code di priorità AA 2009/2010 6/16
7 Rappresentazione di uno heap Uno heap può essere rappresentato in memoria come un albero binario (nodi con puntatori ai figli destro e sinistro). Essendo però un albero completo (tutti i livelli sono riempiti tranne al più l ultimo), è comodo rappresentare uno heap semplicemente con un array. h = {IGNORE, 1, 2, 5, 10, 3, 7, 11, 15, 17, 20, 9, 15, 8, 16} Violetta Lonati Heap e code di priorità AA 2009/2010 7/16
8 Rappresentazione di uno heap - continua NB: per coerenza con le dispense e il libro riempiamo l array a partire dalla posizione 1 (lasciando inutilizzata la posizione 0). Formalmente: detto n il numero di elementi contenuti nell array, abbiamo: i 1 left(i) = 2i se 2i n i 1 right(i) = 2i + 1 se 2i + 1 n i 2 father(i) = i/2 se 2i + 1 n h = {IGNORE, 1, 2, 5, 10, 3, 7, 11, 15, 17, 20, 9, 15, 8, 16} Violetta Lonati Heap e code di priorità AA 2009/2010 8/16
9 Ricerca del minimo La ricerca del minimo è immediata: si trova nella radice! Costo O(1) Violetta Lonati Heap e code di priorità AA 2009/2010 9/16
10 Inserimento Chiamiamo h il vettore che rappresenta lo heap e sia n-1 la sua lunghezza (ovvero il numero di elementi che contiene attualmente). Se inserisco il nuovo elemento nella posizione n di h, la proprietà dello heap potrebbe non essere più valida, perchè in posizione n potrei avere una chiave troppo piccola. Aggiustiamo lo heap a partire dalla posizione n risalendo verso l alto, usando la seguente funzione ricorsiva: void heapify_ up ( Heap h, int i ) { if ( i > 1 ) { int j = father (i); if ( cmp ( key ( h[ i] ), key ( h[ j] ) ) < 0 ) { swap ( h, i, j ); heapify_ up ( h, j ); } } } Chiaramente la funzione father(i) deve restituire l elemento di h in posizione i/2. Violetta Lonati Heap e code di priorità AA 2009/ /16
11 Inserimento - esempio Violetta Lonati Heap e code di priorità AA 2009/ /16
12 Inserimento - correttezza e complessità Ad ogni esecuzione di heapify_up(i), riparo il sottoalbero di radice i e risalgo, promuovendo gli elementi di chiave più bassa. Correttezza Se parto da un albero che è quasi uno heap tranne che per il fatto che la chiave di i è troppo piccola, allora la chiamata di heapify_up(h,i) consente di ottenere uno heap corretto. Complessità O(log n): al più effettuo tanti confronti/scambi quanta è l altezza del nodo i nell albero. Violetta Lonati Heap e code di priorità AA 2009/ /16
13 Cancellazione In genere, una coda di priorità richiede di cancellare solo l elemento di chiave minima. Qui vediamo la cancellazione in generale. Sia n la lunghezza dello heap h; per cancellare l elemento di posizione i: spostiamo h(n) in h(i) e decrementiamo la lunghezza n; la proprietà dello heap non vale più, poichè in posizione i potrei avere una chiave troppo grande; 1. se key(i) < key(father(i), allora aggiusto lo heap verso l alto chiamando heapify_up(h,i) 2. se key(i) > key(left(i) oppure key(i) > key(right(i), allora aggiusto lo heap verso il basso con la funzione ricorsiva heapify_down(h,i,n). Violetta Lonati Heap e code di priorità AA 2009/ /16
14 Cancellazione void heapify_ down ( Heap h, int i, int n ) { if ( 2* i <= n ) { / i ha almeno un figlio / int j; / indice del figlio di i con chiave minore / if ( 2* i == n ) / i ha solo il figlio sinistro / j = 2* i; else / i ha due figli / j = cmp ( key ( h [2* i] ), key ( h [2* i +1] ) ) < 0? 2* i : 2* i + 1; } } if ( cmp ( key ( h[ j] ), key ( h[ i] ) ) < 0 ) { swap ( h, i, j ); heapify_down ( h, j, n ); } NB: in questo caso serve sapere quanti sono gli elementi contenuti nello heap, quindi serve l argomento n. Violetta Lonati Heap e code di priorità AA 2009/ /16
15 Cancellazione - esempio Violetta Lonati Heap e code di priorità AA 2009/ /16
16 Cancellazione - correttezza e complessità Correttezza Se parto da un albero che è quasi uno heap tranne che per il fatto che la chiave di i è troppo grande, allora la chiamata di heapify_down(h,i,n) consente di ottenere uno heap corretto. Complessità O(log n): al più effettuo tanti confronti/scambi quanto è lungo il cammino dal nodo i fino ad una foglia. Violetta Lonati Heap e code di priorità AA 2009/ /16
Algoritmi e Strutture Dati
Heap Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 Heap Heap binari: definizione Un heap binario è una struttura dati composta
Alberi binari e alberi binari di ricerca
Alberi binari e alberi binari di ricerca Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica
ADT Coda con priorità
Code con priorità ADT Coda con priorità Una coda con priorità è una struttura dati dinamica che permette di gestire una collezione di dati con chiave numerica. Una coda con priorità offre le operazioni
Heap Ordinamento e code di priorità. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 9
Heap Ordinamento e code di priorità Heap: definizione Definizione. Uno Heap (binario) è un albero binario finito i cui vertici sono etichettati da elementi di un insieme linearmente ordinato (chiavi),
Problemi di ordinamento
Problemi di ordinamento Input: una sequenza di n numeri a 1, a 2,..., a n ; Output: una permutazione a 1, a 2,..., a n di a 1, a 2,..., a n tale che a 1 a 2... a n. Generalmente, la sequenza è rappresentata
Un heap binario è un albero binario con le seguenti caratteristiche:
Heap Un heap binario è un albero binario con le seguenti caratteristiche: È quasi completo: tutti i livelli, tranna al più l ultimo sono completi e le foglie dell ultimo livello sono tutte adossate a sinistra.
Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione
Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ Heap e Heapsort Algoritmi di ordinamento Insertion Sort Quicksort Heapsort Insertion Sort L
Alberi ed Alberi Binari
Alberi ed Alberi Binari Il tipo di dato Albero Un albero è una struttura di data organizzata gerarchicamente. È costituito da un insieme di nodi collegati tra di loro: ogni nodo contiene dell informazione,
In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114
In questa lezione Heapsort ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 11 1 Paternità L heapsort è stato pubblicato da J. W. J. Williams nel 106. Pochi mesi
Alberi binari di ricerca
Alberi binari di ricerca Definizione Un albero si dice albero binario di ricerca è un albero binario in cui: - Ogni nodo è caratterizzato un valore chiamato chiave - L insieme delle chiavi è totalmente
Laboratorio di Algoritmi e Strutture Dati. Code con Priorità
Laboratorio di Algoritmi e Strutture Dati Code con Priorità Teresa M.A. Basile [email protected] Dipartimento di Informatica Università degli Studi di Bari Aldo Moro Materiale di base gentilmente concesso
Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.
Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni. Algoritmi e Strutture Dati + Lab A.A. 14/15 Informatica Università degli Studi di Bari Aldo Moro Nicola Di Mauro
Esercitazione 6. Alberi binari di ricerca
Esercitazione 6 Alberi binari di ricerca Struttura base Rappresentabile attraverso una struttura dati concatenata in cui ogni nodo è un oggetto di tipo struttura Ogni nodo contiene: campo chiave (key)
Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1
Algoritmi (9 CFU) (A.A. 2009-10) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1 Overview Definiamo la struttura dati heap Operazioni di costruzione e gestione di un heap Algoritmo Heapsort Code
Alberi e alberi binari I Un albero è un caso particolare di grafo
Alberi e alberi binari Un albero è un caso particolare di grafo È costituito da un insieme di nodi collegati tra di loro mediante archi Gli archi sono orientati (ogni arco esce da un nodo origine ed entra
Algoritmi di ordinamento: Array e ricorsione
Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Algoritmi di ordinamento: Array e ricorsione 2 1 Insertion Sort Quicksort Heapsort Indice
LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve
LE STRUTTURE DATI DINAMICHE: GLI ALBERI Cosimo Laneve 1 argomenti 1. definizione di alberi e nozioni relative 2. implementazione degli alberi, creazione, visita 3. algoritmo di visita iterativa e sua implementazione
Algoritmi e Strutture Dati
Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 Il concetto di dato Il concetto di tipo di dato Insertion Sort for j 2 to lenght[a]
Algoritmi e Strutture Dati. HeapSort
Algoritmi e Strutture Dati HeapSort Selection Sort: intuizioni L algoritmo Selection-Sort scandisce tutti gli elementi dell array a partire dall ultimo elemento fino all inizio e ad ogni iterazione: Viene
Esercitazione 3. Heapsort
Esercitazione Heapsort Heapsort Algoritmo di ordinamento che utilizza una struttura dati detta heap per la gestione delle informazioni Tempo di esecuzione O(n lg n) Heap (binario) = struttura dati composta
In questa lezione Alberi binari di ricerca: la cancellazione
In questa leione Alberi binari di ricerca: la cancellaione 1 L algoritmo di Hibbard per cancellare (1962) Sia il nodo da cancellare: 1) è una foglia: si rimuove 2) ha un solo figlio x: si rende x figlio
Alberi binari di ricerca
Alberi binari di ricerca Ilaria Castelli [email protected] Università degli Studi di Siena Dipartimento di Ingegneria dell Informazione A.A. 2009/20010 I. Castelli Alberi binari di ricerca, A.A. 2009/20010
Alberi Binari di Ricerca
Alberi Binari di Ricerca Prof. G. M. Farinella [email protected] www.dmi.unict.it/farinella Riferimenti Bibliografici Cormen T.H., Leiserson C.E., Rivest R.L Introduction to Algorithms, Third Edition,
Esercizi su alberi binari
Esercizi su alberi binari Esercizi svolti: Determinazione nodi contenti verifica completezza verifica quasi completezza lunghezza del cammino interno determinazione ultima foglia in un quasi completo verifica
Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione
Alberi Strutture dati: Alberi Strutture gerarchiche di dati Esempi Il file system di un sistema operativo L organigramma di un azienda Alberi generali, alberi n-ari, alberi binari, Ogni nodo ha un unico
Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)
Albero binario 2 Alberi binari (introduzione) Struttura di dati bidimensionale formata da nodi costituiti ciascuno dai dati da memorizzare e da due link Ver. 2.4 20 - Claudio Fornaro - Corso di programmazione
Alberi Binari di Ricerca
Alberi Binari di Ricerca Algoritmi su gli alberi binari: visite Dato un puntatore alla radice di un albero vogliamo scandire in modo sistematico tutti i nodi di tale albero In una lista abbiamo una unica
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati Capitolo 8 Code con priorità: Heap binomiali Riepilogo Array non ord. Array ordinato Lista non ordinata Lista ordinata Find Min Insert Delete DelMin Incr. Key Decr. Key merge
Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.
Esercizio 1 E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1 livello 0 FB = -1 FB = -1 livello 1 FB = -1 livello 2 livello 3 L altezza è 3, il minimo si trova nel
Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 12 Array e Oggetti A. Miola Dicembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Array e Oggetti 1 Contenuti Array paralleli
Problem Set 2 docente: Luciano Gualà
Problem Set 2 docente: Luciano Gualà Esercizio 1 (equazioni di ricorrenza) Si risolvano le seguenti equazioni di ricorrenza. Si assuma sempre T (costante) = O(1). (a) T (n) = T (n 10) + 10. (b) T (n) =
Dati e Algoritmi I (Pietracaprina) Esercizi su Priority Queue e Heap
Dati e Algoritmi I (Pietracaprina) Esercizi su Priority Queue e Heap g Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1 Si definisca un albero ternario completo di altezza h come un albero con
