Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e Strutture Dati Capitolo 6 Interrogazioni AVL Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Riepilogo: alberi AVL • • • Un albero AVL è un BST in cui ad ogni nodo la differenza tra l’altezza del sottoalbero sinistro e l’altezza del sottoalbero destro (detta fattore di bilanciamento) è al più pari ad 1 in valore assoluto (si osservi che la definizione non specifica come tale proprietà debba essere garantita e mantenuta nel caso in cui che il BST sia soggetto ad inserimenti e cancellazioni) Abbiamo dimostrato che un AVL con n nodi ha altezza h=Θ(log n), e che lo sbilanciamento di un nodo può essere corretto attraverso alcune operazioni di rotazione Oggi vedremo che la insert e la delete danno luogo a sbilanciamenti correggibili in O(log n) rotazioni Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Riepilogo ribilanciamenti Tipo Altezza dopo la/le rotazione/i Causa SS (i) Diminuisce di 1 Inserimento/Cancellazione SS (ii) Rimane la stessa Cancellazione SD Diminuisce di 1 Inserimento/Cancellazione Ovviamente i casi DD e DS sono simmetrici 3 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano insert(elem e, chiave k) 1. Crea un nuovo nodo u con elem=e e chiave=k 2. Inserisci u come in un BST 3. Ricalcola i fattori di bilanciamento dei nodi nel cammino dalla radice a u: sia v il nodo più profondo con fattore di bilanciamento pari a ±2 (nodo critico) 4. Esegui una rotazione opportuna su v Oss.: un solo ribilanciamento è sufficiente, poiché l’altezza del sottoalbero coinvolto nella/e rotazione/i diminuisce di 1 (sottocaso (i) del caso SS o DD, o casi SD o DS), e quindi torna ad essere uguale all’altezza che aveva prima dell’inserimento, ribilanciando così automaticamente tutti i nodi eventualmente sbilanciati nel cammino verso la radice Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esempio: insert (10,e) +2 +1 15 -2 -1 6 0 2 18 -2 3 0 -1 0 4 -1 8 +1 +2 13 0 7 -1 0 -1 0 17 20 0 caso SD 25 9 0 10 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esempio: insert (10,e) +2 +1 15 -2 -1 6 0 2 18 -2 3 0 -1 0 4 -1 0 17 8 +1 +2 13 0 7 -1 0 -1 20 0 25 10 0 9 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esempio: insert (10,e) +2 +1 15 -2 -1 6 0 2 18 -2 3 0 -1 0 4 -1 8 0 7 -1 0 9 -1 0 17 20 0 0 10 25 +1 0 +2 13 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano delete(elem e) 1. 2. Cancella il nodo come in un BST Ricalcola il fattore di bilanciamento del padre del nodo eliminato fisicamente (che potrebbe essere diverso dal nodo contenente e), ed esegui l’opportuna rotazione semplice o doppia ove necessario Ripeti questo passo, sino ad arrivare eventualmente alla radice dell’AVL: 3. – Se l’altezza del sottoalbero appena ribilanciato è uguale a quella che aveva prima della cancellazione, termina. Invece, se tale altezza è diminuita, risali verso l’alto (cioè vai nel padre del sottoalbero appena ribilanciato), calcola il fattore di bilanciamento, e applica l’opportuno ribilanciamento. Oss.: potrebbero essere necessarie O(log n) rotazioni: infatti eventuali diminuzioni di altezza indotte dalle rotazioni (sottocaso (i) del caso SS o DD, o casi SD o DS) possono propagare lo sbilanciamento verso l’alto nell’albero (l’altezza del sottoalbero in cui è avvenuto il ribilanciamento diminuisce di 1 rispetto a quella che aveva prima della cancellazione) Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esempio: delete (18) +1 15 -1 -2 -1 6 0 2 18 17 0 -1 3 8 0 4 0 17 +1 13 0 7 caso DD (i) Calcolo il fattore di bilanciamento -1 20 0 Predecessore di 18 25 Rotazione a sinistra 0 9 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Ribilanciamento DD e aggiornamento del fattore di bilanciamento del padre del sottoalbero ruotato +1 +2 15 caso SD (rotazione a cascata!) 0 -1 6 0 2 20 0 -1 3 8 0 4 0 17 0 25 +1 13 0 7 0 9 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Ribilanciamento SD +1 +2 15 +1 0 8 20 +1 +1 13 6 0 7 0 3 0 2 0 17 0 25 0 9 0 4 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Albero ribilanciato 0 8 +1 0 6 15 0 7 0 3 0 2 0 4 +1 13 0 9 0 20 0 17 0 25 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Classe AlberoAVL • Tutte le operazioni hanno costo O(log n) poiché l’altezza dell’albero è O(log n) e ciascuna rotazione richiede solo tempo costante Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Riepilogo • Mantenere il bilanciamento è risultato cruciale per ottenere buone prestazioni • Esistono vari approcci per mantenere il bilanciamento: – Tramite rotazioni (alberi AVL) – Tramite fusioni o separazioni di nodi (alberi 2-3, Balberi ) • In tutti questi casi si ottengono tempi di esecuzione logaritmici nel caso peggiore Copyright © 2004 - The McGraw - Hill Companies, srl