Esercitazione 3. Heapsort

Documenti analoghi
Problemi di ordinamento

Algoritmi e Strutture Dati

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

ADT Coda con priorità

Algoritmi e Strutture Dati. HeapSort

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

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

lezione 9 min-heap binario Heap e Alberi posizionali generali

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

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

Algoritmi di ordinamento: Array e ricorsione

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

Heap e code di priorità

Esercizi su alberi binari

Esercitazione 6. Alberi binari di ricerca

In questa lezione Alberi binari di ricerca: la cancellazione

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Algoritmi e Strutture Dati

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

PROVETTE D ESAME. Algoritmi e Strutture Dati

Laboratorio di architettura degli elaboratori Progetto finale AA 2005/2006

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Lezione 12 Tabelle Hash

Un albero completamente bilanciato o pieno (full) alberi completamente sbilanciati. Un albero binario completo

Alberi binari e alberi binari di ricerca

Implementazione ADT: Alberi

Alberi Binari di Ricerca

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Lezione 7 Alberi binari: visite e alberi di ricerca

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

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

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

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

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

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.

INDICI PER FILE. Accesso secondario. Strutture ausiliarie di accesso

Alberto Montresor Università di Trento

Per semplicità eliminiamo le ripetizioni nell'albero.

Lezione 9 Alberi binari di ricerca

Algoritmi e Strutture Dati

Espressioni aritmetiche

Alberi ed Alberi Binari

Note per la Lezione 4 Ugo Vaccaro

Esercizi Capitolo 6 - Alberi binari di ricerca

Verificare se un albero binario è bilanciato

Corso di Fondamenti di Informatica

Esercizi per il corso di Algoritmi

Capitolo 3: Gli alberi. Alberi n-ari

Esercizi su strutture dati

La codifica di sorgente

Laboratorio 8. Programmazione - CdS Matematica. Mirko Polato 15 Dicembre 2015

Generazione di una mesh rettangolare

Implementazione dell albero binario in linguaggio C++

Laboratorio di Python

Esempio : i numeri di Fibonacci

Tempo e spazio di calcolo (continua)

Laboratorio di Python

Esercitazioni di Algoritmi e Strutture Dati

Alberi binari di ricerca

Esercizi su BST. IASD a.a A. De Bonis

Alberi Binari di Ricerca

Transcript:

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 da un array che possiamo considerare un albero binario quasi completo Ogni nodo dell'albero corrisponde ad un elemento dell'array che memorizza il valore del nodo

Heap 9 0 6 0 7 9 Tutti i livelli dell'albero sono riempiti tranne l'ultimo, che può essere riempito solo nella parte sinistra Array A Radice dell'albero: A[] 6 7 9 0 9 0

Proprietà dell'heap Se i è l'indice di un nodo, gli indici di padre, figlio destro e sinistro possono essere facilmente calcolati: Parent(i) { return i/ ; } Left(i) { return i; } Right(i) { return i+; } Funzioni da usare per muoversi all'interno della struttura ad albero! Due tipi di heap binari: max-heap e min-heap: Proprietà max-heap: A[Parent(i)] >= A[i] Proprietà min-heap: A[Parent(i)] <= A[i] per ogni nodo diverso dalla radice A[]

Algoritmo di ordinamento Ordiniamo un array di interi di lunghezza n con l'algoritmo heapsort Ordinamento in senso non decrescente utilizziamo i max-heap Subroutine utilizzate: Max-heapify per la conservazione (ripristino) delle proprietà dei max-heap Build-max-heap per generare un maxheap da un array di input non ordinato

Max-Heapify Input Ipotesi Array A e indice i nell'array Gli alberi binari con radici in Left(i) e Right(i) siano max-heap A[i] può essere più piccolo dei suoi figli, violando quindi la proprietà del max-heap Obiettivo Ripristinare la proprietà del max-heap

Max-Heapify Esempio: Max-Heapify(A,) 6 0 7 9 9 0

