Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

Documenti analoghi
Algoritmi e strutture dati

Alberi di ricerca. Dizionari. Definizione. Alberi binari di ricerca (BST = binary search tree) Algoritmi e Strutture Dati

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

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

Algoritmi e Strutture Dati

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Struttura dati Dizionario

QuickSort Università degli Studi di Milano

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Alberi binari di ricerca

Alberi ed Alberi Binari di Ricerca

Heap e code di priorità

Alberi Binari di Ricerca

Alberi binari di ricerca

Code con priorità. Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna.

In questa lezione Alberi binari di ricerca

Esercitazione 6. Alberi binari di ricerca

Alberi binari di ricerca

Algoritmi e strutture dati

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

Esercizi parte 3. La classe ArrayBinTree dovra implementare, tra le altre, l operazione seguente: padre: dato un nodo, restituire l indice del padre.

Esercizi su ABR. Prof. E. Fachini - Intr. Alg.!1

Alberi binari e alberi binari di ricerca

Code a priorità. Progettazione di Algoritmi Matricole congrue a 1. Docente: Annalisa De Bonis

Multi-way search trees

Alberi binari e alberi binari di ricerca

Alberi binari e alberi binari di ricerca

Problem Set 2 docente: Luciano Gualà

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Algoritmi e Strutture di Dati

Algoritmi e Strutture di Dati

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.

Alberi ed Alberi Binari

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

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Problemi di ordinamento

Algoritmi e Strutture Dati

d. Cancellazione del valore 5 e. Inserimento del valore 1

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

Algoritmi e Strutture di Dati

Alberi. CORDA Informatica. A. Ferrari. Testi da. Marco Bernardo Edoardo Bontà. Dispense del Corso di. Algoritmi e Strutture Dati

Alberi di ricerca binari

Gli heap. Sommario. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Algoritmi e Strutture Dati

In questa lezione. Costruire un max-heap. [CLRS01] cap. 6 par Prof. E. Fachini - Intr. Alg.

ricerca di un elemento, verifica dell appartenenza di un elemento

Gli heap. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

In questa lezione Alberi binari di ricerca: la cancellazione

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

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

ricerca di un elemento, verifica dell appartenenza di un elemento

Algoritmi, Strutture Dati e Programmi. UD 3.d: Strutture Dati Dinamiche Alberi

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.

ADT Coda con priorità

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

Dati e Algoritmi I (Pietracaprina) Esercizi su Priority Queue e Heap

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

Algoritmi e Strutture Dati

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

Algoritmi e Strutture Dati

Alberi Binari di Ricerca e Alberi Rosso-Neri

Code a priorità Una coda a priorità è una struttura dati astratta che permette di rappresentare un insieme di elementi su cui è definita una

algoritmi e strutture di dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture di Dati

Algoritmi e Strutture Dati

Dati e Algoritmi 1: A. Pietracaprina. Priority Queue (II parte)

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

Esercitazione 5 Alberi Binari di Ricerca

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

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

Alberi binari: definizione e alcune proprietà

Spesso sono definite anche le seguenti operazioni:

Strutture dati Alberi binari

Alberi rosso neri. API a.a. 2013/2014 Gennaio 23, 2014 Flavio Mutti, PhD

Informatica 3. LEZIONE 16: Heap - Codifica di Huffmann. Modulo 1: Heap e code di priorità Modulo 2: Esempio applicativo: codifica di Huffmann

Università degli Studi di L Aquila Facoltà di Scienze M.F.N. Corso di Laurea in Informatica. Modulo di Laboratorio di Algoritmi e Strutture Dati

alberi binari di ricerca (BST)

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

Esercizi su alberi binari

Alberi Binari di Ricerca

RICERCA BINARIA...1 ALBERO BINARIO DI RICERCA (ABR)...3 RICORSIONE...4 ESEMPI DI RICORSIONE IN VISUAL BASIC...5 ESEMPI DI RICORSIONE IN C / C++...

Esercizi di Algoritmi e Strutture Dati

Algoritmi e strutture dati

Algoritmi e Strutture Dati

Esercizi BST - AVL. E. Fachini

Esercizio Per quali valori di t l albero in figura è un B-Albero legale?

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

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

Divide et impera su alberi

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.

Tipi di dato e Strutture dati elementari

Esercizi Capitolo 6 - Alberi binari di ricerca

Transcript:

Algoritmi e Strutture Dati Capitolo 6 Il problema del dizionario

Il tipo dato Dizionario Suppongo sempre che mi venga dato un riferimento diretto all elemento da cancellare Applicazioni: gestione archivi di dati 2

