Alberi. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli.

Documenti analoghi
Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

Alberi Binari di Ricerca

Alberi binari di ricerca

Alberi di ricerca binari

Lezione 15. Algoritmi su gli alberi binari: visite

Alberi binari di ricerca

Algoritmi e Strutture Dati

Problemi di ordinamento

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Esercitazione 6. Alberi binari di ricerca

In questa lezione Alberi binari di ricerca: la cancellazione

ALGORITMI E STRUTTURE DATI

Alberi Binari di Ricerca

Alberi Binari di Ricerca e Alberi Rosso-Neri

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Esercizi su alberi binari

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Algoritmi e strutture dati

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Esercizi Capitolo 6 - Alberi binari di ricerca

alberi binari di ricerca (BST)

Algoritmi e Strutture Dati

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

ALBERI : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

Alberi Binari di Ricerca

Alberi binari di ricerca

Dizionari. Dizionari con gli alberi. Alberi binari di ricerca. Realizzazione con alberi binari di ricerca. Alberi rosso-neri.

Alberi ed Alberi Binari

Algoritmi e Strutture Dati

Introduzione agli algoritmi Prova di esame del 30/6/2016 Prof.sse E. Fachini - R. Petreschi

Alberi binari e alberi binari di ricerca

ADT Dizionario. Ordered search table. Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D:

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

Indici multilivello dinamici (B-alberi e B + -alberi) Alberi di ricerca - 1. Un esempio. Alberi di ricerca - 3. Alberi di ricerca - 2

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Heap e code di priorità

Divide et impera su alberi

Algoritmi e Strutture Dati

Note per la Lezione 4 Ugo Vaccaro

ricerca di un elemento, verifica dell appartenenza di un elemento

Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1

23/10/2016. gli alberi. alcune definizioni. un esempio. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica.

Indici con gli alberi

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Algoritmi e Strutture Dati. HeapSort

ALBERI DI RICERCA BINARI (O ALBERI BINARI DI RICERCA)

ADT Coda con priorità

Alberi rosso-neri. Oltre ad essere alberi binari di ricerca, gli alberi rosso-neri soddisfano le seguenti proprietà:

In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

dizionari alberi bilanciati

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Esercizi di Algoritmi e Strutture Dati

Espressioni aritmetiche

Strutture dati per insiemi disgiunti

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Alberi di ricerca. Alberi binari di ricerca. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Implementazione ADT: Alberi

Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Un esempio: l ADT Dizionario (mutabile) Definizione. Alberi binari di ricerca (BST = binary search tree) search(chiave k) -> elem

Heap Ordinamento e code di priorità. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 9

Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Alberi Rosso-Neri: definizione

Lezione 7 Alberi binari: visite e alberi di ricerca

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Alberi rosso-neri. Le operazioni sugli alberi binari di ricerca hanno complessità proporzionale all altezza h dell albero.

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

Verificare se un albero binario è bilanciato

ADT ALBERO BINARIO (tree)) ADT ALBERO BINARIO

Indice come albero binario di ricerca!

Algoritmi e Strutture Dati

Lezione 12 Tabelle Hash

Prossime lezioni e tutorato!

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Alberi binari. Ilaria Castelli A.A. 2009/2010. Università degli Studi di Siena Dipartimento di Ingegneria dell Informazione

Alberto Montresor Università di Trento

Esercizi di Algoritmi e Strutture Dati

Alberi binari (radicati e ordinati) della radice Il padre del nodo 5 e del nodo 3

Algoritmi di Ordinamento

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Un esempio di mutua ricorsione

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

Alberi e alberi binari I Un albero è un caso particolare di grafo

PROVETTE D ESAME. Algoritmi e Strutture Dati

Algoritmi e strutture dati

Per semplicità eliminiamo le ripetizioni nell'albero.

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Ordinamento per inserzione e per fusione

Introduzione. Heap-binomiali: un heap binomiale è un insieme di alberi binomiali.

In questa lezione Strutture dati elementari: Pila Coda

Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato

