STRUTTURE DATI: OLTRE LE LISTE

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

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

Espressioni aritmetiche

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

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

Esempi. Albero di interi. Struttura che non è un albero!

Alberi binari e alberi binari di ricerca

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

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

Alberi binari e alberi binari di ricerca

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

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

Strutture dati Alberi binari

Alberi binari e alberi binari di ricerca

Prossime lezioni e tutorato!

Alberi binari: definizione e alcune proprietà

In questa lezione. Alberi binari: [CLRS09] cap. 12 per la visita inorder. visite e esercizi su alberi binari. Prof. E. Fachini - Intr. Alg.

Alberi. Definizioni principali

Indice come albero binario di ricerca!

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

Esercizi su programmazione ricorsiva 3

Algoritmi e Strutture di Dati

Esercitazione 6. Alberi binari di ricerca

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 : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

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

ADT ALBERO BINARIO (tree)) ADT ALBERO BINARIO

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Alberi. Cosa sono gli alberi? Strutture gerarchiche di ogni tipo. Definizione, realizzazione e algoritmi elementari. Generale.

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

Richiami di matematica discreta: grafi e alberi. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

Algoritmi e strutture dati 16 Dicembre 2004 Canali A L e M Z Cognome Nome Matricola

Correzione prima esercitazione: metodo distinct

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

ALGORITMI E STRUTTURE DATI

GRAFI. Angelo Di Iorio Università di Bologna

Algoritmi e Strutture Dati

Implementazione ADT: Alberi

Algoritmi e Strutture Dati

Alberi Binari di Ricerca

Note per la Lezione 4 Ugo Vaccaro

lezione 9 min-heap binario Heap e Alberi posizionali generali

Alberi ed Alberi Binari

Algoritmi e Strutture Dati

algoritmi e strutture di dati

Algoritmi e Strutture Dati. HeapSort

Moltiplicazione veloce di interi

ADT ALBERO BINARIO (tree)! n Rappresentazione collegata (puntatori a strutture)

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

Soluzioni della settima esercitazione di Algoritmi 1

Alberi Binari Alberi Binari

Alberi binari di ricerca

Divide et impera su alberi

alberi tipo astratto, implementazione, algoritmi

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica

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

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

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

Prova di Algoritmi e s.d. (1o anno) 7 Febbraio TESTO e RISPOSTE

Alberi ( GT. 7 ) In informatica, un albero è un modello astratto con cui viene rappresentata una struttura gerarchica

argomenti alberi terminologia tipo di dato astratto albero tipo astratto, implementazione, algoritmi es.: radice R con n sottoalberi radice

ALBERI. Un Albero. Un grafo aciclico che non è un albero: due archi entranti in uno stesso nodo

Laboratorio di Python

Alberi binari di ricerca

Lezione 9 Alberi binari: visite ed esercizi

Alberi binari. Alberi Albero binario Heap tree

Algoritmi e Strutture Dati. Alberi

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Fondamenti di Informatica II. Alberi

Algoritmi e Strutture Dati. HeapSort

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

Appunti del corso di Informatica 1 (IN110 Fondamenti) 7 Grafi e alberi: introduzione

Gli ordini di visita di un albero binario di 9 nodi sono i seguenti: A, E, B, F, G, C, D, I, H (anticipato)

Ripasso di programmazione ricorsiva

Dati e Algoritmi 1: A. Pietracaprina. Alberi Binari

Algoritmi e Strutture Dati Laboratorio 20/10/2008. Prof. Pier Luca Lanzi

Capitolo 3: Gli alberi. Alberi n-ari

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

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

Alberi di ricerca binari

Laboratorio di Informatica. Lezione 8: Liste e alberi

Informatica 3. LEZIONE 17: Alberi generici. Modulo 1: Definizione e ADT Modulo 2: Implementazione Modulo 3: Alberi e classi di equivalenza

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

Lezione 12 Tabelle Hash

Alberi Binari di Ricerca

Alberi. Albero binario. Un albero binario è un albero (ordinato) in cui ciascun nodo può avere al massimo due figli (figlio destro e figlio sinistro)

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

Università Roma Tre - PAS Classe A048 "Matematica Applicata" - Corso di Informatica a.a. 2013/2014

Corso di Programmazione

Progettazione di algoritmi

