La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "Alberi di ricerca binari Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino."— Transcript della presentazione:

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

2 A.A. 2004/2005APA-bst2 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 dizionari o di code prioritarie.

3 A.A. 2004/2005APA-bst3 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 key, e sono ordinati in base ad esso

4 A.A. 2004/2005APA-bst4 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]

5 A.A. 2004/2005APA-bst5 Relazione di ordinamento (II) x x x

6 A.A. 2004/2005APA-bst6 Esempio I 5 37 258 La relazione di ordinamento è verificata: l'albero è un BST

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

8 A.A. 2004/2005APA-bst8 Esempio 9 3 7 2 5 8 La relazione di ordinamento NON è verificata: l'albero NON è un BST

9 A.A. 2004/2005APA-bst9 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.

10 A.A. 2004/2005APA-bst10 Esempio I 5 37 258 Albero bilanciato

11 A.A. 2004/2005APA-bst11 Esempio II 9 3 7 2 5 8 Albero NON bilanciato

12 A.A. 2004/2005APA-bst12 Complessità I BST sono definiti in modo tale che le operazioni abbiano una complessità proporzionale allaltezza h dellalbero. 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).

13 A.A. 2004/2005APA-bst13 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

14 A.A. 2004/2005APA-bst14 Attraversamento Preorder Preorder-Tree-Walk(x) 1if x NIL 2then print key[x] 3Preorder-Tree-Walk(left[x]) 4Preorder-Tree-Walk(right[x])

15 A.A. 2004/2005APA-bst15 Attraversamento Inorder Inorder-Tree-Walk(x) 1if x NIL 2then Inorder-Tree-Walk(left[x]) 3print key[x] 4Inorder-Tree-Walk(right[x])

16 A.A. 2004/2005APA-bst16 Attraversamento Postorder Postorder-Tree-Walk(x) 1if x NIL 2then Postorder-Tree-Walk(left[x]) 3Postorder-Tree-Walk(right[x]) 4print key[x]

17 A.A. 2004/2005APA-bst17 Osservazioni Nel caso di un BST T, lattraversamento Inorder (ottenuto chiamando Inorder-Tree- Walk(root[T])) stampa gli elementi nellordine crescente del campo key. Tutti gli attraversamenti hanno complessità (n), in quanto ciascun nodo viene considerato esattamente una volta.

18 A.A. 2004/2005APA-bst18 Esempio 15 618 172037 2413 9

19 A.A. 2004/2005APA-bst19 Esercizio Si fornisca il risultato della visita in Preorder, Inorder, Postorder sul BST visto in precedenza.

20 A.A. 2004/2005APA-bst20 Soluzione (Inorder) 15 618 172037 2413 9 1 2 3 4 5 6 7 8 9 10 11

21 A.A. 2004/2005APA-bst21 Soluzione (Preorder) 15 618 172037 2413 9 1 2 3 45 6 7 8 9 10 11

22 A.A. 2004/2005APA-bst22 Soluzione (Postorder) 15 618 172037 2413 9 1 2 3 4 5 6 7 8 9 10 11

23 A.A. 2004/2005APA-bst23 Esercizio proposto Si definiscano le strutture dati per la rappresentazione di un BST. Si definiscano i prototipi e si implementino le funzioni di visita dellalbero.

24 A.A. 2004/2005APA-bst24 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 dellaltezza h dellalbero.

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

26 A.A. 2004/2005APA-bst26 Esempio 15 618 172037 2413 9 Tree-Search(13)

27 A.A. 2004/2005APA-bst27 Tree-Search iterativa Tree-Search-iterativa(x, k) 1while x NIL and k key[x] 2do if k < key[x] 3then x left[x] 4else x right[x] 5return x

28 A.A. 2004/2005APA-bst28 Esempio 15 618 172037 2413 9 Tree-Search-iterativa(13)

29 A.A. 2004/2005APA-bst29 Minimo e massimo (versioni iterative) Tree-Minimum(x) 1while left[x] NIL 2do x left[x] 3return x Tree-Maximum(x) 1while right[x] NIL 2do x right[x] 3return x

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

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

