Sei sulla pagina 1di 32

Albe ri AVL

Gianlorenzo D'Angelo
gianlorenzo.dangelo@virgilio.it
Patrizio Bassi
patrizio.bassi@tin.it

Albe ri AVL

Un albero bilanciato in altezza se per ogni


nodo x le altezze dei sottoalberi sinistro e
destro di x differiscono di al pi ununit
Gli alberi bilanciati in altezza sono detti
alberi AVL (Adelson-Velskii & Landis - 1962)
Un albero AVL un albero binario di ricerca
bilanciato in cui ad ogni nodo v viene
associato un valore detto fattore di
bilanciamento che corrisponde alla
differenza tra la profondit del sottoalbero
sinistro e quella del sottoalbero destro di v
Il fattore di bilanciamento pu assumere
solo i valori 1, 0 oppure 1

Fatto re di bilanciam e nto

34

+1

21

63

0
16

30

43

72

-1
6
3

18

28
29

32

37

52

57

78

Albe ri AVL?
si

si

si

no

no

no

Alte z z a di AVL

Qual laltezza di un albero AVL di n nodi?


Ci aspettiamo che sia O(log n) ma non cosi facile da
dimostrare!
La prova, dovuta ad Adelson-Velskii & Landis, tra tutti
gli alberi bilanciati in altezza valuta laltezza degli alberi
pi sbilanciati possibile ovvero con i fattori di
bilanciamento dei nodi interni pari a +/- 1.
Tali alberi prendono il nome di alberi di Fibonacci e sono
gli alberi bilanciati in altezza con il minimo numero di
nodi.
Essi provano che un albero di Fibonacci con n nodi ha
altezza < 1.44 log(n+2) 0.328 (omettiamo la prova)
Segue che un albero AVL con n nodi ha altezza O(log n)
e quindi la ricerca di una chiave in un AVL costa O(log n)

Ins e rim e nto in AVL


1.

2.

Il nuovo nodo x viene inserito come in un


BST classico facendo diventare x una
foglia dellalbero
Vengono ricalcolati i fattori di
bilanciamento dei nodi dellalbero che
sono mutati in seguito allinserimento

3.

Solo i nodi nel ramo interessato


allinserimento possono mutare
Si procede dal basso verso lalto

Se nel ramo appare un fattore di


bilanciamento pari a 2 occorre
ribilanciare tramite operazioni chiamate
rotazioni

Es e m pio
34

+1

21
16
6
3

63
30

18

28 32

43
37

29

72

52

-1

78

34

57

21
16

In s er ia m o 8 2

6
3

18

63
30

28 32
29

43
37

0
72

-2

52

78

57

82

-1

Ro taz io ni in AVL
Casi possibili

DD: inserimento nel sottoalbero Destro di


un figlio Destro del nodo che si sbilancia
SD: inserimento nel sottoalbero Sinistro di
un figlio Destro del nodo che si sbilancia
DS: inserimento nel sottoalbero Destro di
un figlio Sinistro del nodo che si sbilancia
SS: inserimento nel sottoalbero Sinistro di
un figlio Sinistro del nodo che si sbilancia

Ro taz io ni

(1 )

Lidea alla base delle operazioni di


rotazione quella di portare
lelemento centrale alla radice
dellalbero e di far discendere
lelemento che causa lo
sbilanciamento
Sono operazioni simmetriche a coppie
Analizzeremo i casi SS e SD
I casi DD e DS sono analoghi ai casi
SS e SD

Ro taz io ni

(2 )
10

+ 2 10
+ 1 10

Inserimento di 5
+1 6

Rotazione SS

0 6

0 6
0
Bilanciato

0 5

Bilanciato

Sbilanciato
+ 2 10

+ 1 10

Inserimento di 7
-1 6

0 10

0 7
Rotazione SD

0 6

0 10

0 6
0 7
Bilanciato

Sbilanciato

Bilanciato

Ro taz io ne s e m plice SS
+ 1A

+2A

0 B

+ 1B

0 A

h
h

0 B

h
h+ 1

h+ 1

Gli antenati di A non sono interessati


allinserimento perch in seguito alla
rotazione recuperano il loro fattore di
bilanciamento precedente

Ro taz io ne do ppia SD

Ottenuta eseguendo due rotazioni


semplici

(1 )

x = nodo inserito
A = nodo critico
C = left(A) antenato di x

Rotazione SD

Rotazione a sinistra su C
Rotazione a destra su A

Ro taz io ne do ppia SD
C<x<B

+ 1A
0 C

0 B
h- 1

(2 )

+2A

sottoalbero
sinistro di B - 1 C

h- 1

+1B
h- 1

A +2
+2

0 C

0 B
h- 1

-1A

0 C

h- 1

Gli antenati di A non sono interessati allinserimento

Ins e rim e nto in AVL


1.
2.

3.
4.

5.
6.

(1 )

Cerca la posizione dove inserire la chiave k


Durante la ricerca memorizza il nodo pi
basso y il cui fattore di bilanciamento (fdb)
+1 o 1
Inserisci k
Aggiorna il fdb dei nodi nel percorso da k a
y. Tutti i nodi in tale percorso hanno fdb
pari a 0 che diventer +1 o 1
Verifica se y stato sbilanciato
Ribilancia y con la rotazione appropriata