Alberi Binari di Ricerca e Alberi Rosso-Neri

Laboratorio di Python

Transcript:

STRUTTURE DATI: OLTRE LE LISTE Le liste risolvono un ampio ventaglio di problemi, ma sono strutture dati sequenziali e come tali inadatte a gestire grandi quantità di dati quando le operazioni più frequenti implicano un accesso non sequenziale. ad esempio, in una lista, la ricerca di un elemento richiede un tempo proporzionale alla lunghezza della lista: se essa contiene migliaia di elementi, tale operazione è inefficiente. La gestione di grandi quantità di dati può avvantaggiarsi dall'adozione di strutture dati non sequenziali ad esempio per rendere più veloci alcune operazioni frequenti e particolarmente rilevanti, come la ricerca di un elemento.

GRAFI Un grafo è una struttura che rappresenta relazioni binarie su insiemi di elementi. Una relazione fra due insiemi A,B è un sottoinsieme R del prodotto cartesiano A B. Qui A = { a1, a2 } e B={ b1, b2, b3 }. Un grafo orientato è una struttura G = ÆA,Ræ dove A è un insieme non vuoto di nodi R è un insieme di archi orientati tali che se Æa i,a j æ R, c è un arco orientato da a i verso a j.

GRAFI: NOMENCLATURA Grado di ingresso del nodo a i : è il numero di archi che hanno a i come nodo finale. Grado di uscita del nodo a i : è il numero di archi che hanno a i come nodo iniziale. Un grafo si dice completo se "a i,a j A esiste un arco da a i verso a j. Se un grafo è completo, significa che la relazione R coincide col prodotto cartesiano AxA, ossia è una relazione totale. Si dice cammino da a a b una sequenza di nodi a 0, a 1...a N tale che N 0, a 0 =a, a N =b, e Æa i,a j æ R per ogni 0 i N-1. cammino semplice: i nodi del cammino sono distinti cammino ciclico (o ciclo): quando a = b cammino aciclico: se non vi sono cicli.

GRAFI e ALBERI Un albero è un grafo orientato aciclico tale che esiste un nodo (radice) con grado d ingresso 0 ogni altro nodo ha grado d ingresso 1. DEFINIZIONI I nodi con grado di uscita 0 si dicono foglie. La lunghezza del cammino dalla radice a un dato nodo si dice livello di quel nodo. La lunghezza del cammino più lungo dalla radice a una foglia si dice altezza dell albero. Se un arco collega il nodo a al nodo b, il nodo a si dice nodo padre di b, il quale è detto nodo figlio (o discendente diretto) di a. Poiché in un albero il grado d ingresso di ogni nodo è noto a priori, in luogo di grado di uscita si dice spesso semplicemente grado.

GRAFI e ALBERI Un albero è un grafo orientato aciclico tale che esiste un nodo (radice) con grado d ingresso 0 ogni altro nodo ha grado d ingresso 1. CONSEGUENZE esiste esattamente un cammino (semplice) dalla radice a qualsiasi altro nodo. tranne la radice, tutti i nodi hanno esattamente un padre un padre può avere 0 o più figli tra i figli di un nodo esiste una relazione d ordine che distingue il 1 nodo, il 2 nodo, etc (disegnati solitamente da sinistra a destra).

ALBERI PROPRIETÀ SALIENTI Un albero rappresenta una relazione d ordine parziale sull insieme A Un albero può essere usato per rappresentare relazioni gerarchiche fra entità di A I discendenti di un dato nodo X sono calcolati come chiusura transitiva della relazione figlio di. CATEGORIE DI ALBERI Gli alberi si possono distinguere in base al numero massimo di figli che ogni loro nodo può avere. In un albero binario, ogni nodo ha al più due figli (ma può averne uno solo o nessuno) In un albero ternario, ogni nodo ha al più tre figli (ma può averne meno, o nessuno) In un albero N-ario, ogni nodo ha al più N figli.

ALBERI come STRUTTURE RICORSIVE Esclusa la radice, in un albero N-ario i nodi possono essere ripartiti in N insiemi disgiunti Ciascuno di tali sottoinsiemi comprende un figlio della radice più tutti (e soli) i suoi discendenti Ognuno di questi sottoinsiemi individua un (sotto)albero