Max-Heapify Esempio: Max-Heapify(A,) 6 0 7 9 9 0

Max-Heapify Esempio: Max-Heapify(A,9) 6 0 7 9 9 0

Algoritmo Max-Heapify Max-Heapify(A,i) Controllo sul valore di A[i], Left[i] e Right[i] Se A[i] è il maggiore la proprietà è già soddisfatta termine dell'algoritmo Altrimenti, A[i] viene scambiato col massimo tra Left[i] e Right[i] A[i], Left[i] e Right[i] soddisfano la proprietà, ma ciò non è assicurato per il sottoalbero che ha per radice il nodo con cui ho effettuato lo scambio chiamata ricorsiva a Max-Heapify

Costruire un heap Come costruire un heap partendo da un array A di input? 9 0 6 6 9 0 7 L'albero corrispondente all'array non è un max-heap 9 0 7 6 9 0

Build-Max-Heap Algoritmo Build-Max-Heap Utilizzo della procedura Max-Heapify dal basso verso l'alto per costruire un maxheap I nodi con indice [( n/ + ),..., n] sono foglie dell'albero Tutti i restanti nodi sono radici di potenziali max-heap su cui chiamare la procedura Max-Heapify

Build-Max-Heap Esempio: Build-Max-Heap(A) i 6 9 0 9 0 7 Prima chiamata a Max-Heapify(A,i) sull'elemento i= n/

Build-Max-Heap Build-Max-Heap(A) Max-Heapify(A,i) i 6 9 0 9 0 7

Build-Max-Heap Build-Max-Heap(A) Max-Heapify(A,i) i 6 9 0 9 0 7

Build-Max-Heap Build-Max-Heap(A) Max-Heapify(A,i) i 0 6 9 9 0 7

Build-Max-Heap Build-Max-Heap(A) Max-Heapify(A,i) 6 i 0 7 9 9 0

Build-Max-Heap Risultato finale: costruito un max-heap a partire dall'array di input A 6 0 7 9 9 0

Programma build-max-heap.cc Procedura Build-Max-Heap: Costruisce un max-heap da un array di input di n elementi Si noti la necessità di usare correttamente la selezione con indice per muoversi all'interno del'heap (la struttura dati è sempre un array!) Attenzione all'uso degli indici Suggerimento: mantenere separatamente l'informazione sulla lunghezza dell'heap Usare la posizione 0 dell'array Usare una variabile (globale)

Ordinamento Algoritmo di ordinamento Heapsort: ordinamento non decrescente Chiamata iniziale a Build-Max-Heap per costruire un max-heap dall'array di input di n elementi da ordinare Alla fine l'elemento più grande è memorizzato nella radice A[] può essere inserito nella posizione finale corretta scambiandolo con A[n]

Heapsort Azione di Heapsort sulla struttura max-heap: scambio A[] con A[0]... 6 0 7 9 9 0

Heapsort e stacco l'elemento A[0] Ora A può essere facilmente trasformato in un max-heap: solo la radice A[] potrebbe violarne le proprietà chiamata a Maxheapify(A,) 0 7 9 9 0 6

Heapsort A è di nuovo un max-heap (di dimensione n-) Ora ripeto il procedimento... 0 7 9 9 6

Heapsort Max-heap di dimensione n-... 0 9 7 6

Heapsort Max-heap di dimensione n-... 9 7 0 6

Heapsort... infine: 7 9 0 6

Programma hs.cc Programma di ordinamento che utilizza l'algoritmo heapsort NOTA: Utilizza la posizione 0 dell'array per memorizzare la lunghezza dell'heap

Estensione opzionale hs_optio.cc La parte opzionale viene realizzata attraverso le direttive al preprocessore #define, #ifdef, #else, #endif Effettua la lettura degli elementi da ordinare da file (nome del file passato al programma da riga di comando). Scrive gli elementi già ordinati su un file "outfile"