Dati e Algoritmi I (Pietracaprina) Esercizi su Priority Queue e Heap

Documenti analoghi
Dati e Algoritmi 1: A. Pietracaprina. Priority Queue (II parte)

Dati e Algoritmi 1: A. Pietracaprina. Priority Queue (I Parte)

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

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

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Dati e Algoritmi I (Pietracaprina) Esercizi sul Text Processing

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Nozioni di base (II Parte)

Code a priorità. Progettazione di Algoritmi Matricole congrue a 1. Docente: Annalisa De Bonis

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Dati e Algoritmi I (Pietracaprina) Esercizi svolti sull Ordinamento

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

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

Dati e Algoritmi 1: A. Pietracaprina. Alberi

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

Dati e Algoritmi 1: A. Pietracaprina. Alberi Binari

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

Esercizi per il corso di Algoritmi, anno accademico 2011/12

Dati e Algoritmi 1: A. Pietracaprina. Text Processing

Alberi binari: definizione e alcune proprietà

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

Algoritmi e Strutture Dati

Gestione ed Elaborazione di Grandi Moli di Dati. Scritto 29/08/2006: SOLUZIONI

Algoritmi e Strutture Dati

Esercizi su alberi binari

Note per la Lezione 4 Ugo Vaccaro

Problemi di ordinamento

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

Dati e Algoritmi I (Pietracaprina) Esercizi svolti sui Grafi

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

Esercizio. 2 i=i*2) j=j*2)

Alberi ed Alberi Binari

Spesso sono definite anche le seguenti operazioni:

In questa lezione Alberi binari di ricerca

Dati e Algoritmi I (Pietracaprina) Esercizi svolti sui Grafi

ADT Coda con priorità

Alberi ed Alberi Binari di Ricerca

Esercizi di Algoritmi e Strutture Dati

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

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

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.

Algoritmi e Strutture di Dati

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Esercitazione 3. Osserviamo che, dato un grafo con pesi distinti, questo ammette un unico MST.

Problem Set 2 docente: Luciano Gualà

Algoritmi e Strutture Dati. HeapSort

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Dati e Algoritmi 1: A. Pietracaprina. Mappa (II parte)

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

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

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

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

ADT Dizionario. Ordered search table. Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D:

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

Algoritmi e Strutture Dati

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

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

Algoritmi e Strutture di Dati

Algoritmi e Strutture Dati. Capitolo 13 Cammini minimi: Algoritmo di Bellman e Ford

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

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

Dati e Algoritmi 1: A. Pietracaprina. Alberi Generali

In questa lezione Alberi binari di ricerca: la cancellazione

Heap e code di priorità

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

Si imposti la relazione di ricorrenza che ne descrive la complessità e la si risolva utilizzando il metodo della sostituzione.

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

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

Fondamenti teorici e programmazione

Algoritmi e strutture dati 16 Dicembre 2004 Canali A L e M Z Cognome Nome Matricola

Alberi binari di ricerca

Algoritmi & Laboratorio

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

Progettazione di Algoritmi Anno Accademico Esercizi su Grafi: Parte Prima

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

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

Soluzioni della settima esercitazione di Algoritmi 1

Code con priorità. Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna.

Algoritmi e Strutture Dati. HeapSort

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

Esercizi per il corso di Algoritmi

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.

Laboratorio 26 Aprile 2012

7.1 Progettare un algoritmo per costruire ciclo euleriano di un grafo non orientato.

LABORATORIO DI ALGORITMI E STRUTTURE DATI A-L. Ingegneria e scienze informatiche Cesena A.A: 2016/2017 Docente: Greta Sasso

Esercizi svolti a lezione

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

Strutture dati per insiemi disgiunti

Tecniche Algoritmiche: tecnica greedy (o golosa)

Problemi di ricerca in insiemi ordinati

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

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

Algoritmi e Strutture Dati. Capitolo 1 Un introduzione informale agli algoritmi

Tempo e spazio di calcolo (continua)

Grafi (non orientati e connessi): minimo albero ricoprente

Dati e Algoritmi 1: A. Pietracaprina. Grafi (II parte)

Università degli Studi di Camerino Laurea in Informatica Prima Prova Parziale del corso di Algoritmi e Strutture Dati

