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

Documenti analoghi
Algoritmi e Strutture Dati

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

ADT Coda con priorità

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

Esercitazione 3. Heapsort

Algoritmi e Strutture Dati. HeapSort

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

Heap e code di priorità

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.

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

Esercizi su alberi binari

Alberi binari di ricerca

Algoritmi e Strutture Dati

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

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

In questa lezione Alberi binari di ricerca: la cancellazione

Esercizi Capitolo 6 - Alberi binari di ricerca

Alberi Binari di Ricerca

Algoritmi e Strutture Dati

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

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Alberi ed Alberi Binari

Code a priorità (Heap) Definizione Heapify (mantenimento coda a priorità) Costruire un Heap Insert, Maximum e Extract-Max

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Alberi binari e alberi binari di ricerca

Note per la Lezione 4 Ugo Vaccaro

Esercizi di Algoritmi e Strutture Dati

Cammini minimi fra tutte le coppie

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

Alberi rosso-neri. Oltre ad essere alberi binari di ricerca, gli alberi rosso-neri soddisfano le seguenti proprietà:

Tempo e spazio di calcolo (continua)

lezione 9 min-heap binario Heap e Alberi posizionali generali

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

Alberi Binari di Ricerca

Alberi rosso-neri. Le operazioni sugli alberi binari di ricerca hanno complessità proporzionale all altezza h dell albero.

Esercizi Capitolo 6 - Alberi binari di ricerca

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Alberi binari. Ilaria Castelli A.A. 2009/2010. Università degli Studi di Siena Dipartimento di Ingegneria dell Informazione

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

Alberi binari di ricerca

Esercizi per il corso di Algoritmi

Esercizi di Algoritmi e Strutture Dati

Laboratorio di architettura degli elaboratori Progetto finale AA 2005/2006

Problemi, istanze, soluzioni

Algoritmi di ordinamento

Introduzione. Heap-binomiali: un heap binomiale è un insieme di alberi binomiali.

Problema del cammino minimo

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento

Alberi Rosso-Neri: definizione

Algoritmi e Strutture Dati

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

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

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

Tecniche Algoritmiche: divide et impera

Algoritmi (9 CFU) (A.A )

Algoritmi di Ricerca. Esempi di programmi Java

B-Tree. Struttura dati usata in applicazioni che necessitano di gestire insiemi di chiavi ordinate Una variante (B+-Tree) è diffusa in:

Algoritmi e strutture dati

5. DIVIDE AND CONQUER I

Tempo e spazio di calcolo

Albero di Riscorsione

Espressioni aritmetiche

Esempio : i numeri di Fibonacci

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Esercitazione 6. Alberi binari di ricerca

Due algoritmi di ordinamento. basati sulla tecnica Divide et Impera: Mergesort e Quicksort

Algoritmi e Strutture Dati Esercizi Svolti. Giuseppe Persiano Dipartimento di Informatica ed Appl. Renato M. Capocelli Università di Salerno

Algoritmi di Ricerca. Esempi di programmi Java

Transcript:

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 di Priorità Prof. V. Cutello Algoritmi 2

Array come Albero Binario Un array A[1 n] può essere visto come un albero binario, ossia A[1] è la radice A[2i] e A[2i+1] sono i figli di A[i] A[ i / 2 ] è il padre di A[i] Nota che l albero binario che si definisce in questo modo è Completo sino al penultimo livello L ultimo livello potrebbe essere parzialmente completo ma è riempito da sinistra a destra. Prof. V. Cutello Algoritmi 3

Esempio A=[a 1,, a 12 ] a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10 a 11 a 12 Prof. V. Cutello Algoritmi 4

