11 - bst - Politecnico di Torino

Download Report

Transcript 11 - bst - Politecnico di Torino

Alberi di ricerca binari

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

A.A. 2004/2005

Introduzione

Gli alberi di ricerca binari (Binary Search Tree, o BST) sono una struttura dati che supporta in modo efficiente le operazioni S EARCH , M INIMUM , M AXIMUM , P REDECESSOR , S UCCESSOR , I NSERT , D ELETE .

Sono utili come implementazione di di code prioritarie.

dizionari o APA-bst 2

A.A. 2004/2005

Definizione

Albero 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 e sono ordinati in base ad esso

key

, APA-bst 3

A.A. 2004/2005

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] APA-bst 4

Relazione di ordinamento (II)

x A.A. 2004/2005  x APA-bst  x 5

2

Esempio I

5 3 5 La relazione di ordinamento è verificata: l'albero è un BST 7 8 A.A. 2004/2005 APA-bst 6

A.A. 2004/2005

Esempio

2 3 5 5 APA-bst La relazione di ordinamento è verificata: l'albero è un BST 7 8 7

A.A. 2004/2005

Esempio

2 3 La relazione di ordinamento NON è verificata: l'albero NON è un BST 7 9 5 APA-bst 8 8

A.A. 2004/2005

Alberi bilanciati

Un albero binario si dice destra.

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 APA-bst 9

2

Esempio I

5 3 5 Albero bilanciato 7 8 A.A. 2004/2005 APA-bst 10

A.A. 2004/2005

Esempio II

2 3 Albero NON bilanciato 7 9 5 APA-bst 8 11

A.A. 2004/2005

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) .

APA-bst 12

A.A. 2004/2005

Attraversamenti

Dato 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 APA-bst 13

A.A. 2004/2005

Attraversamento Preorder

Preorder-Tree-Walk(x) 1 if x  NIL 2 then print key[x] 3 4 Preorder-Tree-Walk(left[x]) Preorder-Tree-Walk(right[x]) APA-bst 14

A.A. 2004/2005

Attraversamento Inorder

Inorder-Tree-Walk(x) 1 if x  NIL 2 then Inorder-Tree-Walk(left[x]) 3 4 print key[x] Inorder-Tree-Walk(right[x]) APA-bst 15

A.A. 2004/2005

Attraversamento Postorder

Postorder-Tree-Walk(x) 1 if x  NIL 2 then Postorder-Tree-Walk(left[x]) 3 4 Postorder-Tree-Walk(right[x]) print key[x] APA-bst 16

A.A. 2004/2005

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.

APA-bst 17

2 3 A.A. 2004/2005

Esempio

15 6 4 7 13 9 APA-bst 17 18 20 18

A.A. 2004/2005

Esercizio

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

APA-bst 19

1 2 A.A. 2004/2005 3 2

Soluzione (Inorder)

8 15 6 4 5 7 17 9 18 10 4 3 13 7 6 9 APA-bst 20 11 20

4 2 3 3

Soluzione (Preorder)

1 15 2 6 6 7 17 10 9 18 5 4 7 13 8 9 A.A. 2004/2005 APA-bst 20 11 21

2 1

Soluzione (Postorder)

15 11 6 7 3 3 7 6 17 8 10 18 4 2 13 5 9 4 APA-bst A.A. 2004/2005 9 20 22

A.A. 2004/2005

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.

APA-bst 23

A.A. 2004/2005

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.

APA-bst 24

Tree-Search

3 4 5 Tree-Search(x, k) 1 2 if x = NIL or k = key[x] then return x if k < key[x] then return Tree-Search(left[x], k) else return Tree-Search(right[x], k) A.A. 2004/2005 APA-bst 25

2 3 A.A. 2004/2005

Esempio

4 6 15 18 7 17 20 9 13 APA-bst Tree-Search(13) 26

A.A. 2004/2005

Tree-Search iterativa

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

2 3 A.A. 2004/2005

Esempio

4 6 15 18 7 17 20 9 13 APA-bst Tree-Search-iterativa(13) 28

Minimo e massimo (versioni iterative)

Tree-Minimum(x) 1 while left[x]  2 do x  NIL left[x] 3 return x A.A. 2004/2005 Tree-Maximum(x) 1 while right[x]  2 3 do x  return x NIL right[x] APA-bst 29

Successore

Dato un nodo, determinare il nodo immediatamente successivo. Vi sono 2 casi: Il minimo del sottoalbero di destra p[x] x p[x] x Il primo padre di cui il nodo è nel sottoalbero sinistro APA-bst 30 A.A. 2004/2005

Successore

5 6 7 Tree-Successor(x) 1 if right[x]  NIL 2 3 4 y  then return Tree-Minimum(right[x]) p[x] while y  NIL and x = right[y] do x  y  p[y] y return y A.A. 2004/2005 APA-bst 31

2 3 A.A. 2004/2005

Esempio

4 6 15 18 7 17 20 9 13 APA-bst Tree-Successor (7) 32

2 3 A.A. 2004/2005

Esempio

4 6 15 18 7 17 20 9 13 APA-bst Tree-Successor (7) 33

2 3 A.A. 2004/2005