Transcript:

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 le seguenti proprietà: (1) ogni nodo interno ha al più 3 figli; (2) per 0 i < h ci sono 3 i nodi al livello i; (3) tutti i nodi interni al livello h 1 sono alla sinistra delle eventuali foglie che stanno a quel livello e hanno tutti 3 figli tranne, eventualmente quello più a destra. (Si ricordi che dati due nodi v e u sullo stesso livello, diciamo che v è alla sinistra di u se lo precede nella visita preorder.) Sia n il numero di nodi dell albero. a. Dimostrare che h Θ (log n). b. Descrivere un implementazione efficiente dell albero ternario completo tramite un array. c. Si supponga di memorizzare n entry distinte nei nodi dell albero (una entry per nodo) con la proprietà che un nodo ha chiave minore di quelle dei suoi figli. Si ottiene così uno heap ternario. Descrivere e analizare un implementazione efficiente dei metodi della Priority Queue insert(k,x) e removemin(), sull heap ternario. Soluzione. a. Dalla definizione si ricava che: h 1 3 i < n i=0 h 3 i, i=0 e quindi che 3 h 1 < n 3h+1 1. 2 2 Di conseguenza, dopo qualche semplice passaggio algebrico si ottiene che h < log 3 (2n + 1) h + 1, da cui discende che h = log 3 (2n + 1) 1 Θ (log n). b. Sia V l array che implementa l albero. Associamo V [1] alla radice dell albero, e V [3i 1], V [3i], V [3i + 1] ai tre figli del nodo V [i], per ogni i 1. Se vi sono n nodi, l ultimo nodo (ovvero quello più a destra nel livello h) sarà associato all elemento V [n]. c. Poniamo last = n. Per i > 1, si denoti con p(i) l indice del padre del nodo V [i], ovvero p(i)= (i + 1)/3. L implementazione di insert(k,x) è la seguente: e (k,x) V[last++] entry i last; while ((i>1) and (V[p(i)].getKey() > V[i].getKey())) do swap(v[i],v[p(i)]); i p(i); return e L implementazione di removemin() è la seguente:

Dati e Algoritmi I (Pietracaprina): Esercizi 2 minentry V[1]; V[1] V[last--]; i 1; j indice del figlio di V[i] con la minima chiave (se esiste); while ((3i-1 <= last) and (V[i].getKey() > V[j].getKey())) do swap(v[i],v[j]); i j; j indice del figlio di V[i] con la minima chiave (se esiste); return minentry Entrambi i metodi hanno un costo proporzionale all altezza h dell albero. Dalla definizione di albero ternario completo si deduce che il numero di nodi, ovvero il numero di entry, è n Θ ( 3 h), e quindi la complessità è Θ (h) = Θ (log n). Problema 2 (Adattamento dell esercizio C-9.32 del testo [GTG14].) Si consideri un albero binario completo con n > 1 nodi e altezza h = log 2 n. Si supponga di etichettare con un bit b = 0 ogni collegamento (padre, figlio-sinistro), e con un bit b = 1 ogni collegamento (padre, figlio-destro). Inoltre, si associ a ogni nodo v, diverso dalla radice, la sequenza di bit incontrata nel cammino dalla radice a v. a. Dimostrare per induzione su n 2, che i nodi di ciascun livello dell albero, presi da sinistra verso destra, sono associati alle configurazioni binarie su i bit degli interi consecutivi 0, 1, 2,... b. Supponendo di implementare l albero con una struttura linkata, sviluppare un algoritmo che, conoscendo n, trova il nodo last (cioè quello più a destra al livello h) a partire dalla radice, in tempo O (h). Soluzione. a. La base (n = 2) è banale. Fissiamo n 2 arbitrariamente. Supponiamo che la proprietà sia vera per un albero binario completo con n nodi e proviamola per un albero binario completo di n + 1 nodi. Sia h l altezza dell albero con n nodi. Detto T l albero con n + 1 nodi si indichi con w il nodo in più che tale albero ha rispetto a quello con n nodi. Per ipotesi induttiva, la proprietà vale per tutti i nodi di T diversi da w. Per quanto riguarda w distinguiamo due casi: (1) w è nel livello h + 1; (2) w è nel livello h. Nel caso (1), w è il primo nodo del livello h+1 ed è associato alla configurazione binaria con h + 1 zeri, e quindi la proprietà vale. Nel caso (2), sia u il nodo alla sinistra di w e z il padre di u. Se u è il figlio sinistro di z, allora w è il figlio destro di z e la configurazione binaria associata a w differisce da quella associata a u solo nel bit meno significativo che passa da 0 in u a 1 in w. Se invece u è figlio destro di z allora w è figlio sinistro del nodo z alla destra di z. Sia k l intero rappresentato dalla configurazione binaria associata a z, e k l intero rappresentato dalla configurazione binaria associata a z Per ipotesi induttiva si ha che k = k + 1. Inoltre, la configurazione binaria associata a u rappresenta l intero 2k+1, mentre quella associata a w rappresenta l intero 2k = 2k+2. Ne concludiamo che nel caso (2) il nodo w risulta sempre associato a una configurazione binaria che rappresenta l intero successivo di quello rappresentato dalla configurazione binaria associata a u, e quindi la proprietà vale.

