Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Documenti analoghi
Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Esercitazione 3. Heapsort

heap heap heap? max- e min-heap concetti ed applicazioni heap = catasta condizione di heap non è una struttura ordinata

Heap e code di priorità

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Alberi ed Alberi Binari

Problemi di ordinamento

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

lezione 9 min-heap binario Heap e Alberi posizionali generali

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Heap, heapsort e code a priorità. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

Algoritmi e Strutture Dati Laboratorio 15/12/2008. Daniele Loiacono

Pile Le pile: specifiche e realizzazioni attraverso rappresentazioni sequenziali e collegate. Pile e procedure ricorsive

Alberi e alberi binari I Un albero è un caso particolare di grafo

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Implementazione ADT: Alberi

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

Laboratorio di Algoritmi e Strutture Dati

Esercizi su strutture dati

Tipi di dato e Strutture dati elementari

Alberi binari e alberi binari di ricerca

Alberi binari di ricerca

In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114

Algoritmi e strutture dati

Università degli Studi di L Aquila Facoltà di Scienze M.F.N. Corso di Laurea in Informatica. Modulo di Laboratorio di Algoritmi e Strutture Dati

Insiemi Specifiche, rappresentazione e confronto tra realizzazioni alternative.

Esercitazione 6. Alberi binari di ricerca

La programmazione nel linguaggio C

Algoritmi di ordinamento: Array e ricorsione

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Heap scenario. Ho un insieme dinamico di oggetti, ciascuno identificato con una priorità. (la priorità è semplicemente un numero);

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Lezione 7 Alberi binari: visite e alberi di ricerca

ADT Coda con priorità

Inserimento di un elemento in coda. quale va collegato quello nuovo. ultimo. *lista 8 3. aux. ultimo. *lista 8 3. aux

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi e Strutture Dati. HeapSort

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Algoritmi di ordinamento: Array e ricorsione

Struttura dati astratta Coda

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

ALGORITMI E STRUTTURE DATI

In questa lezione Alberi binari di ricerca: la cancellazione

Heap Ordinamento e code di priorità. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 9

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1

Corso di Fondamenti di Informatica

Algoritmi di Ricerca. Esempi di programmi Java

Ordinamento per inserzione e per fusione

Fondamenti di Informatica T-1 Modulo 2

Strutture dati dinamiche in C (II)

Implementazione dell albero binario in linguaggio C++

Le liste. ADT e strutture dati per la rappresentazione di sequenze. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 5

Algoritmi di Ricerca. Esempi di programmi Java

Fondamenti di Informatica II

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Lezione 12 Tabelle Hash

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

Introduzione alla gestione delle collezioni di oggetti

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Algoritmi di ordinamento

T 1 =1. n 6 n. T n =3 T. Esercizio 1 (6 punti)

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Grafi pesati Minimo albero ricoprente

5. Quinta esercitazione autoguidata: liste semplici

Laboratorio di Algoritmi e Strutture Dati. Dizionari

23/10/2016. gli alberi. alcune definizioni. un esempio. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica.

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Esercizi Capitolo 6 - Alberi binari di ricerca

Strutture dati. Le liste

PILE E CODE. Pile (stack):

PROVETTE D ESAME. Algoritmi e Strutture Dati

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

Informatica 1. Prova di recupero 21 Settembre 2001

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Esercizi per il corso di Algoritmi

Per semplicità eliminiamo le ripetizioni nell'albero.

Strutture Dinamiche. Fondamenti di Informatica

Fondamenti di Informatica

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO

in più stringhe,... ADT un tipo è caratterizzato dalle operazioni consentite su di esso: un numero è qualcosa che si può moltiplicare, sommare,...

Note per la Lezione 4 Ugo Vaccaro

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Algoritmi e Strutture Dati

ALBERI : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

INDICI PER FILE. Accesso secondario. Strutture ausiliarie di accesso

T 1 =1. n 4 n log n. T n =3 T. Esercizio 1 (6 punti) A.A Esame di Algoritmi e strutture dati 18 luglio 2008

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

Alberi Binario in Java

Algoritmi di ordinamento e ricerca. Classe SelSort.java

1) definizione di una rappresentazione 2) specificazione di un algoritmo (dipendente dalla rappresentazione) 3) traduzione in un linguaggio

Transcript:

Laboratorio di Algoritmi e Strutture Dati Code con Priorità Teresa M.A. Basile basile@di.uniba.it Dipartimento di Informatica Università degli Studi di Bari Aldo Moro Materiale di base gentilmente concesso dal dott. Nicola Di Mauro 1

Sintesi Modulo Teoria Code con Priorità: Specifica Sintattica e Semantica Rappresentazione con strutture sequenziali Liste ordinate liste non ordinate - array Rappresentazione con alberi binari collegata, eventualmente con puntatori figli-gentore tramite array (heap), particolarmente efficiente 2

