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.