Algoritmi di ordinamento

Esercitazioni di Algoritmi e Strutture Dati

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

Transcript:

Alberi Un albero è un insieme di oggetti, chiamati nodi, su cui è definita una relazione binaria G(x, y) che leggiamo x è genitore di y tale che: 1. esiste un unico nodo, chiamato radice, che non ha genitori; 2. ogni nodo x diverso dalla radice ha uno ed unico genitore; 3. per ogni nodo x diverso dalla radice esiste un cammino dalla radice a x (l albero è connesso): esistono nodi x 1,.., x k (k 1) tali che x 1 è la radice dell albero, x k = x e per ogni i = 1,..., k 1 x i è genitore di x i+1. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli. VII-1

Operazioni di base Empty(): restituisce una struttura rappresentante l albero vuoto Null(T): test albero vuoto. Root(T): restituisce il puntatore alla radice dell albero; un errore se T è vuoto. Left(T): restituisce il sottoalbero sinistro di T; un errore se T è vuoto. Right(T): restituisce il sottoalbero destro di T; un errore se T è vuoto. Left-Child(T): restituisce il puntatore al figlio sinistro; un errore se T è vuoto. Right-Child(T): restituisce il puntatore al figlio destro; un errore se T è vuoto. Mktree(x,T1,T2): restituisce l albero con radice x e sottoalberi T1 e T2. VII-2

Rappresentazione di alberi binari mediante puntatori Gli oggetti x rappresentanti i nodi dell albero hanno tre campi key[x]: il valore memorizzato nel nodo. left[x]: puntatore al figlio sinistro (NIL se x non ha figlio sinistro). right[x]: puntatore al figlio destro (NIL se x non ha figlio destro). La rappresentazione T di un albero è un oggetto con un campo root[t]: puntatore alla radice dell albero; NIL se l albero è vuoto. VII-3

Alberi binari di ricerca (ABR) Struttura dati per implementare dizionari: insieme di elementi ordinati secondo una determinata chiave, sul quale è possibile effettuare le operazioni di 1. ricerca di un elemento (Search) 2. inserimento di nuovi elementi nell insieme (Insert) 3. cancellazione di elementi dall insieme (Delete) Le operazioni di base su un ABR richiedono tempo proporzionale all altezza dell albero, quindi, se n è il numero dei nodi dell albero: Θ(lg n) nel caso migliore (albero completo) Θ(n) nel caso peggiore (albero completamente sbilanciato) Θ(lg n) nel caso medio Gli elementi dell insieme sono strutture con un campo key: la chiave dell elemento (oltre ai campi che contengono riferimenti) Sull insieme delle chiavi è definito un ordine totale VII-4

Proprietà degli ABR Per ogni nodo x dell albero tutti i nodi del sottoalbero sinistro di x hanno chiave minore (o uguale) di quella di x tutti i nodi del sottoalbero destro di x hanno chiave maggiore (o uguale) di quella di x Esempio 5 3 7 2 5 8 key[x] la chiave dell elemento Rappresentazione Un nodo x di un ABR è una struttura con i campi: left[x] puntatore al figlio sinistro right[x] puntatore al figlio destro p[x] puntatore al padre VII-5

Stampa delle chiavi in modo ordinato - visita simmetrica INORDER-TREE-WALK(x) 1. if x!= NIL 2. then INORDER-TREE-WALK(left[x]) 3. stampa key[x] 4 INORDER-TREE-WALK(right[x]) Prima chiamata: INORDER-TREE-WALK(root[T]) VII-6