VISITA DI UN ALBERO Con il termine visita si intende percorrere l albero secondo un qualche criterio, in modo da passare una e una sola volta in ogni nodo. Data la natura intrinsecamente non sequenziale dell'albero, non esiste un concetto di "sequenza naturale" degli elementi (come esisteva nelle liste). Occorre definire uno o più criteri di visita che assicurino comunque di visitare, ciascuno una sola volta, tutti gli elementi dell albero.

VISITA DI UN ALBERO Dato che un albero è definito come una struttura caratterizzata da un elemento N (sotto)alberi vi sono due criteri naturali di visita: visita in ordine anticipato (preorder): prima la radice, poi tutti i sottoalberi visita in ordine posticipato (postorder): prima tutti i sottoalberi, poi la radice.

ESEMPIO Nel caso dell'albero a fianco: visita in preorder (prima la radice, poi tutti i sottoalberi): {3, sinistro, destro } = {3, {8,{11,1}}, {2,{5}}} 3 visita in postorder (prima tutti i sottoalberi, poi la radice): {sinistro, destro, 3} = {{{11,1},8}, {{5},2}, 3} 11 8 1 2 5

VISITA IN AMPIEZZA Un terzo criterio sfrutta la struttura a livelli dell'albero: livello 0: la radice livello 1: i figli della radice livello 2: i figli dei figli della radice... Visita in ampiezza (breadth-first): prima la radice (livello 0) poi tutti i nodi del I livello, poi tutti quelli del II livello, etc 3 Nel caso dell'albero a fianco: {3, livello1, livello2} = {3, {6, 8, 2}, {11,1,5} } 6 11 8 1 2 5

ALBERI BINARI Il caso più tipico di albero è l'albero binario un elemento due (sotto)alberi figli, sinistro e destro

VISITA DI UN ALBERO BINARIO Nel caso particolare di un albero binario, che ha due sottoalberi, è possibile definire un ulteriore criterio naturale di visita: visita in ordine (inorder) prima il sottoalbero di sinistra, poi la radice, poi il sottoalbero di destra. Questo criterio ha senso solo per un albero binario, in quanto per un albero generico con N figli esistono N possibili visite in ordine, nessuna più significativa delle altre.

ESEMPIO Nel caso dell'albero a fianco: visita in ordine (prima il sottoalbero sinistro, poi la radice, poi il destro): {sinistro, 3, destro } = {{{11},8,{1}}, 3, {2,{5}}} 8 3 2 11 1 5

ALBERI BINARI DI RICERCA Una albero binario di ricerca (binary search tree) è un albero binario i cui elementi rispettano tutti una data relazione d'ordine gli elementi devono dunque appartenere a un dominio in cui esista una relazione d'ordine totale In particolare, detto R il valore della radice: il sottoalbero di sinistra contiene solo elementi minori o uguali a R il sottoalbero di destra contiene solo elementi maggiori di R.

ALBERI BINARI DI RICERCA: ESEMPIO 1) appare il 15 radice 2) appare 27 va a destra 3) appare 4 va a sinistra 4) appare 39 in fondo a destra 5) appare 11 sinistra, poi destra 6) appare 1 in fondo a sinistra 4 15 27 1 11 39

ALBERI BINARI DI RICERCA: MOTIVI Un albero binario di ricerca velocizza notevolmente la ricerca di un elemento, perché esclude metà albero a ogni confronto l'esito del confronto dice da che parte sta l elemento: nel sottoalbero di sinistra, se l'elemento cercato è minore della radice nel sottoalbero di destra, se l'elemento cercato è maggiore della radice. dopo K confronti, ha operato K dimezzamenti fi ha esplorato uno spazio di 2 K elementi Ricerca binaria: per esplorare N elementi occorrono al più K = log 2 N confronti.

ALBERI BILANCIATI Un albero i cui elementi sono distribuiti uniformemente fra i sottoalberi si dice bilanciato Molti algoritmi funzionano meglio con alberi bilanciati. Esistono algoritmi per bilanciare alberi non bilanciati. non bilanciato bilanciato

