Algoritmi e Strutture Dati. HeapSort

Documenti analoghi
Algoritmi e Strutture Dati. HeapSort

Code a priorità Una coda a priorità è una struttura dati astratta che permette di rappresentare un insieme di elementi su cui è definita una

Spesso sono definite anche le seguenti operazioni:

Problemi di ordinamento

ADT Coda con priorità

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

Esercitazione 3. Heapsort

Dato un insieme S di n elementi totalmente ordinato, l'algoritmo di ordinamento detto HeapSort ha le seguenti caratteristiche:

In questa lezione. Costruire un max-heap. [CLRS01] cap. 6 par Prof. E. Fachini - Intr. Alg.

Albero binario: Ogni nodo ha zero, uno, o due successori (ordinati)

Gli heap. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Algoritmi e Strutture Dati

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

ALGORITMI E STRUTTURE DATI

Alberi binari (radicati e ordinati) della radice Il padre del nodo 5 e del nodo 3

Algoritmi e Strutture Dati

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

Alberi binari: definizione e alcune proprietà

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

Esercizi su ABR. Prof. E. Fachini - Intr. Alg.!1

Algoritmi e Strutture Dati

In questa lezione. Heap binario heapsort. [CLRS10] cap. 6, par Prof. E. Fachini - Intr. Alg.

Un heap binario è un albero binario con le seguenti caratteristiche:

Alberi ed Alberi Binari

Introduzione agli algoritmi Prova di esame del 19/9/2016 Prof.sse E. Fachini - R. Petreschi. Parte prima

Algoritmi e Strutture di Dati

Esercizi su alberi binari

Algoritmi e Strutture Dati

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

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

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

In questa lezione. Code di priorità. [CLRS01] cap. 6 da pag. 114 a pag Prof. E. Fachini - Intr. Alg. lunedì 17 settembre 2012

Algoritmi di ordinamento: Array e ricorsione

Alberi binari. Alberi Albero binario Heap tree

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

Algoritmi e Strutture Dati

Informatica 3. LEZIONE 16: Heap - Codifica di Huffmann. Modulo 1: Heap e code di priorità Modulo 2: Esempio applicativo: codifica di Huffmann

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

heap concetti ed applicazioni

Moltiplicazione veloce di interi

Alberi Binari di Ricerca

alberi completamente sbilanciati

Algoritmi e Strutture Dati

Heap e Code di Priorità

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

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

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

Note per la Lezione 4 Ugo Vaccaro

Laboratorio di Python

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

Algoritmi e Strutture Dati. Lezione 4

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

Richiami di matematica discreta: grafi e alberi. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

Esempi. Albero di interi. Struttura che non è un albero!

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

In questa lezione. Alberi binari: [CLRS09] cap. 12 per la visita inorder. visite e esercizi su alberi binari. Prof. E. Fachini - Intr. Alg.

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

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Gli ordini di visita di un albero binario di 9 nodi sono i seguenti: A, E, B, F, G, C, D, I, H (anticipato)

In questa lezione Alberi binari di ricerca: la cancellazione

Alberi binari e alberi binari di ricerca

Divide et impera su alberi

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.

Complementi di Algoritmi e Strutture Dati. Soluzioni prova scritta 7 giugno 2017

Alberi binari e alberi binari di ricerca

Alberi binari e alberi binari di ricerca

Corso di Programmazione

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

Per semplicità eliminiamo le ripetizioni nell'albero.

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

Algoritmi e strutture dati

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

QuickSort Università degli Studi di Milano

Heap e code di priorità

d. Cancellazione del valore 5 e. Inserimento del valore 1

Visualizzazione di dati

Algoritmi e Strutture Dati

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

Selection Sort (minsort)

Heap binomiali. Oltre alle precedenti operazioni fondamentali degli heap riunibili, sugli heap binomiali definiremo anche le due ulteriori operazioni:

Algoritmi e Strutture Dati

Strutture dati per insiemi disgiunti

Alberi Binari di Ricerca

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen

Alberto Montresor Università di Trento

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

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

Dati e Algoritmi 1: A. Pietracaprina. Alberi Binari