Esercizi 1. Disegnare ABR di altezza 2, 3, 4, 5, 6 sull insieme di chiavi {1, 4, 5, 10, 16, 17, 21} 2. L albero riportato sotto rispetta la proprietà ABR? 10 7 5 12 15 9 20 3. Qual è la differenza tra la proprietà degli ABR e la proprietà di ordinamento dello heap? 4. Descrivere un algoritmo che, dato un albero binario T, verifichi se T rispetta la proprietà ABR. 5. Si supponga che la ricerca di una chiave termini in una foglia. Si considerino: A = l insieme delle chiavi a destra del cammino di ricerca; B = l insieme delle chiavi sul cammino di ricerca; C = l insieme delle chiavi a destra del cammino di ricerca. AFFERAMZIONE: a, b, c, a A, b B, c C si ha a b c Dare il controesempio più piccolo a questa affermazione. VII-7

Verifica della proprietà ABR per un dato albero T applicando la definizione di ABR ;input: un albero binario con radice in t ;output: vero se t e un abr, falso altrimenti ; ;la funzione viene richiamata con la radice dell albero di cui si vuole ;verificare la proprieta abr. abr(t) if t=nil then else return true return ( ) (key[t] >= key[left[t]]) and (key[t] <= key[right[t]]) and abr(left[t]) and abr(right[t]) Abbiamo applicato la definizione correttamente? VII-8

L algoritmo precedente NON verifica la proprietà ABR Controesempio 20 10 30 1 25 Fissato un nodo radice i controlli devono essere eseguiti su tutti i nodi del s.a. sinistro e tutti i nodi del s.a. destro Soluzione Al posto di (key[t] >= key[left[t]]) chiamiamo una funzione che verifica se tutti i nodi del s.a. sinistro sono minori o uguali della radice Al posto di (key[t] <= key[right[t]]) chiamiamo una funzione che verifica se tutti i nodi del s.a. destro sono maggiori o uguali della radice abr(t) if t=nil then return true else return ( minore(left[t],t) and maggiore(right[t],t) and abr(left[t]) and abr(right[t]) ) VII-9

Le funzioni minore e maggiore ; r e il nodo padre, t e il generico puntatore al nodo dell albero minore(t,r) minore(t,r) if t=nil then return true else return((key[t]<=key[r]) and minore(left[t],r) and minore(right[t],r) ) maggiore(t,r) if t=nil then return true else return((key[t]>=key[r]) and maggiore(left[t],r) and maggiore(right[t],r) ) VII-10

Complessità asintotica la complessità asintotica è O(n log n) nel caso migliore sia n il numero di nodi dell albero di cui vogliamo verificare la proprietà ABR; alla prima attivazione la funzione abr richiama maggiore e minore su un numero di nodi uguale a (n 1)/2. Poiché la complessità della visita di un albero di n nodi è O(n) si ha: T maggiore ((n 1)/2) + T minore ((n 1)/2) = O(n) la funzione abr viene chiamata ricorsivamente 2 volte: una sul s.a. sinitro e una sul s.a. destro. Analisi delle diverse configurazioni dell albero: Caso migliore: l albero è bilanciato T abr (n) = c 0 se n = 0 2 T(n/2) + O(n) se n > 0 Quindi siamo nel II caso del Master Theorem e T abr (n) = O(n log n). Caso peggiore: l albero è completamente sbilanciato Quindi T abr (n) = O(n 2 ). T abr (n) = c 0 se n = 0 T(n 1) + O(n) se n > 0 Si può migliorare la complessità asintotica? Per migliorare la complessità asintotica di un algoritmo servono considerazioni più approfondite, stratagemmi (leciti), uso di strutture ausiliarie... VII-11

Analisi della struttura ABR Se i sottoalberi più profondi sono ABR il massimo e il minimo si trovano rispettivamente nel ramo più a destra e nel ramo più a sinistra. Esempio: Nuova proprietà Per ogni nodo non foglia la chiave del nodo è compresa tra il massimo del s.a. sinistro e il minimo del s.a. destro. VII-12