IL TIPO ASTRATTO CODA CON PRIORITA PUO ESSERE CONSIDERATA UN CASO PARTICOLARE DI INSIEME CHE PERMETTE DI MANTENERE IL MINIMO IN UN INSIEME DI ELEMENTI (O CHIAVI) SUI QUALI E DEFINITA UNA RELAZIONE < DI ORDINAMENTO TOTALE. SPECIFICA SINTATTICA TIPI: PRIORICODA,TIPOELEM, BOOLEAN OPERATORI: CREAPRIORICODA: ( ) PRIORICODA PRIORICODAVUOTA: (PRIORICODA) BOOLEAN INSERISCI: ( TIPOELEM, PRIORICODA ) PRIORICODA MIN: ( PRIORICODA ) TIPOELEM CANCELLAMIN: ( PRIORICODA ) PRIORICODA 3

SPECIFICA SEMANTICA TIPI: PRIORICODA: INSIEME DI CODE CON PRIORITA CON ELEMENTI DI TIPO TIPOELEM OPERATORI: CREAPRIORICODA = A POST: A = PRIORICODAVUOTA(A) = b POST: True SE A =, False ALTRIMENTI INSERISCI (x,a) = A POST: A = A {x (se x A allora A=A ) MIN(A) = x PRE: A!= POST: x A e x <= y per ogni y A CANCELLAMIN (A) = A PRE: A!= POST: A = A { x con x = MIN(A) 4

Rappresentazione con alberi binari MIN: si legge l elemento contenuto nella radice dell albero CANCELLAMIN: 1. si cancella la foglia di livello massimo più a destra 2. si copia l elemento x in essa contenuto nella radice 3. si confronta x con gli elementi y, z contenuti nei figli 4. se x > y o x > z, si scambia x con il minimo dei figli e si ripete l operazione finché possibile (al massimo x raggiunge un nodo foglia) INSERISCI: 1. si aggiunge una foglia con il nuovo elemento x al livello massimo più a sinistra (immediatamente a destra dell ultima foglia) 2. si confronta x con il valore y contenuto nel padre, 3. se x < y si effettua uno scambia finché possibile (al massimo x raggiunge la radice) 5

Heap Uno heap è un insieme di nodi con chiave posti in un albero binario completo heap-ordinato e rappresentato tramite array Accessi: Il padre di un nodo in posizione i si trova in posizione [i/2], mentre i due figli di un nodo in posizione i si trovano nelle posizioni 2i e 2i+1 Code con priorità implementate attraverso heap ripristino dello heap quando un nuovo nodo è inserito in fondo allo heap percorrere lo heap verso l'alto per ripristinare i vincoli sostituiamo il nodo radice con un nuovo nodo percorrere lo heap verso il basso per ripristinare i vincoli

Coda con priorità basata su heap #ifndef _CODAP_H_ #define _CODAP_H_ #include "assert.h" template < class T > class CodaP { public: typedef T _tipoelem; CodaP(); CodaP(int); ~CodaP(); void creaprioricoda(); void inserisci(_tipoelem); _tipoelem min(); void cancellamin(); private: int MAXLUNG; _tipoelem *heap; int ultimo; void fixup(); // per ripristinare i vincoli in salita - inserimento void fixdown(int, int); // per ripristinare i vincoli in discesa - cancellazione

Coda con priorità basata su heap template < class T > CodaP < T >::CodaP ():MAXLUNG (100) { heap = new _tipoelem[maxlung]; creaprioricoda (); template < class T > CodaP < T >::CodaP (int maxn): MAXLUNG (MaxN) { heap = new _tipoelem[maxlung]; creaprioricoda (); template < class T > CodaP < T >::~CodaP () { delete[] heap; template < class T > void CodaP < T >::creaprioricoda () { ultimo = 0;

Coda con priorità basata su heap template < class T > void CodaP < T >::inserisci (_tipoelem e) { assert (ultimo < MAXLUNG); heap[++ultimo - 1] = e; //inserisco l'elemento fixup (); // aggiusto-salgo template < class T > typename CodaP < T >::_tipoelem CodaP < T >::min () { assert (ultimo!= 0); return (heap[0]); template < class T > void CodaP < T >::cancellamin () { assert (ultimo!= 0); heap[0] = heap[ultimo 1]; //sovrascrivo la radice ultimo--; // decremento il valore dell'ultimo fixdown (1,ultimo); //aggiusto-scendo

Coda con priorità basata su heap Costruzione bottom-up di uno heap: per ripristinare i vincoli dello heap quando la priorità di un nodo è cresciuta, ci spostiamo nello heap verso l'alto, scambiando, se necessario, il nodo in posizione k con il suo nodo padre (in posizione k/2), continuando fintanto che a[k/2] < a[k] oppure fino a quando raggiungiamo la cima dello heap template < class T > void CodaP < T >::fixup () { int k = ultimo; while (k > 1 && heap[k - 1] < heap[k / 2 1]) { _tipoelem tmp; tmp = heap[k 1]; heap[k - 1] = heap[k / 2-1]; heap[k / 2-1] = tmp; k = k / 2; // partendo dall'ultima foglia // k/2 è il nodo padre di k // scambio // passo al padre di k

Coda con priorità basata su heap Costruzione top-down di uno heap: per ripristinare i vincoli dello heap quando la priorità di un nodo si è ridotta, ci spostiamo nello heap verso il basso, scambiando, se necessario, il nodo in posizione k con il maggiore dei suoi nodi figli e arrestandoci quando il nodo al posto k non è più piccolo di almeno uno dei suoi figli oppure quando raggiungiamo il fondo dello heap template < class T > void CodaP < T >::fixdown (int k, int N) { short int scambio = 1; while (k <= N / 2 && scambio) { // se esiste un figlio di k int j = 2 * k; // j è il figlio sinistro di k _tipoelem tmp; if (j < N && heap[j - 1] > heap[j]) j++; // se il figlio dx è minore del // figlio sx, passa al figlio dx if (scambio = (heap[j - 1] < heap[k 1])) { // controlla se scambiare tmp = heap[k 1]; // scambio heap[k - 1] = heap[j - 1]; heap[j - 1] = tmp; k = j; // passo al figlio selezionato #endif _CODAPO_H_ codap.h

Ordinamento tramite coda con priorità L'impiego più comune di uno heap permette di abbassare drasticamente la complessità dell'algoritmo di ordinamento di un vettore basato sull'iterata della ricerca del minimo. Ordinamento. Si supponga che la sequenza di n elementi da ordinare sia memorizzata nel vettore A. E' possibile ordinare gli elementi di A utilizzando una coda con priorità C, nella quale sono dapprima inseriti in sequenza tutti gli elementi, e dalla quale sono poi estratti, sempre in sequenza, gli elementi minimi. include codap.h /* ordina il sotto-array A[l],..., A[r] di A, tramite un ADT coda con priorità */ template < class Tipoelem> void CodaPSort(Tipoelem A[], int l, int r) { int k; CodaP<Tipoelem> cp(r-l+1); for (k = l; k <= r; k++) cp.inserisci(a[k]); for (k = r; k >= l; k--){ A[k] = cp.min(); cp.cancellamin();

Heapsort Se la coda con priorità è realizzata con uno heap, la complessità della procedura CodaPSort è O(nlogn). Benchè la procedura abbia complessità ottima se si usa uno heap, essa presenta lo svantaggio di richiedere un doppio trasferimento di elementi dal vettore A allo heap e dallo heap di nuovo al vettore A, con conseguente spreco di memoria. E' possibile però effettuare l'ordinamento in loco, cioè direttamente nel vettore A senza un secondo vettore di appoggio, dopo aver ristrutturato A stesso in modo che verifichi la proprietà di uno heap.

Heapsort in C++ Usando fixdown direttamente, si ottiene il classico algoritmo di ordinamento Heapsort. Il ciclo for costruisce lo heap, il ciclo while scambia l'elemento più grande con quello finale nell'array e riaggiusta lo heap, continuando fino a che lo heap non si svuota. Il puntatore cp ad A[l-1] consente al codice di trattare il sottoarray a esso passato come un array il cui primo elemento ha indice 1 nella rappresentazione tramite array dell'albero completo.

Heapsort in C++ L algoritmo HEAPSORT è organizzato nel seguente modo: 1. riorganizza il vettore di input A come un MAX-heap senza usare vettori di appoggio (restaurazione in loco) 2. per ogni (n 1 >= i >= 1) (a) scambia l elemento A[0], cioè MAX(A[0.. i]), con l elemento A[i] (b) riorganizza la porzione di vettore A[0... i-1] come un MAX-heap Alla fine dell algoritmo il contenuto del vettore A è ordinato in modo crescente. Dobbiamo implementare una nuova versione della funzione fixdown in modo che possa avere in input l'array, senza operare sullo heap di una CodaP. Cambiamo il prototipo in template <class T> void fixdown(t A[], int k, int N) Resta da cambiare heap con A nella realizzazione. template < class Tipoelem>void HeapSort(Tipoelem A[], int l, int r) { int k, N = r-l+1; Tipoelem *cp = A+l-1, tmp; for (k = N/2; k >= 1; k--) // punto 1 fixdown(cp, k, N); while (N > 1){ // punto 2 tmp = cp[1]; cp[1] = cp[n]; cp[n] = tmp; //2(a) fixdown(cp, 1, --N); //2(b)