Obiettivo Fornire un implementazione di un dizionario di n elementi che consenta di fare tutte le operazioni descritte in tempo O(log n). 3

Quattro implementazioni elementari 1. Array non ordinato 2. Array ordinato 3. Lista non ordinata 4. Lista ordinata NOTA BENE: Come per le code di priorità, si noti che il dizionario è un tipo di dati dinamico (cioè di dimensione variabile), in quanto soggetta ad inserimenti e cancellazioni. L uso degli array va quindi inteso pensando alla loro versione dinamica, che implica riallocazioni/deallocazioni di memoria che raddoppiano/dimezzano lo spazio utilizzato. Con tale accorgimento, i costi di riallocazione/deallocazione sono assorbiti (asintoticamente) dai costi per le insert e le delete 4

Array non ordinato Tengo traccia in una variabile di appoggio del numero n di elementi effettivamente presenti nel dizionario (dimensione logica dell array), e gestisco la dimensione fisica dell array mediante allocazione dinamica Insert: O(1) (inserisco in fondo all array) Delete: O(1) (poiché mi viene fornito il riferimento diretto all elemento da cancellare, lo posso cancellare in O(1) sovracopiando l ultimo elemento) Search: O(n) (devo scorrere l array); nel caso migliore costa O(1), ovviamente 5

Array ordinato Gestione dinamica come sopra; l array viene inoltre tenuto ordinato in ordine decrescente Insert: O(n) (trovo in O(n) mediante scorrimento da destra verso sinistra la giusta posizione, e poi faccio O(n) spostamenti verso destra); nel caso migliore costa O(1), grazie all accorgimento della scansione da destra verso sinistra, come facevamo in InsertionSort2; Delete: O(n) (devo fare O(n) spostamenti verso sinistra); nel caso migliore costa O(1), ovviamente Search: O(log n) (ricerca binaria); nel caso migliore costa O(1), ovviamente 6

La considero bidirezionale, e mantengo un puntatore alla testa ed uno alla coda Lista non ordinata elemento, chiave Insert: O(1) (inserisco in coda o in testa) Delete: O(1) (poiché mi viene fornito il riferimento diretto all elemento da cancellare, lo posso cancellare in O(1) agendo sui puntatori) Search: O(n) (devo scorrere la lista); nel caso migliore costa O(1), ovviamente 7

La considero bidirezionale e ordinata in ordine crescente o decrescente indifferentemente Lista ordinata elemento, chiave Insert: O(n) (devo prima scorrere la lista in O(n) per trovare la giusta posizione, poi inserisco in O(1) agendo sui puntatori); nel caso migliore costa O(1), ovviamente Delete: O(1) (poiché mi viene fornito il riferimento diretto all elemento da cancellare, lo posso cancellare in O(1) agendo sui puntatori) Search: O(n) (devo scorrere la lista); nel caso migliore costa O(1), ovviamente 8

Implementazioni elementari Insert Delete Search Array non ord. Array ordinato Lista non ordinata Lista ordinata O(1) O(1) O(n) O(n) O(n) O(log n) O(1) O(1) O(n) O(n) O(1) O(n) Ognuno dei 4 metodi elementari ha almeno un operazione che costa O(n). Voglio fare meglio 9

Ricordiamo che per il problema della ricerca di un elemento in un insieme non ordinato si applica il lower bound banale di (n). Tuttavia, ad esempio, nel caso di insiemi ordinati la ricerca binaria costa O(log n). Possiamo migliorarla? Consideriamo l albero di decisione di un qualsiasi algoritmo che risolve il problema della ricerca in un insieme di n elementi tramite confronti L albero deve contenere almeno n+1 foglie (ogni foglia specifica una tra le n posizioni dove si può trovare l elemento, più la foglia non trovato ) Un albero binario con k foglie in cui ogni nodo interno ha al più due figli, ha altezza 10 Lower bound (log n) per la ricerca h(k) log k (vedi lower bound sull ordinamento) L altezza h(n+1) dell albero di decisione è (log n) La ricerca binaria quindi è ottimale e non può essere ulteriormente migliorata Proviamo a definire una struttura a puntatori su cui applicare una qualche forma di ricerca binaria!

Alberi Binari di Ricerca (ABR, o BST = Binary Search Tree) 11

