Esercizio 13costruzione di uno heap top-down e bottom-up
In questa pagina 5
Testo (esempio di tema d'esame, scritti del 19/09/2023 e del 03/07/2025, parti 1).
- Si consideri l'array di entry e l'approccio top-down per la costruzione di uno heap a partire da . Mostrare l'albero associato all'array alla fine di ogni iterazione dell'approccio top-down (è sufficiente mostrare le chiavi).
- Si consideri l'array e l'approccio bottom-up. Mostrare l'albero associato all'array alla fine di ogni iterazione.
- Analizzare la complessità (solo ) della costruzione top-down di uno heap a partire da un array , il cui pseudocodice è:
for j <- 2 to n do
i <- j
while (i > 1) AND (P[floor(i/2)].getKey() > P[i].getKey()) do
swap(P[i], P[floor(i/2)])
i <- floor(i/2)- Dimostrare che la complessità di inserimenti in una coda con priorità implementata con uno heap e inizialmente vuota è .
1. Top-down:
Si tiene come heap il prefisso e si fa salire (vedi Costruzione di uno heapCostruire uno heap da un array di n entry: approccio top-down con n-1 insert, Theta(n log n); approccio bottom-up con down-heap dalle foglie verso la radice, Theta(n), con dimostrazione della somma; esempi svolti, in loco; unione di due alberi con heap-order.Costruzione di uno heap →).
| Iterazione | Si inserisce | Array (heap + resto) | Scambi |
|---|---|---|---|
| inizio | — | — | |
| : scambio con il padre | |||
| (padre ): scambio | |||
| padre : scambio; padre : stop | |||
| padre : scambio; padre : scambio | |||
| padre : scambio; padre : scambio |
Albero finale: radice ; figli e ; sotto : e ; sotto : . È uno heap valido.
2. Bottom-up:
, : si parte da e si va fino a con il down-heap.
| Iterazione | Nodo trattato | Array | Che cosa succede |
|---|---|---|---|
| inizio | — | ||
| unico figlio : scambio | |||
| figli e : minore : scambio; in pos. 5, senza figli | |||
| figli e : scambio con ; in pos. 2 figli : minore : scambio |
Albero finale: radice ; figli e ; sotto : e ; sotto : . Controllo: ogni nodo i figli ✓.
3. Complessità del top-down
Limite superiore. L'iterazione esegue al più tante iterazioni del while quanti sono gli antenati di nell'albero, cioè la profondità di , pari a . Il costo di una iterazione è (un numero costante di operazioni per scambio). Perciò
4. inserimenti in uno heap vuoto:
L'inserimento numero avviene su uno heap con entry e costa al più scambi più un numero costante di operazioni (vedi HeapAlbero binario completo e sua altezza floor(log2 n); heap = albero completo con heap-order property; proprietà (radice minima, cammini non decrescenti); rappresentazione su array con level numbering; insert con up-heap bubbling, removeMin con down-heap bubbling, rimozione di una entry qualsiasi; invarianti e costi Theta(log n); esempio svolto.Heap →), quindi il totale è come sopra. Limite inferiore: se le chiavi sono inserite in ordine decrescente, ogni nuova chiave è minore di tutte quelle già presenti e sale fino alla radice, con scambi. Il costo totale è almeno
perché sono almeno termini ciascuno . Essendo e , la complessità è (al caso pessimo). Il bottom-up costruisce invece lo stesso heap da un array in .
Errori comuni
- Nel bottom-up partire da o da (sono foglie) invece di ; oppure procedere con crescente.
- Scambiare nel down-heap con il figlio sbagliato (si sceglie il minore dei due).
- Rispondere al punto 3: è il costo del bottom-up; il top-down è .
- Nel limite inferiore dimenticare di indicare l'istanza cattiva (ordine decrescente).
Versione ripasso
Testo. (1) Top-down su ; (2) bottom-up su , alberi a ogni iterazione; (3) analisi del top-down (for j <- 2 to n, up-heap); (4) insert in uno heap vuoto sono .
- (1) (vedi Costruzione di uno heapCostruire uno heap da un array di n entry: approccio top-down con n-1 insert, Theta(n log n); approccio bottom-up con down-heap dalle foglie verso la radice, Theta(n), con dimostrazione della somma; esempi svolti, in loco; unione di due alberi con heap-order.Costruzione di uno heap →): , , , , , .
- (2) : : ; : ; : .
- (3) iterazione : scambi ⇒ .
- (4) come (3); con chiavi decrescenti: (vedi HeapAlbero binario completo e sua altezza floor(log2 n); heap = albero completo con heap-order property; proprietà (radice minima, cammini non decrescenti); rappresentazione su array con level numbering; insert con up-heap bubbling, removeMin con down-heap bubbling, rimozione di una entry qualsiasi; invarianti e costi Theta(log n); esempio svolto.Heap →). Il bottom-up è .
- Top-down: per ogni l'entry sale finché il padre è maggiore (al più scambi). Bottom-up: con down-heap scambiando col figlio minore; .
- Istanza cattiva del top-down: chiavi decrescenti, ogni nuova chiave sale alla radice.
- Errori: bottom-up da o in avanti; figlio non minimo; per il top-down; istanza cattiva mancante.