ALBERI: VALORI o CONTENITORI? ALBERI COME VALORI Un albero è una ennupla costituita da un elemento e da N (sot-to)alberi E' data la costante alberovuoto. CONSEGUENZE Un albero non è un contenitore Non si può cambiare un albero esistente È un approccio sicuro (non si modifica mai niente) Ma non è sempre efficiente ALBERI COME CONTENITORI Un albero è un grafo aciclico di contenitori di elementi CONSEGUENZE Un albero è un contenitore Si può cambiare un albero già esistente È un approccio efficiente (non si ricostruisce ciò che già esiste) Ma può essere pericoloso in presenza di structure sharing e aliasing

ALBERI COME VALORI: PRIMITIVE Costruttore Tree eltype [ Tree Tree] fi Tree (in C è una funzione, ad esempio constree) Selettori root: left: right: Tree fi eltype Tree fi Tree Tree fi Tree Predicati isempty: Tree fi boolean In Java sono metodi, in C sono funzioni

ALBERI COME VALORI: PRIMITIVE Costruttore Tree eltype [ Tree Tree] fi Tree (in C è una funzione, ad esempio constree) Dati un elemento e due alberi già esistenti, T1 e T2, il Selettori costruttore crea un nuovo albero avente tale elemento come root: radice, e i Tree due alberi fi eltype T1 e T2 come figli (nell'ordine, sinistro e destro). left: Tree fi Tree Caso particolare: uno right: o entrambi Tree gli alberi fi T1 Tree e T2 possono essere la costante alberovuoto costruttore con solo eltype Predicati isempty: Tree fi boolean In Java sono metodi

ALBERI COME VALORI: PRIMITIVE Costruttore Tree eltype [ Tree Tree] fi Tree Dato un albero, seleziona l'elemento radice (in C è una funzione, ad esempio constree) Selettori root: left: right: Predicati Tree fi eltype Tree fi Tree Tree fi Tree Dato un albero, selezionano rispettivamente il figlio di sinistra o quello di destra. isempty: Tree fi boolean In Java sono metodi, in C sono funzioni

ALBERI COME VALORI: PRIMITIVE Costruttore Tree eltype [ Tree Tree] fi Tree (in C è una funzione, ad esempio constree) Selettori root: left: right: Tree fi eltype Dato un albero, Tree risponde fi Tree sì o no alla domanda: "È vuoto"? Tree fi Tree Predicati isempty: Tree fi boolean In Java sono metodi, in C sono funzioni

ALBERI COME VALORI: COSTRUZIONE Un albero come valore è definito in modo induttivo esiste l'entità alberovuoto costruttore di default? ogni altro albero si ottiene anteponendo una nuova radice a due alberi pre-esistenti. Ad esempio, l'albero illustrato a fianco si ottiene come: Tree t = new Tree(3, new Tree(8), new Tree(2) ); Il costruttore di Tree con un solo parametro presuppone per i sottoalberi figli due alberi vuoti. 8 3 2

ALBERI COME VALORI: ALGORITMI Se gli alberi sono definiti in modo induttivo, gli algoritmi che li manipolano sono naturalmente espressi in modo ricorsivo. Tali algoritmi sono indipendenti dalla rappresentazione (ovviamente, cambia la sintassi) non è rilevante come gli alberi siano realizzati non importa il linguaggio (C, Pascal, Java ) Gli algoritmi si basano solo sulle primitive (costruttore, root, left, right, isempty).

Algoritmo ESEMPIO: contare gli elementi se l'albero è vuoto, gli elementi sono 0 altrimenti, gli elementi sono 1 (la radice) + quelli del figlio sinistro + quelli del figlio destro Codifica in C: int count(tree t){ if(t==et) return 0; else return 1 + count(left(t)) + count(right(t)); } Codifica in Java (metodo della classe Tree): public int count(){ int nl = (left()==null? 0 : left().count()); int nr = (right()==null? 0 : right().count()); return 1 + nl + nr; }

ALGORITMI DI VISITA Data la natura intrinsecamente non sequenziale dell'albero, non è possibile scorrere uno a uno gli elementi con un ciclo non c'è una nozione naturale o implicita di elemento successivo Occorre adottare un approccio ricorsivo si opera sulla radice (prima, in mezzo, o dopo) si richiama ricorsivamente la visita sui sottoalberi figli.

VISITA IN ORDINE ANTICIPATO in C: void preorder(tree T) { if (T==null) return; printelement(root(t)); preorder(left(t)); preorder(right(t)); } in Java (approccio a classi, o implem. di interfaccia): public class Tree { // albero non vuoto... public void preorder() { System.out.println(root()); left().preorder(); right().preorder(); }

VISITA IN ORDINE POSTICIPATO in C: void postorder(tree T) { if (T==null) return; postorder(left(t)); postorder(right(t)); printelement(root(t)); } in Java (approccio a classi, o implem. di interfaccia): public class Tree { // albero non vuoto... public void postorder() { left().postorder(); right().postorder(); System.out.println(root()); }

VISITA IN ORDINE (solo alberi binari) in C: void inorder(tree T) { if (T==null) return; inorder(left(t)); printelement(root(t)); inorder(right(t)); } in Java (approccio a classi, o implem. di interfaccia): public class Tree { // albero non vuoto... public void inorder() { left().inorder(); System.out.print(root()); right().inorder(); }

VISITE & ALGORITMI Poiché la visita ricorsiva è il solo modo per scorrere uno ad uno tutti gli elementi di un albero, tutti gli algoritmi che operano su alberi sono una "variazione sul tema" di uno degli algoritmi di visita. Cambia solo l'operazione da fare sulla radice: non più una semplice stampa (print)... ma confronti, test...

ESEMPIO: cercare un elemento nell'albero se l'albero è vuoto, l'elemento non c'è altrimenti (si sfrutta la visita in pre-order) se tale elemento è la radice, lo si è trovato, altrimenti va cercato nei sottoalberi figli. Esempio Java (caso albero non vuoto) public boolean member(object e) { if (e.equals(root())) return true; Tree l = left(), r = right(); if (l!=null && l.member(e)) return true; if (r!=null && r.member(e)) return true; return false; }

ESERCIZIO Scrivere un algoritmo che, dato un albero di interi, conti gli elementi uguali a un dato X. Prendiamo un algoritmo di visita e, al posto della stampa, inseriamo il test richiesto Restituiamo il risultato del conteggio nei figli, aumentato di 1 se il test è risultato positivo. Esempio Java (caso albero non vuoto) public int countequals(object x) { Tree l = left(), r = right(); return (l==null? 0 : l.countequals(x)) + (r==null? 0 : r.countequals(x)) + (root().equals(x)>0? 1 : 0); }

ALBERI BINARI DI RICERCA Come creare un albero binario di ricerca? Aggiungendo via via i nuovi elementi in modo da rispettare la relazione d'ordine Nel caso di alberi come valori, si crea un nuovo albero se l'elemento è minore o uguale alla radice, l'elemento va inserito nel sottoalbero di sinistra se è maggiore, va nel sottoalbero di destra quando si arriva a un sottoalbero vuoto, si aggiunge l'elemento come nuova foglia.

ESEMPIO (1/4) BinSearchTree t = new BinSearchTree(5); 5

ESEMPIO (2/4) BinSearchTree t = new BinSearchTree(5); t = new BinSearchTree(2,t); 5 2

ESEMPIO (3/4) BinSearchTree t = new BinSearchTree(5); t = new BinSearchTree(2,t); t = new BinSearchTree(8,t); 5 2 8

ESEMPIO (4/4) BinSearchTree t = new BinSearchTree(5); t = new BinSearchTree(2,t); t = new BinSearchTree(8,t); t = new BinSearchTree(6,t);... Come diventa l'albero se si inseriscono nell'ordine: 4, 3, 7, 9 3, 4, 9, 7...? L'ordine di inserimento è rilevante: ordine diverso implica albero diverso 5 2 8 6

JAVA: GLI ALBERI PREDEFINITI Il package java.util definisce: interfacce che rappresentano tipi di dati astratti di contenitori (cfr. SortedSet) classi che forniscono specifici contenitori concreti (cfr. TreeSet, che usa TreeMap) I metodi principali (add, remove, contains, isempty, ) sono introdotti da Collection e specializzati dalle varie classi.

java.util.treeset SONO ALBERI/CONTENITORI, NON VALORI! L'albero è ordinato in senso ascendente secondo l'ordinamento naturale dei suoi elementi espresso dall'interfaccia Comparable; È responsabilità dell'utente garantire che tale ordinamento sia consistente con il concetto di equals definito per il tipo di elementi usati Garantisce un tempo di ricerca dell'ordine di log(n) per le operazioni fondamentali Costruzione: Operazioni: TreeSet t = new TreeSet(); add, remove, contains, isempty