Definizione di ABR Parent Figlio sx elemento, chiave Figlio dx Implementazione del dizionario mediante un albero binario in cui ogni nodo v contiene una coppia (elem(v),chiave(v)) del dizionario, nonché un puntatore al padre parent(v), un puntatore al figlio sinistro sin(v) e un puntatore al figlio destro des(v), e soddisfa le seguenti proprietà: le chiavi nel sottoalbero sinistro di v sono < chiave(v) le chiavi nel sottoalbero destro di v sono > chiave(v) Vedremo che tali proprietà inducono un ordinamento totale sulle chiavi del dizionario! 12

Esempi! Albero binario di ricerca Albero binario non di ricerca 13

Visita simmetrica di un ABR Visita in ordine simmetrico dato un nodo v, elenco prima il sotto-albero sinistro di v (in ordine simmetrico), poi il nodo v, poi il sotto-albero destro di v (in ordine simmetrico) algoritmo Inorder-tree-walk(node v) if (v null) then Inorder-tree-walk(sin(v)) stampa chiave(v) Inorder-tree-walk(des(v)) Inorder-tree-walk(radice dell ABR) visita tutti i nodi dell ABR Analisi complessità: la complessità della procedura considerata è T(n) = (n). Infatti: T(n) = T(n') + T(n'') + O(1) con n'+n''=n-1 14

Proprietà della visita simmetrica di un ABR Inorder-tree-walk(radice dell ABR) visita i nodi dell ABR in ordine crescente rispetto alla chiave! Verifica: Indichiamo con h l altezza dell albero. Per induzione sull altezza dell ABR: Base (h=0): banale (l ABR consiste di un unico nodo); Passo induttivo (h generico): ipotizzo che la procedura sia corretta per h-1 r Albero di altezza h-1. Tutti i suoi elementi sono minori della radice Albero di altezza h-1. Tutti i suoi elementi sono maggiori della radice 15

Esempio 15 6 18 3 7 17 20 2 4 13 minimo 9 massimo 16

search(chiave k) elem Analizziamo ora i costi di search, insert e delete su un ABR. Iniziamo dall operazione di search. Per la proprietà di ordinamento totale appena mostrata, similmente alla ricerca binaria si traccia un cammino nell albero partendo dalla radice: su ogni nodo, se la chiave cercata è diversa da quella del nodo, si decide se proseguire la ricerca nel sottoalbero sinistro o destro, a seconda se la chiave cercata è minore o maggiore della chiave del nodo corrente 17

search(7) 15 6 20 3 8 17 27 2 4 7 13 16 19 22 30 18

Confronto con la ricerca binaria La complessità della procedura di ricerca considerata è T(n) = O(h), ove h è l altezza dell ABR. Si noti che nel caso migliore, potrebbe costare O(1) Nell esempio precedente, l ABR era completo, e quindi h=θ(log n) Per le proprietà dell ABR, quando esso è completo, per ogni nodo v la chiave associata è l elemento mediano nell insieme ordinato delle chiavi associate ai nodi costituiti dal sottoalbero sinistro di v, da v, e dal sottoalbero destro di v Ad ogni discesa di livello, dimezzo lo spazio di ricerca, in modo analogo a quanto avveniva per l array ordinato!! ma un ABR non sempre è completo 19

anche questo è un ABR (contiene gli stessi elementi dell altro ABR, anche se non li ho disegnati tutti)!! 19 20 22 27 30 17 16... 15 Notare: T(n) = O(h) in entrambi i casi, però: 2 ABR completo h = (log n) ABR linearizzato h = (n) 20

insert(elem e, chiave k) La insert viene eseguita simulando una search, in modo da inserire il nuovo elemento proprio nella giusta posizione dell ABR: 1. Cerca la chiave k nell albero (che per l ipotesi di univocità sulle chiavi non comparirà nell ABR), identificando così il nodo v che diventerà padre del nodo che conterrà il nuovo elemento; tale nodo v deve essere un nodo dal quale la ricerca di k non può proseguire, e quindi v non ha sottoalbero sinistro e/o destro 2. Crea un nuovo nodo u con elem=e e chiave=k 3. Appendi u come figlio sinistro/destro di v in modo che sia mantenuta la proprietà di ordinamento totale La complessità della procedura considerata è T(n) = O(h), ove h è l altezza dell ABR 21

insert(e,6) 15 5 18 3 9 17 20 2 4 7 13 6 8 10 Se seguo questo schema l elemento e viene posizionato nella posizione giusta. Infatti, per costruzione, ogni antenato di e si ritrova e nel giusto sottoalbero. 22

Interrogazioni ausiliarie su un ABR Per implementare la delete, faremo invece uso delle seguenti operazioni ausiliare sull ABR: max(nodo u) dato un nodo u di un ABR, restituisce il nodo del sottoalbero dell ABR radicato in u avente chiave più grande (si noti che potrebbe essere u stesso, se u non ha un sottoalbero destro) min(nodo u) dato un nodo u di un ABR, restituisce il nodo del sottoalbero dell ABR radicato in u avente chiave più piccola (si noti che potrebbe essere u stesso, se u non ha un sottoalbero sinistro) predecessor(nodo u) dato un nodo u di un ABR, restituisce il nodo dell ABR con chiave immediatamente più piccola di quella associata ad u (o NULL se u contiene l elemento minimo dell ABR). successor(nodo u) dato un nodo u di un ABR, restituisce il nodo dell ABR con chiave immediatamente più grande di quella associata ad u (o NULL se u contiene l elemento massimo dell ABR).

Ricerca del massimo/minimo La procedura min(nodo u) si definisce in maniera del tutto analoga cambiando destro con sinistro La complessità della procedura considerata è T(n) = O(h(u)), ove n è il numero di nodi dell ABR e h(u) è l altezza del sottoalbero radicato in u, e quindi h(u) = O(h) (h è l altezza dell ABR) Se l argomento nodo u coincide con la radice dell albero, allora min e max restituiscono il nodo con chiave minima e massima dell intero dizionario, rispettivamente

Esempio di esecuzione 15 min (nodo radice del ABR) 6 max (u) 18 3 8 17 20 2 4 7 13 9

Ricerca del predecessore Caso 1: u ha un sottoalbero sinistro: max del sottoalbero sinistro Caso 2: u non ha un sottoalbero sinistro: Antenato più prossimo di u il cui sottoalbero destro contiene u (si noti infatti che u è il minimo tra gli elementi più grandi di pred(u), e quindi u è il successore di pred(u), ovvero pred(u) è il predecessore di u) Complessità: O(h) Caso 3: u è il minimo dell albero, e quindi non ha predecessore

Ricerca del predecessore Complessità: O(h)

Ricerca del successore La ricerca del successore di un nodo è simmetrica: cambio sinistro con destro e max con min succ(u) 15 6 Cerco il min del 18 sottoalbero destro Complessità: O(h) 3 8 17 20 2 4 7 13 9 succ(u) Cerco l antenato più prossimo di u il cui sottoalbero sinistro contiene u

delete(elem e) Siamo pronti per trattare l operazione di cancellazione. Sia u il nodo contenente l elemento e da cancellare; ci sono 3 possibilità: 1) u è una foglia: rimuovila 2) u ha un solo figlio: aggiralo