Vincolo numerico Se per ogni i, A[i] max(a[2i],a[2i+1], allora l array viene detto Max-Heap Se per ogni i, A[i] min(a[2i],a[2i+1], allora l array viene detto Min-Heap Prof. V. Cutello Algoritmi 5

Esempio: Max-Heap A=[9, 8, 7, 5, 7, 6, 4, 4, 3, 6, 2, 5] 9 8 7 5 7 6 4 4 3 6 2 5 Prof. V. Cutello Algoritmi 6

Proprietà In una Max-Heap Il massimo è la radice Il minimo una delle foglie In una Min-Heap Il Minimo è la radice Il massimo una delle foglie Prof. V. Cutello Algoritmi 7

Conservare le proprietà di Heap Max-Heapify e Min-Heapify si applicano a partire dal nodo j supponendo che i sottoalberi di sinistra e di destra siano rispettivamente Max-Heap e Min-Heap Max_Heapify(A,j,n) k=j if 2j+1 n and A[2j+1] > A[k] then k=2j+1 if 2j n and A[2j] > A[k] then k=2j if k j then t=a[j], A[j]=A[k], A[k]=t Max_Heapify(A,k,n) Min_Heapify(A,j,n) k=j if 2j+1 n and A[2j+1] < A[k] then k=2j+1 if 2j n and A[2j] < A[k] then k=2j if k j then t=a[j], A[j]=A[k], A[k]=t Min_Heapify(A,k,n) Prof. V. Cutello Algoritmi 8

Complessità Max-Heapify e Min-Heapify sono algoritmi ricorsivi. Equazione di ricorrenza per entrambi T(k)=T(2k/3)+Θ(1) (perché? Soluzione?) Intuitivamente il numero di passi è l altezza h del nodo su cui la procedura è chiamata. Quindi O(h) Prof. V. Cutello Algoritmi 9

Costruzione di una Heap Utilizziamo Max-Heapify o Min-Heapify come subroutine Build_Max-Heap(A,n) for i= n/2 downto 1 Max_Heapify(A,i,n) Build_Min-Heap(A,n) for i= n/2 downto 1 Min_Heapify(A,i,n) Prof. V. Cutello Algoritmi 10

Complessità Banalmente, n/2 chiamate a una procedura O(log n) quindi O(n log n). Ma Quanti nodi ci sono ad altezza h? Risposta: al massimo n/2 h+1 (perché?) Quindi complessità Build-Heap h n/2 h+1 O(h)=O(n h/2 h ) Problema: h/2 h =??? Prof. V. Cutello Algoritmi 11

Complessità Serie geometrica infinita con 0 < x < 1 x h =1/(1-x) Differenziando entrambi i termini hx h-1 =1/(1-x) 2 Moltiplicando per x entrambi i termini hx h =x/(1-x) 2 Ponendo x=1/2 h(1/2) h =(1/2)/(1-(1/2)) 2 =2 Quindi complessità Build-Heap h n/2 h+1 O(h)=O(n h/2 h )=O(n) E in conclusione Θ(n) Prof. V. Cutello Algoritmi 12

Algoritmo Heapsort Idea: Costruiamo una Max-Heap Scambiamo il primo elemento dell array (massimo) con l ultimo e chiamiamo Max-Heapify Complessità: O(n log n) Heapsort(A) n=length(a) Build_Max-Heap(A,n) for i=n downto 2 scambia(a[1],a[i]) n=n-1; Max_Heapify(A,1,n) Prof. V. Cutello Algoritmi 13

Implementazione di code con priorità. Le heap si possono usare, oltre che per ordinare un array, anche per implementare delle code con priorità. Le code con priorità sono delle strutture dati in cui è possibile immagazzinare degli oggetti x a cui è attribuita una priorità pr[x] ed estrarli uno alla volta in ordine di priorità decrescente. Prof. V. Cutello Algoritmi 14 Code con priorità

Operazioni su code di priorità Sulle code con priorità sono definite le operazioni: Insert(S, x): aggiunge x alla coda S; Maximum(S): ritorna x S con pr[x] massima ExtractMax(S): toglie e ritorna x S con pr[x] massima Possono inoltre essere definite anche le operazioni: IncreasePr(S,x,p): aumenta la priorità di x ChangePr(S,x,p): cambia la priorità di x Prof. V. Cutello Algoritmi 15

Operazioni su code di priorità Maximum (S) n size[s] if n = 0 then return nil else return S[1] > S è una heap T Maximum ExtractMax (S) > S è una heap n size[s] if n = 0 then return nil else x S[1], S[1] S[n], size[s] n-1 Heapfy(S,1,n-1) return x max ( n) =!(1) T ExtractMax ( n) = max O(log n) Prof. V. Cutello Algoritmi 16

Per realizzare Insert e IncreasePr ci serve una versione diversa della Heapify che invece di usare la proprietà: H n (i) : A[i] è maggiore o uguale di ogni suo discendente in A[1..n] che se verificata per ogni elemento dell array caratterizza la struttura di mucchio, usa la proprietà simmetrica: HR(i) : A[i] è minore o uguale di ogni suo ascendente (non serve specificare n!!!) Anche questa, se verificata per ogni elemento dell array, caratterizza la struttura di mucchio. Prof. V. Cutello Algoritmi 17

La nuova versione HeapifyR della Heapify ricostruisce il mucchio quando tutti gli elementi dell array soddisfano la proprietà HR(i) tranne quello in posizione j. HeapifyR(S,j) > solo A[j] non soddisfa HR(j) while j > 1 and A[ j/2 ] < A[j] do t A[ j/2 ], A[ j/2 ] A[j], A[j] t > solo A[ j/2 ] non soddisfa HR( j/2 ) j j/2 T HeapfyR ( j) = max O(log j) Prof. V. Cutello Algoritmi 18

IncreasePr (A,i,p) > A è una heap if p < A[i] then errore: la nuova priorità è minore della vecchia else IncreaseKey T ( ) A[i] p max i = HeapifyR(S,i) Insert (A,x) n size[a]+1, A[n] x HeapifyR(A,n) size[a] n > S è una heap O(logi) T Insert ( n) = O(log n) max Prof. V. Cutello Algoritmi 19

Possiamo facilmente realizzare anche una ChangePr nel modo seguente: ChangePr (A,i,p) if p < A[i] then n size[a] A[i] p Heapify(A,i,n) else A[i] p HeapifyR(A,i) > S è una heap T ChangeKey ( n) = max O(log n) Prof. V. Cutello Algoritmi 20