32 A.A. 2004/2005APA-bst32 Esempio 15 618 172037 2413 9 Tree-Successor (7)

33 A.A. 2004/2005APA-bst33 Esempio 15 618 172037 2413 9 Tree-Successor (7)

34 A.A. 2004/2005APA-bst34 Esempio 15 618 172037 2413 9 Tree-Successor (4)

35 A.A. 2004/2005APA-bst35 Esempio 15 618 172037 2413 9 Tree-Successor (4)

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

37 A.A. 2004/2005APA-bst37 Complessità La complessità di tutte le procedure di ricerca è O(h).

38 A.A. 2004/2005APA-bst38 Inserimento e cancellazione Queste operazioni richiedono di modificare la struttura dati, aggiungendo o togliendo nodi, mantenendo la proprietà di ordinamento propria del BST.

39 A.A. 2004/2005APA-bst39 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.

40 A.A. 2004/2005APA-bst40 Tree-Insert (I) Tree-Insert(T, z) 1y NIL 2x root[T] 3while x NIL 4do y x 5if key[z] { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.it/2/606053/slides/slide_40.jpg", "name": "A.A.", "description": "2004/2005APA-bst40 Tree-Insert (I) Tree-Insert(T, z) 1y NIL 2x root[T] 3while x NIL 4do y x 5if key[z]

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

42 A.A. 2004/2005APA-bst42 Esempio 12 518 152029 17 13 Tree-Insert (13) z

43 A.A. 2004/2005APA-bst43 Esempio 12 518 152029 17 Tree-Insert (13) 13 z y x

44 A.A. 2004/2005APA-bst44 Esempio 12 518 152029 17 Tree-Insert (13) z y 13

45 A.A. 2004/2005APA-bst45 Cancellazione La cancellazione è loperazione 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.

46 A.A. 2004/2005APA-bst46 Casi possibili: 0 figli 1215 516 31220 1013 6 7 1823 1215 516 31220 101823 z 6 7 Se z non ha figli, è sufficiente rimuoverlo

47 A.A. 2004/2005APA-bst47 Casi possibili: 1 figlio 1215 516 31220 10131823 1215 5 31220 101823 z 6 7 6 7 Se z ha un figlio, questo diviene il nuovo figlio del padre di z 13

48 A.A. 2004/2005APA-bst48 Casi possibili: 2 figli (I) 1215 516 31220 10131823 1215 516 31220 101823 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

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

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

51 A.A. 2004/2005APA-bst51 Tree-Delete (III) 14if y z 15then key[z] key[y] 16fields[z] fields[y] 17return y Eventualmente, ricopia le informazioni del successore nel nodo da eliminare

52 A.A. 2004/2005APA-bst52 Complessità La complessità di tutte le procedure di modifica dellalbero (inserimento e cancellazione) è O(h).

53 A.A. 2004/2005APA-bst53 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)

54 A.A. 2004/2005APA-bst54 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

55 A.A. 2004/2005APA-bst55 Soluzione (I) 6 38 1579 024 Insert() nellordine: 6, 3, 1, 0, 2, 5, 4, 8, 7, 9

56 A.A. 2004/2005APA-bst56 Soluzione (II) 9 Insert() nellordine: 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 8 7 6 5 4 3 2 1 0

57 A.A. 2004/2005APA-bst57 C: definizione di tipo typedef struct btnode *P_NODE; struct btnode{ intkey; P_NODEleft, right; }NODE;

58 A.A. 2004/2005APA-bst58 Procedura inorder void inorder( P_NODE head) { if( head == NULL) return; inorder( head->left); printf( "%d ", head->key); inorder( head->right); }

59 A.A. 2004/2005APA-bst59 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; }

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

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

62 A.A. 2004/2005APA-bst62 Programma chiamante P_NODEhead=NULL; … if( !insert( key, &head)) printf( "Errore in inserimento \n"); … if( search( key, head)) printf( "Trovato\n"); else printf( "Non trovato\n"); … inorder( head);

63 A.A. 2004/2005APA-bst63 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)).


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

Presentazioni simili


Annunci Google