delete(elem e) 3) u ha due figli: sostituiscilo con il predecessore, e rimuovi fisicamente il predecessore; tale predecessore sarà il massimo del sottoalbero sinistro (caso 1 dell algoritmo pred), in quanto u ha un sottoalbero sinistro; quindi, tale predecessore deve avere al più un solo figlio (non può avere il figlio destro!), e ricadremo quindi in uno dei 2 casi precedenti. Si noti che si può analogamente usare allo stesso scopo il successore di u. Vediamo un esempio in cui si ricade nel caso 2):

delete (u) v prende il posto di u u 15 65 18 3 9 17 20 1 5 7 13 4 v pred. di u Infine v viene aggirato 10

Costo dell operazione di cancellazione Nei casi 1) e 2) T(n)=O(1), mentre nel caso 3) T(n)=O(h(u))=O(h) Ricapitolando, le operazioni di ricerca, inserimento e cancellazione hanno costo O(h) dove h è l altezza dell albero Per alberi molto bilanciati, h= (log n) ma per alberi molto sbilanciati, h= (n)

Un albero binario di ricerca molto bilanciato 15 6 20 3 8 17 27 2 4 7 13 16 19 22 30

Un albero binario di ricerca molto sbilanciato 30 22 27 20 19 17 16 15... 2

Esercizi di approfondimento 1. La visita in ordine anticipato di un ABR funziona come segue: dato un nodo v, elenca prima il nodo v, poi il sottoalbero sinistro di v (in ordine anticipato), e infine il sottoalbero destro di v (in ordine anticipato). Fornire lo pseudocodice di tale visita, nonché una sua esecuzione su un ABR quasi completo di altezza 4 (con chiavi a piacere). 2. La visita in ordine posticipato di un ABR funziona come segue: dato un nodo v, elenca prima il sotto-albero sinistro di v (in ordine posticipato), poi il sotto-albero destro di v (in ordine posticipato), e infine il nodo v. Fornire lo pseudocodice di tale visita, nonché una sua esecuzione su un ABR con 20 nodi di altezza 5 (con chiavi a piacere). 35