Tutorato
di
Algoritmi
e
Strutture
Dati
[CT0371]
Lezione 11: 25 Febbraio 2014
Tutor: Alberto Carraro
Disclaimer: Queste note non sono state sottoposte al consueto controllo riservato alle pubblicazioni ufficiali.
Esse dunque possono essere distribuite al di fuori di queste lezioni solo con il permesso del docente.
In questa lezione rivediamo gli argomenti visti a lezione nelle settimane precedenti:
• Quicksort e analisi della complessità nei casi migliore, peggiore e medio.
• Ottimizzazioni del quicksort:
– Partizionamento triplice (problema della bandiera olandese)
– Utilizzo dell’Insertion Sort per vettori di piccole dimensioni
– Randomizzazione della scelta dell’elemento pivot
• Struttura dati Heap:
– Definizione di Heap
– Dimostrazione che l’altezza di un heap di n elementi è pari a log n
– Illustrato che nell’array che rappresenta un heap di n elementi, le foglie sono i nodi con indici
n
n
2 + 1, 2 + 2, . . . , n.
– Ilustrato che esistono al massimo
n
2h +1
nodi di altezza h in un qualsiasi heap di n elementi
– Max Heap e Min Heap
– Funzione Max Heapify max heapify(Heap A, NodeIndex i) e calcolo della sua complessità
– Funzione build heap(Array A) per costruire un heap e illustrazione dell’invariante sul ciclo for
presente nella stessa.
Consideriamo la terminologia data nel libro [CLRS]. Un albero binario T è:
• bilanciato (in altezza) se per ogni nodo x di T , abbiamo che |height(x.lef t) − height(x.right)| ≤ 1.
• completo se ogni nodo interno di T ha esattamente due figli
• completamente bilanciato se T è completo e tutte le foglie hanno la stessa profondità
Un max-heap
Esercizio 1 (Es 2 appello del 18/06/2010, parte II) Sono dati due alberi binari completamente bilanciati A e B, aventi la stessa altezza h e tali che la somma del loro numero di nodi è n. Le chiavi memorizzate
nei nodi di A e B soddisfano la proprietà di maxheap. Si vogliono fondere i due alberi, ottenendo un maxheap
di altezza h + 1 con n nodi.
(a) Progettare una soluzione di costo in tempo Θ(n) e in spazio aggiuntivo Θ(n).
11-1
11-2
Lezione 11: 25 Febbraio 2014
(b) Progettare una soluzione di costo in tempo O(log n) e spazio aggiuntivo costante.
La rappresentazione dell’albero binario utilizza esclusivamente i campi left, right e key.
Svolgimento:
(b) Anche se poò sembrare strano, risulta pù semplice risolvere il punto (b). Infatti basta accostare i due
alberi A, B e renderli figli rispettivamente destro e sinistro di un nuovo nodo. Resta solo da assegnare
un valore chiave a tale nuovo nodo radice. Per farlo togliamo la foglia più a destra dell’albero messo
come figlio destro (ovvero B) e diciamo che è la nuova radice. A questo punto abbiamo un quasi-max
heap e ci dobbiamo applicare la funzione MAX HEAPIFY. Supponiamo di avere:
– una funzione RIMUOVI ULTIMA FOGLIA(x) modifica un albero binario x rimuovendo l’ultima foglia
più a destra, diciamo f , e restituisce f .
– una funzione MAX HEAPIFY(x) che lavora direttamente sulla rappresentazione a puntatori invece
che sugli array
FUSIONE(x,y)
if (x == NIL)
return NIL
Node r = RIMUOVI_ULTIMA_FOGLIA(y)
r.left = x
r.right = y
MAX_HEAPIFY(r)
return r
(a) Ispirati dalla soluzione del punto (b), sappiamo che basta copiare i due alberi in un nuovo array C
di dimensione n copiando A in tutte le posizioni corrispondenti a nodi del sottoalbero sinistro di una
nuova radice, e copiando B in tutte le posizioni corrispondenti a nodi del sottoalbero destro della nuova
radice. Infine abbiamo lasciato fuori un solo nodo (l’ultima foglia a dx di B) e la mettiamo nella prima
cella di C. Concludiamo applicando MAX HEAPIFY a C.
COPIA(x,i,C,dim)
if (x != NIL){
C[i] = x.key
Node z = COPIA(x.left,left(i),C,dim)
if (right(i) < dim){
return COPIA(x.right,right(i),C,dim)
else
return x.right
}
return NIL
FUSIONE(x,y){
Key_Type C[n]
Node z = COPIA(x,2,C,n)
z = COPIA(y,3,C,n)
C[1] = z.key
MAX_HEAPIFY(C)
return C
}
Lezione 11: 25 Febbraio 2014
11-3
References
[1] C. Demetrescu, I. Finocchi, G.F. Italiano, Algoritmi e strutture dati 2/ed. McGraw-Hill, 2008.
[2] T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduzione agli algoritmi e strutture dati 3/ed,
McGraw-Hill, 2010.