63
Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

Embed Size (px)

Citation preview

Page 1: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

Alberi di ricerca binari

Fulvio Corno, Matteo Sonza ReordaDip. Automatica e Informatica

Politecnico di Torino

Page 2: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 2

Introduzione

Gli alberi di ricerca binari (Binary Search Tree, o BST) sono una struttura dati che supporta in modo efficiente le operazioni SEARCH, MINIMUM, MAXIMUM, PREDECESSOR, SUCCESSOR, INSERT, DELETE.Sono utili come implementazione di dizionari o di code prioritarie.

Page 3: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 3

DefinizioneAlbero binario di ricerca: Albero: struttura gerarchica con una

radice. Esiste un solo percorso dalla radice a ciascun nodo. Tale percorso definisce delle relazioni padre-figlio

Binario: ogni nodo ha al più 2 figli (left e right) e (salvo la radice) esattamente un padre (p)

Ricerca: i nodi hanno un campo chiave key, e sono ordinati in base ad esso

Page 4: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 4

Relazione di ordinamento (I)

Per ciascun nodo x vale che: Per tutti i nodi y nel sottoalbero

sinistro di x, key[y]key[x] Per tutti i nodi y nel sottoalbero

destro di x, key[y]key[x]

Page 5: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 5

Relazione di ordinamento (II)

x

x x

Page 6: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 6

Esempio I

5

3 7

2 5 8

La relazione di ordinamento è

verificata:l'albero è un

BST

Page 7: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 7

Esempio

5

3

7

2

5

8

La relazione di ordinamento è

verificata:l'albero è un

BST

Page 8: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 8

Esempio

9

3

7

2

5

8

La relazione di ordinamento NON è

verificata:l'albero NON è un

BST

Page 9: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 9

Alberi bilanciati

Un albero binario si dice bilanciato se per ogni suo nodo vale che il numero di nodi nel sottoalbero di sinistra differisce al più di una unità dal numero di nodi nel sottoalbero di destra.

Page 10: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 10

Esempio I

5

3 7

2 5 8

Albero bilanciato

Page 11: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 11

Esempio II

9

3

7

2

5

8

Albero NON bilanciato

Page 12: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 12

ComplessitàI BST sono definiti in modo tale che le operazioni abbiano una complessità proporzionale all’altezza h dell’albero.Per un albero completo e bilanciato con n nodi, la complessità è quindi (log n) nel caso peggiore. Per un albero totalmente sbilanciato, invece, si ricade nel caso peggiore O(n).Per un albero casuale ci si aspetta (log n).

Page 13: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 13

AttraversamentiDato un BST, è possibile definire delle operazioni di attraversamento, ossia di visita di tutti i nodi, secondo 3 ordini diversi: Preorder: prima il nodo, poi i due

sottoalberi Inorder: prima il sottoalbero sinistro,

poi il nodo, poi il sottoalbero destro Postorder: prima i due sottoalberi, poi

il nodo

Page 14: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 14

Attraversamento Preorder

Preorder-Tree-Walk(x)1 if x NIL2 then print key[x]3 Preorder-Tree-Walk(left[x])4 Preorder-Tree-Walk(right[x])

Page 15: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 15

Attraversamento Inorder

Inorder-Tree-Walk(x)1 if x NIL2 then Inorder-Tree-Walk(left[x])3 print key[x]4 Inorder-Tree-Walk(right[x])

Page 16: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 16

Attraversamento Postorder

Postorder-Tree-Walk(x)1 if x NIL2 then Postorder-Tree-Walk(left[x])3 Postorder-Tree-Walk(right[x]) 4 print key[x]

Page 17: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 17

Osservazioni

Nel caso di un BST T, l’attraversamento Inorder (ottenuto chiamando Inorder-Tree-Walk(root[T])) stampa gli elementi nell’ordine crescente del campo key.Tutti gli attraversamenti hanno complessità (n), in quanto ciascun nodo viene considerato esattamente una volta.

Page 18: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 18

Esempio

15

6 18

17 203 7

2 4 13

9

Page 19: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 19

Esercizio

Si fornisca il risultato della visita in Preorder, Inorder, Postorder sul BST visto in precedenza.

Page 20: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 20

Soluzione (Inorder)

15

6 18

17 203 7

2 4 13

9

1

2

3

4

5

6

7

8

9

10

11

Page 21: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 21

Soluzione (Preorder)

15

6 18

17 203 7

2 4 13

9

1

2

3

4 5

6

7

8

9

10 11

Page 22: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 22

Soluzione (Postorder)

15

6 18

17 203 7

2 4 13