Dati e Algoritmi I (Pietracaprina): Esercizi 3 b. Sia x il numero di nodi al livello h. Dato che nei livelli da 0 a h 1 si ha un totale di 2 h 1 nodi, ne deduciamo che x = n (2 h 1). In base al punto precedente sappiamo che il nodo last è associato alla configurazione binaria dell intero x 1 = n 2 h. Conoscendo n (e quindi h) e partendo dalla radice, possiamo raggiungere il nodo last seguendo il cammino identificato dai bit della configurazione binaria di n 2 h (su h bit). La figura illustra un esempio con n = 12 e h = 3. 0 2 1 0 2 1 0 2 1 0 2 1 0 2 1 0 2 2 2 2 2 2 2 last 000 001 010 011 100 Problema 3 Dato uno stream S[1], S[2],..., S[n] di n entry con chiavi distinte n grande! che arrivano in sequenza una dopo l altra, si vogliono determinare le K << n entry con chiave più grande senza salvare tutte le entry ma usando O (K) spazio, indipendentemente da n. Progettare l algoritmo per risolvere il problema analizzandone complessità e correttezza. Suggerimento: Usare una priority queue Q di appoggio implementata tramite uno heap che in ogni istante contenga le K entry con chiave più grande tra quelle viste sino a quell istante. Soluzione. Lo pseudocodice è il seguente: Algoritmo streamtop(s,k) input Stream S di n entry, intero K (1 K << n) output Le K entry con chiave piu grande di S Q priority queue vuota for i 1 to n do { if (i K) then Q.insert(S[i].getKey(),S[i].getValue()) else if (S[i].getKey() > Q.min().getKey()) then { Q.removeMin() Q.insert(S[i].getKey(),S[i].getValue()) } } return Q La complessità è O (n log K) dato che ogni iterazione del ciclo for è dominata dalle eventuali due operazioni di insert e removemin su Q, che contiene al più K entry.

Dati e Algoritmi I (Pietracaprina): Esercizi 4 La correttezza è basata sul seguente invariante che vale alla fine di ciascuna iterazione i del for: Q contiene le min{i, K} entry più grandi del prefisso S[1 i]. È immediato vedere che l invariante è mantenuto vero da ciascuna delle prime K iterazioni. Supponiamo che sia vero alla fine di una certa Iterazione i, con K i < n e dimostriamo che rimane vero alla fine dell Iterazione i + 1. Per l = i, i + 1 si denoti con Q l la coda Q alla fine della Iterazione l e si definisca A l = S[1 l] Q l. Dato che l invariante vale alla fine dell Iterazione i si deve avere che ogni entry in A i ha chiave minore di quella di qualsiasi entry in Q i. Sia x = S[i + 1] e y = Q[1] (ovvero, y è la entry con chiave più piccola in Q). Abbiamo due casi Caso 1: x.getkey() < y.getkey(). In questo caso avremo Q i+1 = Q i e A i+1 = A i {x}. Caso 2: x.getkey() > y.getkey(). In questo caso avremo Q i+1 = (Q i {y}) {x} e A i+1 = A i {y}. In entrambi i casi vale che per ogni z A i+1 e w Q i+1 la chiave di z è minore di quella di w (la prova è lasciata come esercizio), e quindi l invariante continua a valere. Problema 4 Progettare e analizzare un algoritmo per rimuovere da uno heap P con n entry la entry P [j] (1 j n), ripristinando poi le proprietà dello heap. Soluzione. L idea è di rimuovere P [j] mettendo al suo posto P [last], in modo da mantenere la struttura di albero binario completo, e procedere poi a ripristinare le proprietà dell heap con un up-heap bubbling o down-heap bubbling a partire dalla posizione j a seconda della relazione tra la nuova entry P [j] (quella che prima era P [last]) e le entry del padre e dei figli di P [j]. In particolare, sia k la chiave della nuova entry P [j], e siano k 0, k 1 e k 2 le chiavi delle entry P [ j/2 ], P [2j] e P [2j + 1], rispettivamente, se tali entry esistono. Si hanno tre casi: Caso 1: k 0 k min{k 1, k 2 }. In questo caso non ci sono violazioni della heap-order property. Caso 2: k < k 0, e quindi k < min{k 1, k 2 }. In questo caso si esegue un up-heap bubbling a partire da P [j]. Siamo infatti nella condizione in cui uniche coppie discendenteantenato che violano heap-order property sono P [j], P [l] con P [l] antenato di P [j] Caso 3: k > min{k 1, k 2 }, e quindi k > k 0. In questo caso si esegue un down-heap bubbling a partire da P [j]. Siamo infatti nella condizione in cui uniche coppie discendenteantenato che violano heap-order prop. sono P [j], P [l] con P [l] discendente di P [j]. Si osservi che i tre casi sono mutuamente esclusivi. L algoritmo è il seguente: Algoritmo removeentry(p,j) input Heap P con n entry, intero j (1 j n) output Heap P con n-1 entry ottenuto rimuovendo P[j] e P[j]; P[j] P[last--] /* Caso 2: up-heap bubbling a partire da P [j] */ while ((j>1) and (P[j].getKey() < P[ j/2 ].getkey())) do

