ALGORITMI E STRUTTURE DATI
ALBERI AVL: INSERIMENTO E CANCELLAZIONE ALBERI ROSSO NERI
DYNAMIC SELECT
ALBERI AVL
INSERIMENTO E CANCELLAZIONE
ALBERI AVL
INSERIMENTO E CANCELLAZIONE
▸ L’inserimento può violare la proprietà AVL su più nodi nel percorso che va dalla radice al punto dove è stato inserito il nuovo nodo
ALBERI AVL
INSERIMENTO E CANCELLAZIONE
▸ L’inserimento può violare la proprietà AVL su più nodi nel percorso che va dalla radice al punto dove è stato inserito il nuovo nodo
▸ La cancellazione analogamente può violare la proprietà AVL nei nodi antenati del nodo cancellato
ALBERI AVL
INSERIMENTO E CANCELLAZIONE
▸ L’inserimento può violare la proprietà AVL su più nodi nel percorso che va dalla radice al punto dove è stato inserito il nuovo nodo
▸ La cancellazione analogamente può violare la proprietà AVL nei nodi antenati del nodo cancellato
▸ Vediamo come ogni sbilanciamento può essere risolto tramite una sequenza di rotazioni
ALBERI AVL
RIBILANCIAMENTO
Se emerge uno sbilanciamento dopo un inserimento o una cancellazione di un nodo, allora il fattore di sbilanciamento sarà 2 o -2, e causato da un nodo in più (o in meno) in uno dei 4 sottoalberi T0 T1 T2 T3.
X Y
Z
T1
T0 T2 T3
SS SD DS DD
In funzione di dove emerge lo sbilanciamento, definiremo una sequenza di rotazioni opportuna che ribilanci l’albero.
Per simmetria, tratteremo solo due dei 4 casi, ovvero SS e SD.
ALBERI AVL
RIBILANCIAMENTO - CASO SS
X
Y
T1 T2
T3
Supponiamo ci sia uno sbilanciamento su X (pari a 2) per la differenza tra le altezze di T1 e T3.
h + 2
h + 3
h
h + 1 h
X Y
T1
T2 T3
h + 1 h + 2
h h + 1
h
beta = 2 beta = 0
Rotazione a DX
L’altezza del sottoalbero precedentemente radicato in X decresce di uno
ALBERI AVL
RIBILANCIAMENTO - CASO SD
Supponiamo ci sia uno sbilanciamento su X (pari a 2).
Rotazione a SX su Z
La prima rotazione non risolve lo sbilanciamento
Z X Y
T3 T0
T1 T2
h + 3 h + 2
h
h; h − 1
h + 1 h
h; h − 1
beta = 2
Z
X
Y
T3
T0 T1
T2
h + 3
h + 2
h
h + 1
beta = 2
h
Solo uno tra T1 e T2 ha altezza h
h; h − 1
h; h − 1
ALBERI AVL
RIBILANCIAMENTO - CASO SD
h
Rotazione a DX
L’altezza del sottoalbero precedentemente radicato in X decresce di uno
Z
Y X
T3 T0 T1 T2
h + 2
h h; h − 1 h + 1
h; h − 1
h + 1 Z
X
Y
T3
T0 T1
T2
h + 2
h + 1
beta = 2
h
h; h − 1
h; h − 1
h + 3 beta = 0
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “19”
15
7
4 11
23
0 0 32 0
0 1
0
19
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “19”
15
7
4 11
23
0 0 32 0
0 1
0
19
Stack dei nodi visitati
15
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “19”
15
7
4 11
23
0 0 32 0
0 1
0
19
Stack dei nodi visitati
15 23
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “19”
15
7
4 11
23
0 0 32 0
0 1
0
19
Stack dei nodi visitati
15 23
0
Abbiamo inserito il nodo, ora svuotiamo lo stack e aggiorniamo il bilanciamento
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “19”
15
7
4 11
23
0 0 32 0
0 0
0
19
Stack dei nodi visitati
15
23
0
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “19”
15
7
4 11
23
0 0 32 0
0 0
0
19
Stack dei nodi visitati
15
0
ALBERI AVL
INSERIMENTO
ALBERI AVL
INSERIMENTO
▸ Il caso migliore è quello in cui non otteniamo nessun
valore
+2 −2
o e aggiorniamo solamente il bilanciamentoALBERI AVL
INSERIMENTO
▸ Il caso migliore è quello in cui non otteniamo nessun
valore
+2 −2
o e aggiorniamo solamente il bilanciamento▸ Notate come se c’è uno sbilanciamento, esso deve essere con un valore , dato che l’aggiunta di un nodo modifica l’altezza di al più .
±2 1
ALBERI AVL
INSERIMENTO
▸ Il caso migliore è quello in cui non otteniamo nessun
valore
+2 −2
o e aggiorniamo solamente il bilanciamento▸ Notate come se c’è uno sbilanciamento, esso deve essere con un valore , dato che l’aggiunta di un nodo modifica l’altezza di al più .
±2 1
▸ Nel caso vi sia sbilanciamento cerchiamo il primo nodo — risalendo dal nodo appena inserito — che è sbilanciato - e applichiamo uno degli schemi di rotazione visti prima.
ALBERI AVL
INSERIMENTO
ALBERI AVL
INSERIMENTO
▸ Ma come facciamo a provare che queste operazioni rendono un albero bilanciato?
ALBERI AVL
INSERIMENTO
▸ Ma come facciamo a provare che queste operazioni rendono un albero bilanciato?
▸ Non è direttamente intuitivo, lo proviamo per un caso (sinistra-sinistra), per gli altri casi è equivalente
ALBERI AVL
INSERIMENTO
▸ Ma come facciamo a provare che queste operazioni rendono un albero bilanciato?
▸ Non è direttamente intuitivo, lo proviamo per un caso (sinistra-sinistra), per gli altri casi è equivalente
▸ Associamo ad ogni nodo la sua altezza e vediamo come questa viene modificata dalle operazioni di rotazione
ALBERI AVL
INSERIMENTO
Se effettuiamo la rotazione notiamo come la proprietà degli alberi AVL venga ripristinata
X
Y
T1 T2
T3
h + 2
h + 3
h
h h; h − 1
X Y
T1
T2 T3
h + 1 h + 2
h
beta = 2 beta = 0
Rotazione a DX
h
Qui vediamo che lo sbilanciamento è causato dal fatto che inserire il nodo nuovo
fa crescere l’altezza di T1, di Y e di X. In particolare l’altezza di X prima dell’inserimento è h+2, e l’altezza del nodo Y, che sostituisce X, dopo la rotazione è di nuovo h+2.
Non solo l’albero si ribilancia, ma anche ogni antenato di X torna ad essere bilanciato.
h; h − 1
ALBERI AVL
INSERIMENTO
ALBERI AVL
INSERIMENTO
▸ Abbiamo visto che per un caso le rotazioni ribilanciano il sottoalbero.
ALBERI AVL
INSERIMENTO
▸ Abbiamo visto che per un caso le rotazioni ribilanciano il sottoalbero.
▸ Queste rotazioni possono creare problemi più in altro nell’albero?
ALBERI AVL
INSERIMENTO
▸ Abbiamo visto che per un caso le rotazioni ribilanciano il sottoalbero.
▸ Queste rotazioni possono creare problemi più in altro nell’albero?
▸ No, perché l’albero ottenuto dopo le rotazioni ha esattamente la stessa altezza dell’albero prima dell’inserimento
ALBERI AVL
INSERIMENTO
▸ Abbiamo visto che per un caso le rotazioni ribilanciano il sottoalbero.
▸ Queste rotazioni possono creare problemi più in altro nell’albero?
▸ No, perché l’albero ottenuto dopo le rotazioni ha esattamente la stessa altezza dell’albero prima dell’inserimento
▸ Quindi se i nodi antenati erano bilanciati prima dell’inserimento lo rimangono anche dopo
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “25”
15
7
4
23
0 32
0 -1 1
0
25
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “25”
15
7
4
23
0 32
0 -1 1
0
25
Stack dei nodi visitati
15
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “25”
15
7
4
23
0 32
0 -1 1
0
25
Stack dei nodi visitati
15 23
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “25”
15
7
4
23
0 32
0 -1 1
0
25
Stack dei nodi visitati
15 23
32
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “25”
15
7
4
23
0 32
0 -1 1
0
25
Stack dei nodi visitati
15 23
32
0 Inseriamo il nodo ed iniziamo ad aggiornare lo sbilanciamento
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “25”
15
7
4
23
0 32
-1 -1 1
0
25
Stack dei nodi visitati
15 23
32
0
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “25”
15
7
4
23
0 32
-1 -1 2
0
25
Stack dei nodi visitati
15
23
0
Abbiamo trovato il primo nodo sbilanciato: caso destra-sinistra
ALBERI AVL
INSERIMENTO
Inseriamo il nodo “25”
15
7
4
25
0 32 0
-1 0
0
23
Stack dei nodi visitati
15
0
Abbiamo ribilanciato l’albero
ALBERI AVL
CANCELLAZIONE
ALBERI AVL
CANCELLAZIONE
▸ La cancellazione avviene come per un Albero Binario di Ricerca, ma rimuovendo un nodo si può creare uno sbilanciamento.
ALBERI AVL
CANCELLAZIONE
▸ La cancellazione avviene come per un Albero Binario di Ricerca, ma rimuovendo un nodo si può creare uno sbilanciamento.
▸ Utilizzando gli schemi di rotazioni visti prima possiamo ribilanciare.
ALBERI AVL
CANCELLAZIONE
▸ La cancellazione avviene come per un Albero Binario di Ricerca, ma rimuovendo un nodo si può creare uno sbilanciamento.
▸ Utilizzando gli schemi di rotazioni visti prima possiamo ribilanciare.
▸ In questo caso però, l’altezza dopo il ribilanciamento descresce di una unità rispetto a prima della cancellazione.
ALBERI AVL
CANCELLAZIONE
▸ La cancellazione avviene come per un Albero Binario di Ricerca, ma rimuovendo un nodo si può creare uno sbilanciamento.
▸ Utilizzando gli schemi di rotazioni visti prima possiamo ribilanciare.
▸ In questo caso però, l’altezza dopo il ribilanciamento descresce di una unità rispetto a prima della cancellazione.
▸ Quindi potremmo dover ribilanciare anche in tutti i nodi antenati. Quindi la cancellazione costa O(h) passi.
ALBERI AVL
CANCELLAZIONE
Se effettuiamo la rotazione notiamo come la proprietà degli alberi AVL venga ripristinata
X
Y
T1 T2
T3
h + 2
h + 3
h
h + 1 h
X Y
T1
T2 T3
h + 1 h + 2
h
beta = 2 beta = 0
Rotazione a DX
h + 1
Vediamo che l’albero torna ad essere bilanciato ma l’altezza decresce di uno.
h
ALBERI AVL
ALBERI AVL
ALBERI AVL
ALBERI AVL
▸ Gli alberi AVL sono alberi con profondità
O(log n)
ALBERI AVL
ALBERI AVL
▸ Gli alberi AVL sono alberi con profondità
O(log n)
▸ Le operazioni di ricerca non cambiano rispetto agli alberi binari di ricerca normali
ALBERI AVL
ALBERI AVL
▸ Gli alberi AVL sono alberi con profondità
O(log n)
▸ Le operazioni di ricerca non cambiano rispetto agli alberi binari di ricerca normali
▸ Le operazioni di inserimento e rimozione rimangono , con l’altezza dell’albero, quindi
h O(log n) O(h)
ALBERI AVL
ALBERI AVL
▸ Gli alberi AVL sono alberi con profondità
O(log n)
▸ Le operazioni di ricerca non cambiano rispetto agli alberi binari di ricerca normali
▸ Le operazioni di inserimento e rimozione rimangono , con l’altezza dell’albero, quindi
h O(log n) O(h)
▸ Richiedono però informazione aggiuntiva salvata nei nodi (come minimo bit/nodo)