9

12

3

4

5

6

7

89

10

11

Page 23: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 23

Esercizio proposto

Si definiscano le strutture dati per la rappresentazione di un BST.Si definiscano i prototipi e si implementino le funzioni di visita dell’albero.

Page 24: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 24

Operazioni di ricerca nei BST

I BST sono particolarmente ottimizzati per le funzioni di ricerca: Search, Minimum/Maximum, Predecessor/Successor.La loro complessità è O(h), in funzione dell’altezza h dell’albero.

Page 25: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 25

Tree-Search

Tree-Search(x, k)1 if x = NIL or k = key[x]2 then return x3 if k < key[x]4 then return Tree-Search(left[x], k)5 else return Tree-Search(right[x], k)

Page 26: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 26

Esempio

15

6 18

17 203 7

2 4 13

9Tree-Search(13)

Page 27: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 27

Tree-Search iterativa

Tree-Search-iterativa(x, k)1 while x NIL and k key[x]2 do if k < key[x]3 then x left[x]4 else x right[x]5 return x

Page 28: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 28

Esempio

15

6 18

17 203 7

2 4 13

9Tree-Search-iterativa(13)

Page 29: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 29

Minimo e massimo(versioni iterative)

Tree-Minimum(x)1 while left[x] NIL2 do x left[x]3 return x

Tree-Maximum(x)1 while right[x] NIL2 do x right[x]3 return x

15

6 18

17 203 7

2 4 13

9

15

6 18

17 203 7

2 4 13

9

15

6 18

17 203 7

2 4 13

9

15

6 18

17 203 7

2 4 13

9

Page 30: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 30

SuccessoreDato un nodo, determinare il nodo immediatamente successivo. Vi sono 2 casi:

x

p[x] x

p[x]Il minimo del sottoalbero di

destra

Il primo padre di cui il nodo è nel sottoalbero

sinistro

Page 31: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 31

SuccessoreTree-Successor(x)1 if right[x] NIL2 then return Tree-Minimum(right[x])3 y p[x]4 while y NIL and x = right[y]5 do x y6 y p[y]7 return y

Page 32: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 32

Esempio

15

6 18

17 203 7

2 4 13

9Tree-Successor(7)

Page 33: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 33

Esempio

15

6 18

17 203 7

2 4 13

9Tree-Successor(7)

Page 34: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 34

Esempio

15

6 18

17 203 7

2 4 13

9Tree-Successor(4)

Page 35: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 35

Esempio

15

6 18

17 203 7

2 4 13

9Tree-Successor(4)

Page 36: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 36

PredecessoreTree-Predecessor(x)1 if left[x] NIL2 then return Tree-Maximum(left[x])3 y p[x]4 while y NIL and x = left[y]5 do x y6 y p[y]7 return y

Page 37: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 37

Complessità

La complessità di tutte le procedure di ricerca è O(h).

Page 38: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 38

Inserimento e cancellazione

Queste operazioni richiedono di modificare la struttura dati, aggiungendo o togliendo nodi, mantenendo la proprietà di ordinamento propria del BST.

Page 39: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 39

Inserimento

Dato un BST, inserire un nodo z di chiave v: Si crea un nuovo nodo z, con

left[z]=right[z]=NIL Si trova la posizione in cui inserirlo,

simulando la ricerca di key[z] Si aggiornano i puntatori

Il nuovo nodo è sempre inserito come una nuova foglia.

Page 40: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 40

Tree-Insert (I)

Tree-Insert(T, z)1 y NIL2 x root[T]3 while x NIL4 do y x5 if key[z]<key[x]6 then x left[x]7 else x right[x]

Ricerca key[z]

nell’albero

y

z

x=NIL

Page 41: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 41

Tree-Insert (II)

8 p[z] y9 if y = NIL10 then root[T] z11 else if key[z] < key[y]12 then left[y] z13 else right[y] z

y

z

x=NIL

Inserisce z come figlio

di y

Page 42: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 42

Esempio

12

5 18

15 202 9

17

13Tree-Insert(13) z

Page 43: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 43

Esempio

12

5 18

15 202 9

17

Tree-Insert(13)

13

z

y

x

13

Page 44: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 44

Esempio

12

5 18

15 202 9

17

Tree-Insert(13) z

y

13

Page 45: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 45

Cancellazione

La cancellazione è l’operazione più complessa sui BST, in quanto il nodo da cancellare potrebbe avere 0, 1 o 2 figli, e occorre “ricollegare” i nodi rimasti in assenza di quello cancellato.

Page 46: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 46

Casi possibili: 0 figli