ALGORITMI CORSO DI STUDIO IN INFORMATICA (laurea triennale) UNIVERSITÀ DEGLI STUDI DI CATANIA ANNO ACCADEMICO 2014/15

Algoritmi e Strutture Dati Laboratorio 20/10/2008. Prof. Pier Luca Lanzi

Transcript:

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 cercato l elemento massimo nella parte di array che precede l elemento corrente l elemento massimo viene scambiato con l elemento corrente max i 1 disordinati ordinati n

Select Sort Selection-Sort(A) FOR i = length[a] DOWNTO 2 DO max = Findmax(A,i) scambia A[max] e A[i] Findmax(A,x) max = 1 FOR i = 2 to x DO IF A[max] < A[i] THEN max = i return max

Heap Sort L algoritmo Heap-Sort: è una variazione di Selection-sort in cui la ricerca dell elemento massimo è facilitata dall utilizzo di una opportuna struttura dati la struttura dati è chiamata heap lo heap è una variante della struttura dati albero binario in uno heap si può accedere all elemento massimo in tempo costante si può ricostruire la struttura heap in tempo sublineare.

Alberi binari Un albero binario è una struttura dati astratta definita come un insieme finito di nodi che è vuoto oppure è composto da tre insiemi disgiunti di nodi: un nodo radice un albero binario detto sottoalbero sinistro un albero binario detto sottoalbero destro

Alberi binari nodo radice sottoalbero destro sottoalbero sinistro

Alberi binari nodo radice Radice del sottoalbero sinistro sottoalbero destro sottoalbero sinistro sottoalbero destro

Alberi binari nodo radice Radice del sottoalbero sinistro Radice del sottoalbero destro sottoalbero sinistro sottoalbero destro sottoalbero sinistro sottoalbero destro

Alberi binari nodo radice sottoalbero sinistro sottoalbero destro

Alberi binari padre dei nodi j e k nodo i nodo radice arco dal nodo i al nodo k nodo j nodo k figli del nodo i

Alberi binari In nodo di un albero binario si dice nodo foglia (o solo foglia) se non ha figli (cioè se entrambi i sottoalberi di cui è radice sono vuoti) Un nodo si dice nodo interno se ha almeno un figlio Un percorso dal nodo i al nodo j è la sequenza di archi che devono essere attraversati per raggiungere il nodo j dal nodo i

Alberi binari nodo radice nodi interni nodi foglia nodo k percorso dalla radice al nodo k

Alberi binari In un albero binario la profondità di un nodo è la lunghezza del percorso dalla radice al nodo (cioè il numero di archi tra la radice e il nodo) La profondità massima di un nodo all interno di un albero è l altezza dell albero. Il grado di un nodo è il numero di figli di quel nodo.

Alberi binari nodo radice Profondità 0 Profondità 1 Profondità 2 Profondità 3

Alberi binari nodo radice Profondità 0 Profondità 1 Profondità 2 Profondità 3 Altezza 3

Alberi binari nodo radice Profondità 0 Profondità 1 Grado 2 Profondità 2 Grado 1 Profondità 3 Altezza 3

Albero binaro pieno Un albero binario si dice pieno se ❶ tutte le foglie hanno la stessa profondità h ❷ tutti i nodi interni hanno grado 2 Un albero pieno con n nodi ha altezza esattamente ºlog 2 nß. Un albero pieno di altezza h ha esattamente 2 h+1-1 nodi.

Albero binaro pieno 1 n=2 h+1-1=2 4-1=15 2 3 4 5 6 7 8 9 10 11 12 13 14 15 n = 15 e altezza h = ºlog 2 nß = 3

Albero binaro completo Un albero binario si dice completo se tutte le foglie hanno profondità h o h-1, dove h è l altezza dell albero tutti i nodi interni hanno grado 2, eccetto al più uno.

Albero binaro completo nodo con un solo figlio profondità 0 profondità h-1 profondità h nodi foglia

Proprietà di uno Heap Un Albero Heap è un albero binario tale che per ogni nodo i: tutte le foglie hanno profondità h o h-1, dove h è l altezza dell albero; tutti i nodi interni hanno grado 2, eccetto al più uno; entrambi i nodi j e k figli di i sono NON maggiori di i. Condizioni 1 e 2 definiscono la forma dell albero