Ins e rim e nto in AVL

(2 )

Condizioni per lo sbilanciamento:

y->getFdb() == +1
1.Si inserisce a destra.
2.Si inserisce a sinistra-sinistra.
3.Si inserisce a sinistra-destra.

y->getFdb() == -1 Simmetrico a sopra

Ins e rim e nto in AVL


1.Si inserisce a destra
+1y
0 B

h
h

0 B

h+ 1

(3 )

Ins e rim e nto in AVL

(4 )

2.Si inserisce a sinistra-sinistra

+2y

+1y
+ 1B

0 B

0 y

h
h

0 B

h+ 1

h+ 1

Ins e rim e nto in AVL

(5 )

3.Si inserisce a sinistra-destra


+2 y

+1y
0 C

0 B
h- 1

-1C

h- 1

+1B
h- 1

y +2
+2

0 C

0 B
h- 1

-1 y

0 C

h- 1

Es e m pio
34
21
16
6

63
30

43

28 32

18

37

72

52

29

+1

-1

Inseriamo k = 2
78
34

57
21

63

34
21
16
3
2

18
6

16

63
30

28 32
29

43
37

72

52
57

SS

+2

78

3
2

30
18

+1

28 32

43
37

29

72

52
57

x= 6

78

Co s to ins e rim e nto in AVL


1.
2.
3.
4.
5.
6.

Proporzionale allaltezza dellalbero O(log n)


Proporzionale allaltezza dellalbero O(log n)
Costo costante O(1)
Proporzionale allaltezza dellalbero O(log n)
Costo costante O(1)
Costo costante O(1)

Costo totale:

O(log n)

Pre s taz io ni ins e rim e nto (1 )


1.Valori Casuali

Viene inserita una sequenza di n valori


presa tra le n! permutazioni possibili di un
insieme finito di n elementi.
AVL: costo O(nlogn).
BST: costo O(nlogn) infatti si dimostra che
una sequenza di questo tipo genera un
albero alto logn.
Inoltre i BST non devono fare le rotazioni.

Pre s taz io ni ins e rim e nto (2 )

Pre s taz io ni ins e rim e nto (3 )


2.Valori Crescenti

Viene inserita una sequenza di valori


crescenti.
AVL: costo O(nlogn)
BST: costo O(n2) il caso peggiore perch
l'albero degenera in una lista

Costo
Costo
Costo
Costo

1 inserimento c
2 inserimento 2c
i inserimento c*i
n
totale i =1

ci =cn n1/2=O n

Pre s taz io ni Ins e rim e nto (4 )

Cance llaz io ne in AVL


1.
2.

3.

(1 )

Cancellare il nodo come in un BST classico


Ricalcolare i fattori di bilanciamento che sono
mutati in seguito alla cancellazione
Si procede dal basso verso lalto solo nel
ramo interessato alla cancellazione
Nel caso in cui il nodo da eliminare ha due
figli si devono ricalcolare i Fdb del percorso
che va dal nodo da eliminare al suo
successore
Per ogni nodo con fattore di bilanciamento pari
a 2 occorre operare una rotazione semplice o
doppia
O(log n) rotazioni nel caso peggiore

Cance llaz io ne in AVL

(2 )

Condizioni per lo sbilanciamento

Nel percorso dal nodo cancellato alla


radice ed eventualmente in quello dal
nodo cancellato al suo successore
a.se si cancella a sinistra del nodo corrente e
questo aveva fdb == -1
1.Il sottoalbero non si sbilancia
2.Il sottoalbero destro ha il ramo sinistro pi lungo ->
occorre una rotazione ds
3.Altrimenti -> occorre una rotazione dd

b. Se si cancella a destra del nodo corrente e


questo aveva fdb == +1 (simmetrico ad a) )

Cance llaz io ne in AVL

(3 )

3.occorre una rotazione dd


A -1
A -2
B 0
B -1

B -1
0 A

C 0

C 0

C 0

2. occorre una rotazione ds


A -1

A -2

A -2
C 0

B +1

B +1

C -1
0 A

C 0

C 0

B 0

B0

Cance llaz io ne in AVL

(4 )

8
3

13

5
248

11
6

9
7

Cosa succede se
cancelliamo la chiave 2?

16

12

19

15
18

14

10

20

17
8

8
5
6

3
1

11
7

9
10

12

13

13

19

15
14

18

DS
20

11

16

248

6
7

17

In seguito alla rotazione si sbilanciato 8

10

12

16
19

15
14

18
17

20

Co s to cance llaz io ne

Nel caso peggiore occorre effettuare


rotazioni (semplici o doppie) lungo tutto il
ramo interessato dalla cancellazione
1.

Costo proporzionale allaltezza dellalbero O(log n)

2.

Costo proporzionale allaltezza dellalbero O(log n)

3.

Costo di una rotazione (O(1)) per ogni nodo nel


ramo interessato dalla cancellazione O(log n)

Costo totale: O(log n)

Pre s taz io ni cance llaz io ne (1 )

Valori casuali

Pre s taz io ni cance llaz io ne (2 )

Valori decrescenti

Anim az io ne
URL:

http://webpages.ull.es/users/jriera/Docencia/AVL/AVL tree applet.htm