Heapsort - costo computazionale 21 Gennaio 2008
Posted by Calogero in Algoritmi, Heapsort, Informatica, Matematica, Ordinamento.Tags: Cormen, Heapsort, Leiserson, Master Theorem, math, Rivest, Stein
trackback
Per dimostrare che il costo computazionale dello heapsort è occorre prima dimostrare alcune proprietà dello heap.
Proprietà 1
Uno heap con n nodi ha altezza
Dimostrazione:
Sia il numero di livello dello heap. I primi
livelli sono tutti completi, e il numero di nodi in esso contenuti è pari a
.
In maniera analoga, il numero di nodi in livelli è
.
Da questo concludiamo che .
Prendendo il logaritmo di ambo i membri otteniamo che
Il numero di nodi di altezza in uno heap con
nodi è
.
Dimostrazione:
Dimostriamo la proprietà per induzione rispetto ad h.
Dimostriamo il passo induttivo di base. Tutti i nodi ad altezza sono foglie. In uno heap le foglie si trovano ai livelli
e
. Sia
il numero di nodi al livello più profondo, allora
è sicuramente dispari, dato che lo heap è un albero binario completo almeno fino al penultimo livello. Se
è dispari, ci possiamo trovare in due situazioni distinte:
è dispari se
è pari
è pari se
è dispari
Caso 1: se x è pari, allora tutti i nodi dello heap hanno o 0 2 figli e quindi lo heap è un albero binario per cui vale la proprietà secondo la quale il numero di nodi interni è pari al numero delle foglie diminuito di uno. Detto il numero di nodi dello heap,
il numero di nodi interni e
il numero di foglie, si ha che
, da cui otteniamo che
dato che
è dispari.
Caso 2: se è dispari, allora
è pari. In questo caso possiamo aggiungere una foglia allo heap, facendolo diventare un albero binario per cui vale la relazione di cui prima. Come nel caso precedente avremo che
e quindi
, dato che
è pari. Quindi il numero di nodi ad altezza 0 senza l’aggiunta della foglia è
.
In questo modo abbiamo dimostrato che vale il caso base per .
Per ipotesi induttiva, supponiamo che la proprietà che vogliamo dimostrare valga per ogni livello dello heap H tra 0 e .
Dimostriamo il passo induttivo.
Sia il numero di nodi ad altezza
; sia
l’albero ottenuto rimuovendo da
le foglie e sia
il numero di nodi di
, avremo che
.
Osservando che , possiamo concludere che:
=
Costo di heap_heapify
Il costo di heap_heapify per un nodo di altezza h.
Per l’analisi del caso peggiore consideriamo uno heap con nodi e altezza
avente l’ultima riga completa per metà; sia
il numero di nodi nel sottoalbero sinistro e
il numero di nodi nel sottoalbero destro, avremo che
, dove
e
. Dato che
, avremo che
, da cui risulta che
.
Il costo di heap_heapify è dato dal costo necessario a ripristinare l’ordinamento tra il nodo e i suoi figli, che è
, più il costo della chiamata ricorsiva su un figlio di
. Dato che nel caso peggiore in un sottoalbero di
ci sono al più
nodi, la relazione di ricorrenza è
Per il caso 2 del Teorema Master, .
Costo di heap_build
Per ottenere il costo della heap_build occorre sommare il prodotto tra il costo della heap_heapify per ogni nodo ad altezza h (che sappiamo esser ) e il numero di nodi presenti al livello h dello heap per il numero totale dei livelli dello heap.
Usando le proprietà precedentemente enunciate possiamo esprimere la sommatoria che determina il costo computazionale della heap_build:
=
=
=
Il precedente risultato è stato ottenuto usando la seguente sommatoria:
con
Dopo questi 4 conticini (:D!!), possiamo esprimere il costo di heap_sort:
















Come faccio per esempio a dimostrare che nel caso peggiore di Heapify su un heap di dimensione n è Teta (lg n)?
Mi sembra che l’abbia scritto nella sezione del post intitolata “Costo di heap_heapify”. Per calcolare la formula di ricorrenza, parto dal presupposto che lo heap abbia l’ultimo livello completo per metà. Questo particolare caso è proprio il caso peggiore: ho il massimo sbilanciamento possibile per lo heap. Se segui tutti i passaggi, vedi come da queste considerazioni io calcoli la relazione di ricorrenza. Dalla relazione di ricorrenza, applicando il caso 2 del teorema Master, ottengo che il costo della heap_heapify nel caso peggiore è Theta(log n)
Praticamente se ho capito bene bisogna dimostrtare che lg n >= c * lg n ? Quindi verificandola facilmente per c = 1 ? Tnx
Non è proprio così………
Se hai la relazione di ricorrenza T(n)<=T(2/3n)+ Theta(1) e vuoi ottenere il costo asintotico, puoi usare diversi strumenti matematici. Nel nostro caso, mi sono affidato al Teorema fondamentale delle ricorrenza o teorema Master, di cui trovi l’enunciato sulla wiki (http://it.wikipedia.org/wiki/Master_theorem). Il teorema Master ti permette di trovare la soluzione senza dover fare tutta una serie di passaggi matematici spesso poco agevoli o complessi.
Sorry… dovrei dimostrare che è Omega (lg n)
Per dimostrare che T(n)=Theta(log n) devi dimostrare che contemporaneamente T(n)=O(log n) e T(n)=Omega(log n)
ahhhh mi perdoni vero se dopo la terza riga ho deciso che questo post non fa per me?
Solo alla terza riga?
scusa una curiosità OT,
come fai a scrivere le formule?
@ajkain: per scrivere le formule utilizzo LaTeX http://it.wikipedia.org/wiki/LaTeX. WordPress.com supporta i plugin per formule matematiche di LaTeX.
Trovi maggiori info qui: http://faq.wordpress.com/2007/02/18/can-i-put-math-or-equations-in-my-posts/
@fripp: grazie! mi documento studio i link
@ajkain: di nulla