Dati e Algoritmi I (Pietracaprina): Esercizi 5 swap(p[j],p[ j/2 ]) j j/2 /* Caso 3: down-heap bubbling a partire da P [j] */ k indice del figlio di P[j] con la minima chiave (se esiste) while ((2j <= last) and (P[j].getKey() > P[k].getKey())) do swap(p[j],p[k]) j k k indice del figlio di P[j] con la minima chiave (se esiste) Si noti che solo uno dei due cicli while può essere eseguito per ogni istanza. La complessità è come quella dei metodi insert e removemin visti a lezione, ed è quindi Θ (log n). Problema 5 (Esercizio C-9.34 del testo [GTG14].) Progettare un algoritmo che dato uno heap T con n entry e una chiave k stampi tutte le entry in T con chiave k. La complessità deve essere proporzionale al numero di entry stampate (+1 nel caso siano 0). Soluzione. Si osservi che le entry con chiave k formano un sottoalbero T di T (eventualmente vuoto) con la stessa radice di T. È sufficiente quindi fare una visita di T prestando attenzione al fatto che le foglie di T sono foglie di T oppure nodi interni di T contenenti entry con chiave k ma i cui figli hanno entry con chiave > k. L algoritmo è il seguente (la prima invocazione sarà Find(T,i,k): Algoritmo Print(T,i,k) input Heap T, indice i [1,last], chiave k output Stampa di tutte le entry con chiave k nel sottoalbero con radice T[i] if (T[i].getKey() k) then stampa T[i] if ((2i last) AND (T[2i].getKey() k)) then Print(T,2i,k) if ((2i+1 last) AND (T[2i+1].getKey() k)) then Print(T,2i+1,k) Se non esistono chiavi k in T, la complessità dell algoritmo è chiramente O (1), altrimenti la complessità è quella di una visita in preorder di T, in cui la visita di un nodo consiste nello stampare la entry in esso contenuta. Assumendo che la stampa di una entry richieda tempo costante, la complessità della visita è O (m + 1). Problema 6 (Esercizio C-9.36 del testo [GTG14].) Siano T 1 e T 2 due alberi binari (non necessariamente completi e implementati tramite struttura linkata) i cui nodi memorizzano delle entry in modo da soddisfare la heap-order property. Descrivere un algoritmo per combinare T 1 e T 2 in un unico albero binario T i cui nodi contengano tutte le entry di T 1 e T 2, mantenendo la heap-order property. La complessità dell algoritmo deve essere O (h 1 + h 2 ), dove h 1 e h 2 rappresentano le altezze di T 1 e T 2, rispettivamente. Soluzione. L algoritmo esegue la seguente sequenza di passi: (1) si rimuove una foglia v da T 1 ; (2) si crea un nuovo nodo radice r contenente la entry e precedentemente contenuta in v, assegnandole T 1 e T 2 come figli sinistro e destro, rispettivamente; (3) si esegue il down-heap bubbling a partire da r. Una specifica più formale dell algoritmo e la sua analisi sono lasciate come esercizio.

Dati e Algoritmi I (Pietracaprina): Esercizi 6 Problema 7 Sia P una priority queue (heap su array) contenente n entry con chiavi distinte. Dato un intero m, con 1 m n, il seguente algoritmo trova le m entry di P con chiave più piccola restituendole in una sequenza S in ordine crescente di chiave. Ovvero, alla fine S[i] deve contenere la entry (e i ) con la i-esima chiave più piccola tra quelle di P, per 1 i m. L algoritmo fa uso di uno priority queue Q di appoggio, implementata tramite heap su array, le cui entry corrispondono a entry di P ma dove il valore è il loro indice in P. Algoritmo Find(P,m) input Heap P con n entry distinte, intero m (1 m n) output Sequenza ordinata S con le m entry con chiave piu piccola Q priority queue vuota; S sequenza vuota; S[1] P[1]; if (2 n) then Q.insert(P[2].getKey(),2); if (3 n) then Q.insert(P[3].getKey(),3); for i 2 to m do (k,j) Q.removeMin(); // k=chiave di P[j] S[i] P[j]; if (2j n) then Q.insert(P[2j].getKey(),2j); if (2j+1 n) then Q.insert(P[2j+1].getKey(),2j+1); return S a. Applicare l algoritmo con n = 10 e m = 4 al seguente heap P (3,B) (7,R) (9,D) (10,H) (8,V) (12,L) (15,C) (11,A) (16,M) (18,Z) in cui le chiavi sono interi e i valori sono lettere, facendo vedere lo stato di Q edi S all inzio del ciclo e alla fine di ogni iterazione. b. Per un istanza generica, cosa contengono Q ed S alla fine di ogni iterazione? c. Analizzare la complessità in tempo dell algoritmo. Soluzione. a. Nell esempio dato, Q ed S si evolvono come segue. All inizio del ciclo: S = [(3, B)] Q = [(7, 2)(9, 3)] Alla fine della iterazione 2: S = [(3, B)(7, R)] Q = [(8, 5)(10, 4)(9, 3)]

Dati e Algoritmi I (Pietracaprina): Esercizi 7 Alla fine della iterazione 3: S = [(3, B)(7, R)(8, V )] Q = [(9, 3)(10, 4)(18, 10)] Alla fine della iterazione 4: S = [(3, B)(7, R)(8, V )(9, D)] Q = [(10, 4)(15, 7)(12, 6)(18, 10)] b. Il seguente invariante vale alla fine di ogni iterazione i 1 del ciclo for (la fine dell interazione 1 è l inizio del ciclo). S[j] = e j, per 1 j i. Le entry in Q sono tutte quelle entry e l con l > i che in P sono figlie di entry che sono attualmente S (ovvero entry e j con j i). c. Per quanto riguarda la complessità si osservi che fuori dal ciclo for vengono eseguite Θ (1) operazioni, e che in ciascuna iterazione del ciclo vengono eseguite al più tre operazioni su Q (una removemin e due insert) e Θ (1) altre operazioni. Poichè Q contiene inizalmente due entry e in ogni iterazione la sua taglia aumenta al più di uno, Q non contiene mai più di m+1 entry, quindi il costo delle removemin e insert eseguite in ciascuna iterazione è O (log m). Se ne deriva che la complessità dell algoritmo è O (m log m). È importante notare che la complessità non dipende da n in quanto nessuna operazione costosa viene fatta su P. Problema 8 Sviluppare un algoritmo che calcola il k-esimo elemento più piccolo di un insieme S di n interi distinti, in tempo O (n + k log n). Soluzione. L idea è quella di costruire prima uno heap contenente n entry le cui chiavi sono gli n interi dati in input, e poi invocare per k volte removemin(). La chiave dell ultima entry estratta è il valore cercato e la si restituisce in output. Lo pseudocodice è il seguente: Algoritmo Find(S,k) input Insieme S con n interi distinti, indice k (1 k n) output k-esimo intero piu piccolo in S Crea una priority queue P con entry le cui chiavi sono gli interi di S e i cui valori sono null for i 1 to k do (x,v) P.removeMin() return x Si scelga di implementare P come heap su array. Allora la costruzione della priority queue richiede tempo O (n), usando l approccio bottom-up, e ciascuna iterazione del ciclo for richiede tempo O (log n). La complessità finale risulta essere O (n + k log n).