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]
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