Proprietà di uno Heap Un Albero Heap è un albero binario tale che per ogni nodo i: tutte le foglie hanno profondità h o h-1, dove h è l altezza dell albero; tutti i nodi interni hanno grado 2, eccetto al più uno; entrambi i nodi j e k figli di i sono NON maggiori di i. Condizione 3 definisce l etichettatura dell albero

Proprietà di uno Heap Un Albero Heap è un albero binario completo tale che per ogni nodo i: entrambi i nodi j e k figli di i sono NON maggiori di i.

Heap 34 45 1 28 2 3 30 25 14 21 15 16 20 22 4 5 6 7 8 9 10 11 12 12 Heap NON impone alcuna relazione di ordinamento tra I figli di un nodo

Heap e Ordinamenti Parziali Un Albero Heap è un albero binario completo tale che per ogni nodo i: entrambi i nodi j e k figli di i sono NON maggiori di i. Uno Heap rappresenta un Ordiamento Parziale

Heap e Ordinamenti Parziali Un Ordinamento Parziale è una relazione tra elementi di un insieme che è: Riflessiva: x è in relazione con se stesso Anti-simmetrica: se x è in relazione con y e y è in relazione con x allora x=y Transitiva: se x è in relazione con y e y è in relazione con z allora x è in relazione con z Esempi: le relazioni e le relazioni >, < NON sono ordinamenti parziali

Heap e Ordinamenti Parziali Gli Ordinamenti Parziali possono essere usati per modellare, ad esempio, gerarchie con informazione incompleta o elementi con uguali valori. L ordinamento parziale definito da uno Heap è una nozione più debole di un ordinamento totale, infatti uno Heap è più semplice da costruire è molto utile ma meno dell ordinamento totale

Implementazione di uno Heap Uno Heap può essere implementato in vari modi: come un albero a puntatori come un array.

Heap: da albero ad array 34 45 1 28 2 3 30 25 22 4 5 6 7 12 14 21 15 16 20 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Heap: da albero ad array Uno Heap può essere implementato come un array A in cui: la radice dello Heap sta nella posizione A[0] dell array se il nodo i dello Heap sta nella posizione i dell array (cioè A[i]), il figlio sinistro di i sta nella posizione 2i il figlio destro di i sta nella posizione 2i+1 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Heap: da albero ad array 34 45 1 28 2 3 30 25 22 4 5 6 7 12 14 21 15 16 20 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Heap: da albero ad array 34 45 1 28 2 3 30 25 22 4 5 6 7 12 14 21 15 16 20 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Heap: da albero ad array 34 45 1 28 2 3 30 25 22 4 5 6 7 12 14 21 15 16 20 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Heap: da albero ad array 34 45 1 28 2 3 30 25 22 4 5 6 7 12 14 21 15 16 20 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Heap: da albero ad array 34 45 1 28 2 3 30 25 22 4 5 6 7 12 14 21 15 16 20 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Heap: da albero ad array 34 45 1 28 2 3 30 25 22 4 5 6 7 12 14 21 15 16 20 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Proprietà di uno Heap Un Albero Heap è un albero binario completo tale che per ogni nodo i: entrambi i nodi j e k figli di i sono NON maggiori di i. Un array A è uno Heap se A[i] A[2i] e A[i] A[2i+1] 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Operazioni elementari su uno Heap SINISTRO(i) return 2i DESTRO(i) return 2i+1 PADRE(i) return ºi/2ß heapsize[a] n è la lunghezza dello Heap 1 2 3 4 5 6 7 8 9 10 11 12 45 34 28 30 25 22 12 14 21 15 16 20

Operazioni su uno Heap Heapify(A,i): ripristina la proprietà di Heap al sottoalbero radicato in i assumendo che i suoi sottoalberi destro e sinistro siano già degli Heap Costruisci-Heap(A): produce uno Heap a partire dall array A non ordinato HeapSort(A): ordina l array A sul posto.