1215

5 16

3 12 20

10 13

6

7

18 23

1215

5 16

3 12 20

10 18 23z

6

7Se ‘z’ non ha figli, è sufficiente rimuoverlo

Page 47: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 47

Casi possibili: 1 figlio

1215

5 16

3 12 20

10 13 18 23

1215

5

3 12 20

10 18 23

z

6

7

6

7Se ‘z’ ha un figlio, questo diviene il nuovo figlio del

padre di ‘z’

13

Page 48: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 48

Casi possibili: 2 figli (I)

1215

5 16

3 12 20

10 13 18 23

1215

5 16

3 12 20

10 18 23

z

Se ‘z’ ha 2 figli, si elimina il suo successore e si copia il successore

nella posizione di ‘z’

z

6

7

6

7

13

Page 49: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 49

Tree-Delete (I)

Tree-Delete(T, z)1 if left[z]=NIL or right[z]=NIL2 then y z3 else y Tree-Successor(z)4 if left[y] NIL5 then x left[y]6 else x right[y]

y: nodo da eliminare

x: unico figlio di y

12y

x

Page 50: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 50

Tree-Delete (II)

7 if x NIL8 then p[x] p[y]9 if p[y] = NIL10 then root[T] = x11 else if y = left[p[y]]12 then left[p[y]] x13 else right[p[y]] x

Se no, collega x al padre di y

Aggiorna padre di x

y è la radice? x diviene radice

12y

x

Page 51: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 51

Tree-Delete (III)

14 if y z15 then key[z] key[y]16 fields[z] fields[y]17 return y Eventualmente,

ricopia le informazioni del successore nel

nodo da eliminare

Page 52: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 52

Complessità

La complessità di tutte le procedure di modifica dell’albero (inserimento e cancellazione) è O(h).

Page 53: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 53

Bilanciamento

Le operazioni hanno complessità O(h): in un albero completamente bilanciato

h = log2 n

in un albero completamente sbilanciato

h = n Le operazioni sui BST hanno quindi

complessità variabile tra O(log2 n) e O(n)

Page 54: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 54

Esercizio

Si vuole costruire un BST contenente gli elementi interi da 0 a 9. Si fornisca almeno una sequenza di

chiamate alla funzione Insert che crei un BST bilanciato

Si fornisca almeno una sequenza di chiamate alla funzione Insert che crei un BST sbilanciato

Page 55: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 55

Soluzione (I)

6

3 8

1 5 7 9

0 2 4 Insert() nell’ordine: 6, 3, 1, 0, 2, 5, 4, 8,

7, 9

Page 56: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 56

Soluzione (II)

9

Insert() nell’ordine: 9, 8, 7, 6, 5, 4, 3, 2,

1, 0

87

65

43

21

0

Page 57: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 57

C: definizione di tipo

typedef struct btnode *P_NODE;

struct btnode{

int key;

P_NODE left,

right;

}NODE;

Page 58: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 58

Procedura inorder

void inorder( P_NODE head)

{

if( head == NULL)

return;

inorder( head->left);

printf( "%d ", head->key);

inorder( head->right);

}

Page 59: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 59

Procedura searchP_NODE search( int key, P_NODE head)

{

if((head == NULL)!!(head->key == key))

return( head);

else

if( head->key < key)

return head->right;

else

return head->left;

}

Page 60: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 60

Procedura insert (I)int insert( int key, P_NODE *phead){ if( *phead == NULL)

{ if((*phead=(P_NODE)malloc (sizeof(NODE))) == NULL)

return( 0); else { (*phead)->key = key; (*phead)->left = NULL; (*phead)->right = NULL; return( 1); } }

Page 61: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 61

Procedura insert (II)

else if( (*phead)->key == key) { printf("Elemento gia` presente \n");

return( 0); } else if( (*phead)->key < key) return( insert( key,

&((*phead)->right))); else return( insert( key,

&((*phead)->left)));}

Page 62: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 62

Programma chiamanteP_NODE head=NULL;…if( !insert( key, &head))

printf( "Errore in inserimento \n"); …if( search( key, head))

printf( "Trovato\n");else

printf( "Non trovato\n");…inorder( head);

Page 63: Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

A.A. 2004/2005 APA-bst 63

Alberi bilanciati

Le procedure Insert e Delete sono in grado di mantenere la proprietà di ordinamento dei BST, ma non garantiscono affatto il bilanciamento.Esistono versioni più sofisticate degli alberi binari nelle quali viene garantito anche il bilanciamento.Esempio: alberi red-black (per i quali si dimostra che: h 2 log2(n+1)).