Esempio

4 6 15 18 7 17 20 9 13 APA-bst Tree-Successor (4) 34

2 3 A.A. 2004/2005

Esempio

4 6 15 18 7 17 20 9 13 APA-bst Tree-Successor (4) 35

Predecessore

5 6 7 Tree-Predecessor(x) 1 if left[x]  NIL 2 3 4 y  then return Tree-Maximum(left[x]) p[x] while y  NIL and x = left[y] do x  y  p[y] y return y A.A. 2004/2005 APA-bst 36

A.A. 2004/2005

Complessità

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

APA-bst 37

A.A. 2004/2005

Inserimento e cancellazione

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

APA-bst 38

A.A. 2004/2005

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 nuova foglia .

inserito come una APA-bst 39

Tree-Insert (I)

A.A. 2004/2005 3 4 5 6 7 Tree-Insert(T, z) 1 y  NIL 2 x  root[T] while x  do y NIL  x if key[z]then x  else x  Ricerca key[z] left[x] nell’albero right[x] y x=NIL z APA-bst 40

Tree-Insert (II)

A.A. 2004/2005 8 9 10 11 12 13 p[z]  y if y = NIL then root[T]  z Inserisce z come figlio di y else if key[z] < key[y] then left[y]  z else right[y]  z y x=NIL z APA-bst 41

Esempio

12 2 5 9 Tree-Insert (13) A.A. 2004/2005 13 z APA-bst 15 18 17 20 42

Esempio

2 Tree-Insert (13) A.A. 2004/2005 5 9 12 x 13 y 15 13 z APA-bst 18 17 20 43

Esempio

2 Tree-Insert (13) A.A. 2004/2005 5 9 12 13 z APA-bst y 15 18 17 20 44

A.A. 2004/2005

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.

APA-bst 45

Casi possibili: 0 figli

5 16 5 3 10 12 13 z 6 7 A.A. 2004/2005 18 20 23 Se ‘z’ non ha figli, è sufficiente rimuoverlo APA-bst 3 6 10 7 12 16 18 20 23 46

Casi possibili: 1 figlio

5 16 z 5 3 6 10 7 A.A. 2004/2005 12 20 3 13 18 23 10 Se ‘z’ ha un figlio, questo diviene il nuovo figlio del padre di ‘z’ APA-bst 6 7 12 13 18 20 23 47

Casi possibili: 2 figli (I)

z 5 16 z 5 16 3 6 10 7 A.A. 2004/2005 12 20 3 12 13 18 23 10 13 18 6 7 Se ‘z’ ha 2 figli, si elimina il suo successore e si copia il successore nella posizione di ‘z’ 20 23 48

Tree-Delete (I)

12 y x A.A. 2004/2005 2 3 4 Tree-Delete(T, z) 1 if left[z]=NIL or right[z]=NIL then y  else y  z Tree-Successor(z) if left[y]  NIL y: nodo da eliminare 5 6 then x  else x  left[y] right[y] x: unico figlio di y APA-bst 49

Tree-Delete (II)

12 y x A.A. 2004/2005 7 8 9 10 11 12 13 if x  NIL then p[x]  p[y] if p[y] = NIL then root[T] = x Aggiorna padre di x y è la radice? x diviene radice else if y = left[p[y]] then left[p[y]]  else right[p[y]]  x x APA-bst Se no, collega x al padre di y 50

Tree-Delete (III)

A.A. 2004/2005 14 15 16 17 if y  z then key[z]  key[y] fields[z]  fields[y] return y Eventualmente, ricopia le informazioni del successore nel nodo da eliminare APA-bst 51

A.A. 2004/2005

Complessità

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

APA-bst 52

A.A. 2004/2005

Bilanciamento

Le operazioni hanno complessità O(h) :   in un albero completamente bilanciato  h =  log 2 n  in un albero completamente sbilanciato  h = n  Le operazioni sui BST hanno quindi complessità variabile tra O(log 2 n) e O(n) APA-bst 53

A.A. 2004/2005

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 APA-bst 54

0

Soluzione (I)

6 3 1 5 7 8 2 4 9 Insert() nell’ordine: 6, 3, 1, 0, 2, 5, 4, 8, 7, 9 A.A. 2004/2005 APA-bst 55

A.A. 2004/2005

Soluzione (II)

9 0 1 2 3 4 5 6 7 8 Insert() nell’ordine: 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 APA-bst 56

A.A. 2004/2005

C: definizione di tipo

typedef struct btnode *P_NODE; struct btnode{ int key; P_NODE left, right; }NODE; APA-bst 57

A.A. 2004/2005

Procedura inorder

void inorder( P_NODE head) { if( head == NULL) return; inorder( head->left); printf( "%d ", head->key); inorder( head->right); } APA-bst 58

A.A. 2004/2005

Procedura search

P_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; } APA-bst 59

A.A. 2004/2005

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); } } APA-bst 60

Procedura insert (II)

A.A. 2004/2005 } 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))); APA-bst 61

A.A. 2004/2005

Programma chiamante

P_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); APA-bst 62

A.A. 2004/2005

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 log 2 (n+1) ).

APA-bst 63