Algoritmo più furbo si parte dal basso verificando che i sottoalberi a profondità maggiore siano ABR serve una visita in postordine dell albero che restituisce una coppia (min,max): massimo e minimo del sottoalbero esaminato Passi base: Un ABR nullo fornisce una segnalazione d errore. Un ABR costituito da un solo elemento è un ABR (min=max): viene restituita la coppia (min,max) con min max = key[t]. Passo ricorsivo: Sia t il puntatore al nodo in esame: Se t ha solo il figlio sx viene richiamata la funzione solo su left[t] che restituisce la coppia (minl,key[t]); key[t] è il massimo perché manca il s.a. destro; Se t ha solo il filgio dx viene richiamata la funzione solo su right[t] che restituisce la coppia (key[t],maxr); key[t] è il minimo perché manca il s.a. sinistro; Se l ABR ha entrambi i figli verifico che il nodo padre sia maggiore (o uguale) del massimo del s.a. sinistro e minore (o uguale) del minimo sul s.a. destro. La complessità asintotica è O(n) (dimostrare) VII-13

Pseudocodifica ;se l albero e un ABR viene restituita la coppia con le chiavi minima ;e massima, se e vuoto o se e un ABR viene sollevata un eccezione abr2(t) if t = NIL then errore "EmptyTree" else if foglia(t) then return (key[t],key[t]) else if right[t]=nil then (minl,maxl)<-abr2(left[t]); if (maxl>key[t]) then errore "NotAbr" else return (minl,key[t]) else if left[t]=nil then (minr,maxr)<-abr2(right[t]); if (minr<key[t]) then errore "NotAbr" else return (key[t],maxr) else ;due figli (minl,maxl) <- abr2(left[t]); (minr,maxr) <- abr2(right[t]); if (maxl>key[t] or minr <key[t]) then errore "NotAbr" else return (minl,maxr) VII-14

