• Non ci sono risultati.

Alberi Bilanciati di Ricerca Alberi Bilanciati di Ricerca

N/A
N/A
Protected

Academic year: 2021

Condividi "Alberi Bilanciati di Ricerca Alberi Bilanciati di Ricerca"

Copied!
28
0
0

Testo completo

(1)

Alberi Bilanciati di Ricerca Alberi Bilanciati di Ricerca

Damiano Macedonio

Università Ca' Foscari di Venezia mace@unive.it

(2)

Copyright © 2009, 2010 Moreno Marzolla, Università di Bologna (http://www.moreno.marzolla.name/teaching/ASD2010/)

Modifications Copyright c 2012, Damiano Macedonio, Università Ca' Foscari di Venezia This work is licensed under the Creative Commons Attribution-NonCommercial-

ShareAlike License. To view a copy of this license, visit

http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative Commons,

(3)

Introduzione

Abbiamo visto che in un ABR è possibile inserire, rimuovere e individuare nodi data la corrispondente chiave in tempo O(h) con h=altezza dell'albero

Un albero binario completo con n nodi ha altezza h=Θ(log n)

Tuttavia, inserimenti e rimozioni di nodi possono

“sbilanciare” l'albero

Domanda: individuare una sequenza di n inserimenti in un ABR inizialmente vuoto tali che al termine, l'albero risultante abbia altezza Θ(n)

Il nostro obbiettivo: mantenere bilanciato un ABR,

(4)

Alberi AVL

Un albero AVL è un albero di ricerca (quasi) bilanciato

Un albero AVL con n nodi supporta le operazioni insert(), delete(), lookup() con costo O(log n) nel caso pessimo

Adelson-Velskii, G.; E. M. Landis (1962). "An algorithm for the organization of information". Proceedings of the USSR Academy of Sciences 146: 263–266

Georgy Maximovich Adelson-Velsky (1922—)

http://chessprogramming.wikispaces.com/Georgy+Adelson-Velsky

(5)

Alcune definizioni

Fattore di bilanciamento

Il fattore di bilanciamento β(v) di un nodo v è dato dalla differenza tra l'altezza del sottoalbero sinistro e del

sottoalbero destro di v:

β(v) = altezza(sin(v)) – altezza(des(v))

Bilanciamento in altezza

Un albero si dice bilanciato in altezza se le altezze dei

sottoalberi sinistro e destro di ogni nodo differiscono al più di uno

In altre parole, un albero è bilanciato in altezza se per ogni suo nodo v, si ha |β(v)|≤1

(6)

Esempio

v v

β(v)=0 β(v)=-3

(7)

Esempio

t

v

β(v)=0 β(t)=2

(8)

Altezza di un albero AVL

Per valutare l'altezza di un albero AVL, consideriamo gli alberi “più sbilanciati” che si possano costruire

Alberi di Fibonacci

T0 T1 T2 T3 Tn

Tn-1

Tn-2

(9)

Altezza di un albero Fibonacci

Consideriamo un albero di Fibonacci di altezza h. Sia nh il numero dei nodi

Per costruzione si ha

Dimostriamo che

ove Fn è l'n-esimo numero di Fibonacci

n

h

=n

h−1

n

h−2

1

n

h

=F

h3

−1

(10)

Altezza di un albero Fibonacci

Base: h=0

n0 = 1

F3 = 2

Passo induttivo

T0

n

h

=F

h3

−1

n

h

= n

h−1

n

h−2

1

= F

h2

−1F

h1

−11

= F

h2

F

h1

−1

= F

h3

−1

(11)

Altezza di un albero di Fibonacci

Quindi ricapitolando: un albero di Fibonacci di altezza h ha Fh+3 – 1 nodi

Ricordiamo che

da cui otteniamo

e possiamo quindi concludere che

F

h

=

h

,≈1.618

n

h

=F

h3

−1=

h

(12)

Conclusione

Poiché...

l'albero di Fibonacci con n nodi è quello che tra tutti gli alberi AVL con n nodi ha altezza massima;

l'altezza di un albero di Fibonacci con n nodi è proporzionale a (log n)

...si conclude che:

l'altezza di un albero AVL con n nodi è O(log n)

(13)

Mantenere il bilanciamento

La ricerca in un albero AVL viene effettuata come in un generico ABR

Inserimenti e rimozioni invece richiedono di essere modificati per mantenere il bilanciamento dell'albero

Esempio

9

8 13

9

8 13

Inserimento del valore 6

v

(14)

Rotazioni

L'operazione fondamentale per ribilanciare l'albero è la rotazione semplice

Domanda: dimostrare che la rotazione semplice preserva la proprietà d'ordine degli ABR

v

u

T3

v

u

T1

Uso v come perno

Uso u come perno

(15)

Rotazioni

Supponiamo che a seguito di un inserimento o

cancellazione, una parte dell'albero sia sbilanciata

Abbiamo quattro casi (simmetrici due a due)

(16)

Ribilanciamento: rotazione SS

v

u

T1 T2

T3

h+2 h

+2

v u

T1

T2 T3

h+1 h+1

0

Si applica una rotazione semplice verso destra su v

Ha costo O(1)

(17)

Ribilanciamento: rotazione SD (non funziona!)

v

u

T1 T2

T3

h+2 h

+2

v u

T1

T2 T3

h h+2

-2

Non si ribilancia!

(18)

Ribilanciamento: rotazione SD primo passo

v

z

T1 T2

w T4

T3

v

z

T1

T2

T4 w

T3

(19)

Ribilanciamento: rotazione SD secondo passo

v

z

T1 T2

T4

w

T3

v z

T1 T2

T4

w

T3

(20)

Ribilanciamento: rotazione SD caso 1

v

z

T1 T2

T4

h h

+2

w

T3 -1

h-1

w

z

0

0 v

h-1

-1

Rotazione doppia: la prima a sinistra con perno z, la seconda a

destra con perno v

(21)

Ribilanciamento: rotazione SD caso 2

v

z

T1 T2

T4

h h

+2

w

T3

-1

h-1

w

z

0

1 v 0

Rotazione doppia: la prima a sinistra con perno z, la seconda a

destra con perno v

(22)

Alberi AVL: Inserimento

Si inserisce il nuovo valore come per gli ABR

Si ricalcolano tutti i fattori di bilanciamento mutati

Al più il ricalcolo riguarderà un cammino dalla foglia appena inserita fino alla radice, quindi ha costo O(log n)

Se un nodo presenta fattore di bilanciamento ±2 (nodo critico), occorre ribilanciare l'albero mediante una delle rotazioni viste

Nota: in caso di inserimento, il nodo critico è unico

Costo complessivo: O( log n )

(23)

Alberi AVL: Rimozione

Si rimuove il nodo come per gli ABR

Si ricalcolano tutti i fattori di bilanciamento mutati

Al più il ricalcolo riguarderà un cammino dal padre del nodo eliminato fino alla radice, quindi ha costo O(log n)

Per ogni nodo con fattore di bilanciamento ±2, occorre ribilanciare l'albero mediante una delle rotazioni viste

Nota: nel caso della rimozione, possono comparire più nodi con fattori di bilanciamento ±2

Costo complessivo: O( log n )

(24)

1

Esempio: cancellazione con rotazioni a cascata

8

13

11 16

14

15

19

17 20

18

9 12

10 3

2 5

4 6

7

(25)

Applicare rotazione a sinistra su 3

8

13

11 16

14

15

19

17 20

18

9 12

10 3

2 5

4 6

7

(26)

Applicare rotazione a sinistra su 8

8

13

11 16

14

15

19

17 20

18

9 12

10

3

2

5

4

6

7

(27)

Albero ribilanciato

8

13

11

16 14

15

19

17 20

18

9 12

10 3

2

5

4

6

7

(28)

Alberi AVL: Riassunto

search( Key k )

O( log n ) nel caso peggiore

insert( Key k, Item t )

O( log n ) nel caso peggiore

delete( Key k )

O( log n ) nel caso peggiore

Riferimenti

Documenti correlati

Siccome gli alberi che rappresentano la partizione sono bilanciati, Find (e quindi anche Union) ha prestazioni garantite O(log n).. 4.3 Esempi di alberi

• Nella rappresentazione basata sui nodi ogni nodo di un albero binario avrà due riferimenti a ciascuno dei figli (Left e Right). In alcune implementazioni si può avere anche

Definire la classe AlberoBRConDuplicatiInLista come estensione di AlberoBR per mantenere i duplicati (elementi distinti ma di chiavi uguali) in una lista contenuta in un nodo (cioè

Scrivere un programma che legga da tastiera una sequenza di n interi NON distinti e li inserisca senza duplicati in una tabella hash di dimensione 2n posizioni utilizzando

Scrivere un programma che legga da tastiera una sequenza di N interi di- stinti e li inserisca in un albero binario di ricerca (senza ribilanciamento).. Il programma deve

Dato un albero binario i cui nodi sono colorati di rosso o di nero, progettare un algoritmo efficiente che calcoli il numero di nodi aventi lo stesso numero di discendenti rossi

§ La strategia dell’algoritmo di Sollin e Boruvka per il Minimum Spanning Tree è di aggregare a due a due gli alberi di una foresta di n alberi nulli (uno per ogni vertice di

Un modo diverso è quello di prendere la prima carta sul mazzo e metterla sul tavolo; passare poi in rassegna le altre carte, dividendole in due mazzetti: a sinistra della prima