Heapify: Intuizioni Heapify(A,i): dati due Heap H 1 e H 2 con radici SINISTRO(i) e DESTRO(i) e un nuovo elemento v in posizione A[i] se lo Heap H con radice A[i]=v viola la proprietà di Heap allora: metti in A[i] la più grande tra le radici degli Heap H1 e H2 applica Heapify ricorsivamente al sottoalbero modificato (con radice A[2i] o A[2i+1]) e all elemento v (ora in posizione A[2i] o A[2i+1]).

Algoritmo Heapify Heapify(A,i) l=sinistro(i) r=destro(i) IF l heapsize[a] AND A[l]>A[i] THEN maggiore=l ELSE maggiore=i IF r heapsize[a] AND A[r]>A[maggiore] THEN maggiore=r IF maggiore i THEN scambia A[i] e A[maggiore] Heapify(A,maggiore)

Heapify IF l heapsize[a] AND A[l] > A[i] THEN maggiore = l ELSE maggiore = i 45 1 i 14 28 2 3 34 25 22 l r 4 5 6 7 12 30 21 15 16 20 8 9 10 11 12

Heapify IF r heapsize[a] AND A[r] > A[maggiore] THEN maggiore = r 45 1 i 14 28 2 3 maggiore l r 34 25 22 4 5 6 7 12 30 21 15 16 20 8 9 10 11 12

Heapify IF maggiore i THEN scambia A[i] e A[maggiore] Heapify(A,maggiore) 45 1 i 14 28 2 3 maggiore l r 34 25 22 4 5 6 7 12 30 21 15 16 20 8 9 10 11 12

Heapify IF maggiore i THEN scambia A[i] e A[maggiore] Heapify(A,maggiore) 45 1 i 34 28 2 3 maggiore l r 14 25 22 4 5 6 7 12 30 21 15 16 20 8 9 10 11 12

Heapify IF maggiore i THEN scambia A[i] e A[maggiore] Heapify(A,maggiore) 45 1 i 34 28 2 3 maggiore l r 14 25 22 4 5 6 7 12 30 21 15 16 20 8 9 10 11 12

Heapify IF maggiore i THEN scambia A[i] e A[maggiore] Heapify(A,maggiore) 45 34 1 28 2 3 i 14 25 22 4 5 6 7 12 l 30 r 21 15 16 20 8 9 10 11 12

Heapify IF l heapsize[a] AND A[l] > A[i] THEN maggiore = l ELSE maggiore = i 45 34 1 28 2 3 i 14 25 22 4 5 6 7 12 l 30 r 21 15 16 20 8 9 10 11 12

Heapify IF l heapsize[a] AND A[l] > A[i] THEN maggiore = l ELSE maggiore = i 45 34 1 28 2 3 i 14 25 22 4 5 6 7 12 l maggiore 30 r 21 15 16 20 8 9 10 11 12

Heapify IF r heapsize[a] AND A[r] > A[maggiore] THEN maggiore = r 45 34 1 28 2 3 i 14 25 22 4 5 6 7 12 l maggiore 30 r 21 15 16 20 8 9 10 11 12

Heapify IF maggiore i THEN scambia A[i] e A[maggiore] Heapify(A,maggiore) 45 34 1 28 2 3 i 30 25 22 4 5 6 7 12 l maggiore 14 r 21 15 16 20 8 9 10 11 12

Heapify IF maggiore i THEN scambia A[i] e A[maggiore] Heapify(A,maggiore) 45 34 1 28 2 3 30 25 22 4 5 6 7 12 i 14 21 15 16 20 8 9 10 11 12

Heapify IF l heapsize[a] AND A[l] > A[i] THEN maggiore = l ELSE maggiore = i 45 IF r heapsize[a] AND A[r] > 1 A[maggiore] THEN maggiore = r 34 28 i 30 2 3 25 4 5 6 7 di heapsize[a] 14 21 15 16 20 8 9 10 11 12 Entrambi i test sono falsi 22 perché l e r sono maggiori 12

Heapify Heapify termina! È stata ripristinata la proprietà Heap 45 1 34 28 2 3 30 25 22 4 5 6 7 12 i 14 21 15 16 20 8 9 10 11 12