Ricerca di un elemento in un ABR Tree-Search: ricerca un elemento con chiave k in un ABR T Input: la chiave k, un puntatore x alla radice dell albero T(root[T]); Output: un puntatore ad un nodo con chiave k, se esiste, NIL altrimenti. Ricerca di un elemento in un ABR - versione iterativa ITERATIVE-TREE-SEARCH(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 VII-15

Ricerca di un elemento in un ABR - versione ricorsiva Base Se x = N IL, riportare NIL. Altrimenti, se la chiave di x è uguale a k, riportare x. (In entrambi i casi si riporta x). Ricorsione (x NIL e k non è uguale alla chiave di x). Se k < key[x], ricercare l elemento con chiave k nel sottoalbero sinistro della radice. Altrimenti, se k key[x], ricercare nel sottoalbero destro. TREE-SEARCH(x,k) 1. if x = NIL or k = key[x] 2. then return x 3. if k < key[x] 4. then return TREE-SEARCH(left[x],k) 5. else return TREE-SEARCH(right[x],k) VII-16

Minimo Minimo: nodo più a sinistra senza figlio sinistro (si trova percorrendo l albero seguendo i puntatori ai figli sinistri, finché ci sono). n t2 ogni nodo in t2 e maggiore di n n e il minimo t1 n t2 in t1 i nodi sono minori di n, quindi n non e il minimo il minimo va cercato in t1 Tree-Minimum, applicata a un puntatore alla radice di un ABR non vuoto, riporta un puntatore al minimo elemento dell ABR. TREE-MINIMUM(x) 1. while left[x]!= NIL 2. do x <- left[x] 3. return x VII-17

Massimo Massimo: nodo più a destra senza figlio destro. Tree-Maximum, applicata a un puntatore alla radice di un ABR non vuoto, riporta un puntatore al massimo elemento dell ABR. TREE-MAXIMUM(x) 1. while right[x]!= NIL 2. do x <- right[x] 3. return x VII-18

Complessità della ricerca Se la dimensione dell input è l altezza h dell albero Caso peggiore: la ricerca prosegue sul sottoalbero di profondità massima T TREE SEARCH (0) = a T TREE SEARCH (h) = T TREE SEARCH (h 1) + c T(h) O(h) Per il primo teorema generale per risolvere equazioni di ricorrenza: Se allora: T(n) = a se n = 0 T(n 1) + g(n) se n > 0 T(n) = a + n k=1 g(k) Anche Tree-Minimum e Tree-Maximum hanno complessità in tempo O(h) VII-19

Inserimento di un elemento in un ABR Input: un ABR T, un nodo z tale che key[z] = k left[z] = NIL right[z] = NIL p[z] = NIL In modo tale da conservare la proprietà ABR Output: T modificato con l aggiunta della foglia z L inserimento di 4 in Esempio 5 3 7 restituisce 2 5 3 5 7 8 2 5 8 4 VII-20

Inserimento di un elemento in un ABR - versione ricorsiva Se T è vuoto: crea l albero con l unico nodo z Altrimenti: se z ha chiave minore della radice di T, inserisci z nel sottoalbero sinistro altrimenti inseriscilo nel sottoalbero destro. Il caso albero vuoto va trattato a parte perché va modificato il campo root di T stesso: la scansione dell albero segue i possibili padri di z. TREE-INSERT(T,z) 1. if root[t] = NIL 2. then root[t] <- z 3. else TREE-INS(root[T],z) TREE-INS(x,z) 1. if key[z] < key[x] ;; z va inserito a sinistra 2. then if left[x] = NIL 3. then left[x] <- z 4. p[z] <- x 5. else TREE-INS(left[x],z) 6. else if right[x] = NIL ;; z va inserito a destra 7. then right[x] <- z 8. p[z] <- x 9. else TREE-INS(right[x],z) VII-21

Inserimento di un elemento in un ABR - versione iterativa Si discende l albero: per ogni nodo x, se key[z] < key[x], si scende sul figlio sinistro, altrimenti sul destro. Ad ogni passo si tiene memoria del padre y di x. Quando x è NIL: al suo posto va inserito il puntatore a z; quindi: se key[z] < key[y], z è il figlio sinistro di y, altrimenti z è il figlio destro di y. TREE-INSERT(T,z) 1. x <- root[t] ;; usata per discendere l albero 2. y <- NIL ;; puntatore al padre di x 3. while x!= NIL 4. do y <- x 5. if key[z] < key[x] 6. then x <- left[x] 7. else x <- right[x] 8. p[z] <- y ;; y e il padre di z 9. if y = NIL ;; T era vuoto e z e la radice del nuovo albero 10. then root[t] <- z 11. else if key[z] < key[y] 12. then left[y] <- z 13. else right[y] <- z Complessità dell inserimento:o(h) VII-22

Eliminazione di un elemento da un ABR Input: un ABR T; il puntatore x all elemento che si vuole cancellare (assumiamo x NIL). Output: ABR T modificato se x ha al massimo un figlio, si cancella x, bypassandolo : il puntatore a x del padre di x viene sostituito con il puntatore al figlio di x. Altrimenti, se x ha due figli, x viene sostituito dal suo successore y (il minimo del sottoalbero destro). Sostituendo il minimo elemento del s.a. destro al posto di x la proprietà ABR viene conservata. y non ha figlio sinistro: viene cancellato, bypassandolo. Il contenuto (chiave e dati satellite) di x viene sostituito dal contenuto di y. VII-23

Eliminazione di un elemento da un ABR (II) p[x] p[x] 5 5 x x 3 9 x 3 11 x 6 15 6 15 k 11 18 14 18... 14 un solo figlio due figli VII-24

Algoritmo di cancellazione Si determina il nodo da cancellare (1 3): y = x stesso, se ha al massimo un figlio, altrimenti il suo successore In entrambi i casi, y ha al massimo un figlio. Bypass di y: Sia z il figlio di y, se c e, altrimenti NIL (4 6). Se z non e NIL, suo padre diventa il padre di y (7 8). Se y e la radice dell albero (9), allora la radice dell albero diventa z (10), altrimenti si sostituisce con z il puntatore a y nel padre di y (left[p[y]] o right[p[y]]) (11 13). Se y non e x stesso: si copiano in x chiave e dati satellite di y (14 16). Si dealloca la memoria per y (17). VII-25

Algoritmo di cancellazione - pseudocodifica TREE-DELETE(T,x) 1. if left[x] = NIL or right[x] = NIL 2. then y <- x 3. else y <- TREE-MINIMUM(right[x]) 4. if left[y]!= NIL 5. then z <- left[y] 6. else z <- right[y] 7. if z!= NIL 8. then p[z] <- p[y] 9. if p[y] = NIL 10. then root[t] <- z 11. else if y = left[p[y]] 12. then left[p[y]] <- z 13. else right[p[y]] <- z 14. if y!= x 15. then key[x] <- key[y] 16. ;; copia dati satellite di y in x 17. ;; deallocazione della memoria per y VII-26

Complessità delle operazioni sugli ABR Se la dimensione dell input è l altezza h dell albero Caso peggiore: la ricerca prosegue sul sottoalbero di profondità massima T TREE SEARCH (0) = a T TREE SEARCH (h + 1) = T TREE SEARCH (h) + c T(h) è O(h) Se la dimensione dell input è il numero n dei nodi dell albero Quale può essere la massima altezza di un albero binario? (caso peggiore) Caso peggiore : l albero è completamente sbilanciato a destra o a sinistra (massima altezza per n nodi) Caso migliore : l albero è completo (minima altezza per n nodi) Dato un albero con n nodi qual è la sua altezza h? VII-27

Complessità delle operazioni sugli ABR (II) Quindi altezza nodi nodi (caso peggiore) (caso migliore) 0 1 1 1 2 3 h h + 1 2 h+1 1 perciò nodi altezza altezza (caso peggiore) (caso migliore) n n 1 log 2 (n) nel caso peggiore un albero di n nodi ha altezza h = n 1: T(n) è O(n) nel caso migliore un albero di n nodi ha altezza h = log 2 n : T(n) è O(log 2 n) VII-28

Complessità della ricerca: caso medio Le operazioni sugli ABR richiedono tempo logaritmico anche nel caso medio Idea intuitiva Distribuzione dei nodi nei due sottoalberi della radice Empty x n n/2 n/2 x casi particolari x caso generale 1/4n 3/4n Supponiamo che questa distribuzione valga per ogni livello. Consideriamo sempre il sottoalbero più grande: VII-29

Complessità della ricerca: caso medio (II) n liv. 0 3/4(1/4)n 3/4n 3/4(3/4)n.. d (3/4) n liv. 1 liv. 2 liv. d Per d grande : (3/4) d n 1. d è l altezza dell albero (3/4) d n = 1 per d = 2.5 log 2 n Quindi T TREE SEARCH (n) = O(d) = O(lg n) VII-30

Tree sort Il risultato della visita simmetrica di un ABR è una sequenza ordinata. TREE-SORT ordina l array A: costruendo un ABR T con gli elementi di A visitando T in ordine simmetrico e copiando gli elementi in A. TREE-SORT(A) 1. T <- EMPTY() 2. for i=1 to length[a] 3. do TREE-INSERT(T,MK-TREE-ELEM(A[i])) 4. TREE-TO-ARRAY(A,root[T],1) VII-31

Tree sort (II) L operazione TREE-TO-ARRAY prende in ingresso: un puntatore a un array A un puntatore x a un nodo di un ABR un indice i nell array A e visita l ABR con radice in x, in ordine simmetrico, copiando le chiavi degli elementi visitati in A, a partire dalla posizione i. Riporta l indice della prossima posizione libera in A. TREE-TO-ARRAY(A,x,i) 1. if x!= NIL 2. then i <- TREE-TO-ARRAY(A,left[x],i) 3. A[i] <- key[x] 4. i <- TREE-TO-ARRAY(A,right[x],i+1) 6. return i La funzione MK-TREE-ELEM(k) costruisce un nodo con chiave k: MK-TREE-ELEM(k) 1. allocazione della memoria per x 2. key[x] <- k 3. left[x] <- right[x] <- p[x] <- NIL 4. return x Qual è la complessità asintotica del Tree-Sort? VII-32