Costruzione di uno heap
In questa pagina 4
Problema. Input: array di entry. Output: lo stesso array riorganizzato in modo da rappresentare uno heap (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 →). Entrambe le soluzioni lavorano in loco (senza array aggiuntivi).
Top-down: inserimenti successivi
Si considera uno heap di un elemento e si inserisce con l'up-heap bubbling.
for j <- 2 to n do
up-heap bubbling a partire da P[j]Invariante (alla fine dell'iterazione ): rappresenta uno heap, è immutato.
Costo. L'iterazione costa , quindi . È anche : se è in ordine decrescente ogni nuova chiave è minore di tutte le precedenti e sale fino alla radice, e
Quindi (anche insert consecutive in uno heap vuoto, vedi Esercizio 13 · costruzione di uno heap top-down e bottom-up).
Esempio. : dopo : ; ( sale sopra ): ; : ; ( sopra ): ; ( sopra , poi stop): .
Bottom-up: dalle foglie verso la radice
Le posizioni sono foglie e quindi già heap da un elemento. Si procede a ritroso sui nodi interni, "sistemando" ciascuno con il down-heap bubbling: ogni nodo ha come sottoalberi due heap già costruiti.
for j <- floor(n/2) downto 1 do
down-heap bubbling a partire da P[j]Invariante (alla fine dell'iterazione ): rappresenta una foresta di heap, è immutato. Alla fine e è uno heap.
Costo. Sia . Il down-heap da un nodo al livello () costa (al più la distanza dalle foglie), e al livello ci sono al più nodi. Il costo totale è
Si dimostra per induzione che : per è ; passando da a si somma e si ottiene . (Nel corso si dimostra la limitazione più debole , che basta.) Dunque il costo è , perché . Ed è : servono almeno iterazioni. .
Perché il bottom-up è più veloce. Nel top-down le iterazioni costose sono molte: i nodi del livello costano ciascuno (più sono numerosi, più costano). Nel bottom-up i livelli più numerosi (vicini alle foglie) costano poco, , e solo i pochi nodi in alto costano .
Esempio. (, ):
| Dopo | Array |
|---|---|
| 6 | () |
| 5 | () |
| 4 | invariato () |
| 3 | () |
| 2 | () |
| 1 | () |
Un altro esempio (da un tema d'esame): con : : ; : ; : ( scende scambiando con , poi con ).
Altre costruzioni
Fusione di due heap come alberi (non necessariamente completi, altezze ) in tempo : si rimuove una foglia da , si crea una nuova radice con la entry di e come figli e , poi si esegue il down-heap dalla radice.
Heap sort. Costruzione bottom-up e poi removeMin da : (vedi Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →).
Errori comuni
- Eseguire il bottom-up partendo dalla fine dell'array (le foglie sono già heap): si parte da .
- Percorrere in avanti nel bottom-up: il down-heap richiede che i sottoalberi siano già heap.
- Dire che il bottom-up costa perché ogni down-heap è : la somma dei costi per livello è lineare.
- Dimenticare il caso peggiore del top-down: array in ordine decrescente.
Versione ripasso
- Problema: array heap, in loco (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 →).
- Top-down:
for j <- 2 to n: up-heap da P[j]. Invariante: heap. ; con array decrescente (). . - Bottom-up:
for j <- floor(n/2) downto 1: down-heap da P[j]. Invariante: foresta di heap.- Costo: livello ha nodi da , , con (induzione);
- quindi , e : .
- Esempi: top-down ; bottom-up ; bottom-up .
- Fusione di due heap-albero in : foglia di come nuova radice con figli , poi down-heap. Heap sort (vedi Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →).
- Invarianti: top-down: dopo , è heap e è invariato; bottom-up: dopo , è una foresta di heap e è invariato.
- Errori: bottom-up da o in avanti; credere che costi ; dimenticare il caso decrescente del top-down.