Algoritmi e Strutture Dati

Похожие документы
Alberto Montresor Università di Trento

Esercitazioni di Algoritmi e Strutture Dati

Esercizi Capitolo 6 - Alberi binari di ricerca

Esercitazione 6. Alberi binari di ricerca

Alberi binari di ricerca

Alberi binari e alberi binari di ricerca

Alberi ed Alberi Binari

Il problema dello zaino

Alberi Binari di Ricerca

Esercizi Capitolo 5 - Alberi

Esercizi Capitolo 6 - Alberi binari di ricerca

Algoritmi e Strutture Dati. HeapSort

Alberi Bilanciati di Ricerca

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

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

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

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

Note per la Lezione 4 Ugo Vaccaro

ADT Coda con priorità

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

Esercizi di Algoritmi e Strutture Dati

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

lezione 9 min-heap binario Heap e Alberi posizionali generali

Heap e code di priorità

Algoritmi e Strutture Dati

Per semplicità eliminiamo le ripetizioni nell'albero.

Algoritmi di Visita di Grafi. Damiano Macedonio

Lezione 9 Alberi binari di ricerca

Progettazione di algoritmi

Alberto Montresor Università di Trento

Algoritmi e Strutture Dati

Tabelle hash. Damiano Macedonio Università Ca' Foscari di Venezia.

Grafi: visite. Una breve presentazione. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Verificare se un albero binario è bilanciato

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

alberi binari e ricorsione

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

Esercizi di Algoritmi e Strutture Dati

Grafi. Moreno Marzolla Dip. di Informatica Scienza e Ingegneria Università di Bologna. moreno.marzolla@unibo.it

Esercizi di Algoritmi e Strutture Dati

Grafi: definizioni e visite

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Problema dell albero di cammini minimi (SPT, Shortest Path Tree) o problema dei cammini minimi :

Alberi binari. Esercizi su alberi binari

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

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

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

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

TRIE (albero digitale di ricerca)

Ingegneria degli Algoritmi (II parte pratica)

Sommario. Rappresentazione dei grafi. Ordinamento topologico. Visita in ampiezza Visita in profondità

Problema del cammino minimo

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

Appunti di Algoritmi e Strutture Dati. Grafi. Gianfranco Gallizia

Grafi: visita generica

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Strutture di accesso ai dati: B + -tree

Programmazione in Python. Moreno Marzolla

Grammatiche. Grammatiche libere da contesto Grammatiche regolari Potenza delle grammatiche libere e regolari Struttura di frase: Alberi di derivazione

In questa lezione Strutture dati elementari: Pila Coda

Algoritmi e strutture dati

Laboratorio 07. Programmazione - CdS Matematica. Michele Donini 10 dicembre 2015

Algoritmi e Strutture Dati

INDICI PER FILE. Accesso secondario. Strutture ausiliarie di accesso

Programmazione Orientata agli Oggetti in Linguaggio Java

Minimo albero di copertura

Programmazione Procedurale in Linguaggio C++

Alberi binari di ricerca

Algoritmi di Ricerca. Esempi di programmi Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Problemi, istanze, soluzioni

Esercizi Capitolo 7 - Hash

Esercitazione 5 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

I B+ Alberi. Sommario

Транскрипт:

Algoritmi e Strutture Dati Capitolo 5 - Alberi Alberto Montresor Università di Trento This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. 1

Alberi radicati Albero: definizione informale E' un insieme dinamico i cui elementi hanno relazioni di tipo gerarchico Albero: definizione ricorsiva Insieme vuoto di nodi, oppure Una radice T e 0 o più sottoalberi, con la radice di ogni sottoalbero collegata a T da un arco (orientato) T es.: radice T con n sottoalberi T 1 T 2 T n 2

Alberi ordinati Figlio (child) di T T Radice (root) Figlio di T Radice del proprio sottoalbero Nodi interni = Nodi - Foglie Padre (parent) dei nodi j e k Sottoalbero a j k... Nodi fratelli Foglie (leaf) (figli di a) 3

Alberi: definizioni In un albero Profondità di un nodo: la lunghezza del percorso dalla radice al nodo (i.e., numero archi attraversati) Livello: l'insieme dei nodi alla stessa profondità Altezza dell'albero: massimo livello delle sue foglie p=0 p=1 p=2 p=3 Livello 3 Altezza albero: 3 4

Alberi? 5

Alberi? DAG Radice Foresta 5

Alberi: una possibile specifica TREE % Costruisce un nuovo albero, costituito da un solo nodo e contenente v Tree(ITEM v) % Legge il valore ITEM read() % Scrive v nel nodo write(item v) % Restituisce il padre; nil se questo nodo è radice TREE parent() % Restituisce il primo figlio; nil se questo nodo è foglia TREE leftmostchild() % Restituisce il prossimo fratello del nodo a cui è applicato; nil se assente TREE rightsibling() % Inserisce il sottoalbero t come primo figlio di questo nodo insertchild(tree t) precondition: t.parent() = nil % Inserisce il sottoalbero t come successivo fratello di questo nodo insertsibling(tree t) precondition: t.parent() = nil % Distrugge il sottoalbero radicato nel primo figlio di questo nodo deletechild() % Distrugge il sottoalbero radicato nel prossimo fratello di questo nodo deletesibling() 6

Algoritmi di visita degli alberi Visita (o attraversamento) di un albero: Algoritmo per visitare tutti i nodi di un albero In profondità (depth-first search, a scandaglio): DFS Vengono visitati i rami, uno dopo l altro Tre varianti In ampiezza (breadth-first search, a ventaglio): BFS A livelli, partendo dalla radice 7

Visita alberi: in profondità in ordine anticipato (previsita) visitaprofondità(tree t) precondition: t = nil (1) esame anticipato del nodo radice di t TREE u t.leftmostchild() while u = nil do visitaprofondità(u) u u.rightsibling() (2) esame posticipato del nodo radice di t T a b e c d f g Sequenza: a b c d e f g 8

Visita alberi: in profondità in ordine posticipato (postvisita) visitaprofondità(tree t) precondition: t = nil (1) esame anticipato del nodo radice di t TREE u t.leftmostchild() while u = nil do visitaprofondità(u) u u.rightsibling() (2) esame posticipato del nodo radice di t T a b e c d f g Sequenza: c d b f g e a 9

Visita alberi: in profondità in ordine simmetrico (invisita) invisita(tree t) precondition: t = nil TREE u t.leftmostchild() integer k 0 while u = nil and k<ido k k +1 invisita(u) u u.rightsibling() esame simmetrico del nodo t while u = nil do invisita(u) u u.rightsibling() T a b e c d f g Sequenza (i=1): c b d a f e g 10

Visita alberi: in ampiezza visitaampiezza(tree t) precondition: t = nil QUEUE Q Queue() Q.enqueue(t) while not Q.isEmpty() do TREE u Q.dequeue() esame per livelli del nodo u u u.leftmostchild() while u = nil do Q.enqueue(u) u u.rightsibling() T a b e c d f g Sequenza: a b e c d f g 11

Realizzazione con vettore dei figli / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / Padre Rischio di sprecare memoria se molti nodi hanno grado minore del grado massimo k. Nodo Array di Figli 12

Realizzazione con puntatori padre/primo-figlio/fratello / / / / / / / / / / / / / / / / Padre Soluzione: usare una lista di figli (fratelli). Nodo Primo Figlio Fratello 13

Realizzazione con puntatori padre/primo-figlio/fratello TREE NODE parent NODE child NODE sibling ITEM value Tree(ITEM v) TREE t new TREE t.value v t.parent t.child t.sibling nil return t insertchild(tree t) t.parent() this t.rightsibling() child child t insertsibling(tree t) t.parent() this t.rightsibling() sibling sibling t % Puntatore al padre % Puntatore al primo figlio % Puntatore al successivo fratello % Valore del nodo % Crea un nuovo nodo % Inserisce t prima dell attuale primo figlio % Inserisce t prima dell attuale fratello 14

Realizzazione con puntatori padre/primo-figlio/fratello deletechild() NODE newchild child.rightsibling() delete(child) child newchild deletesibling() NODE newbrother sibling.rightsibling() delete(sibling) sibling newbrother delete(tree t) NODE u t.leftmostchild() while u = nil do TREE next u.rightsibling() delete(u) u next delete t 15

Realizzazione con vettore dei padri L'albero è rappresentato da un vettore i cui elementi contengono l'indice del padre Esempio: 0 a 1 b 1 e 2 c 2 d 3 f 3 g T a b e c d f g 16

Realizzazione con vettore dei padri TREE integer[]p % Vettore dei padri % Costruisce una foresta con n nodi isolati Tree(integer n) p new integer[1...n] for i 1 to n do p[i] 0 % Restituisce il padre del nodo i; restituisce 0 se i è radice integer parent(integer i) return p[i] % Rende il nodo i un figlio del nodo j setparent(integer i, integer j) p[i] j 17

Alberi binari Definizione Un albero binario è un albero ordinato in cui ogni nodo ha al più due figli e si fa distinzione tra il figlio sinistro ed il figlio destro di un nodo. Nota: due alberi T e U aventi gli stessi nodi, gli stessi figli per ogni nodo e la stessa radice, sono distinti qualora un nodo u sia designato come figlio sinistro di un nodo v in T e come figlio destro del medesimo nodo in U livello 1 1 1 0 2 2 2 1 3 4 3 4 3 4 2 5 5 5 3 T 1 T 2 T 3 18

Alberi binari Figlio sinistro Radice del sottoalbero sinistro Sottoalbero sinistro Radice j.parent() Padre del nodo j (e k) a Figlio destro Radice del sottoalbero destro Sottoalbero destro j k a.left() a.right() 19

Alberi binari: specifica TREE % Restituisce il figlio sinistro (destro) di questo nodo; restituisce nil se assente TREE left() TREE right() % Inserisce il sottoalbero t come figlio sinistro (destro) di questo nodo insertleft(tree t) precondition: t.parent = nil insertright(tree t) precondition: t.parent = nil % Distrugge il sottoalbero sinistro (destro) di questo nodo deleteleft() deleteright() 20

Alberi binari: realizzazione / / / / / / Padre / / / / Figlio Sinistro Figlio Destro Nodo 21

Alberi binari: realizzazione TREE Tree(ITEM v) TREE t = new TREE t.parent nil t.left t.right nil t.value v return t insertleft(tree T ) T.parent this left T insertright(tree T ) T.parent this right T TREE deleteleft() if left = nil then left.deleteleft() left.deleteright() delete left left nil deleteright() if right = nil then right.deleteleft() right.deleteright() delete right right nil Per motivi di spazio, le operazioni parent(), left(), right(), read() e write() non sono mostrate; semplicemente, restituiscono il valore della variabile corrispondente. 22

Alberi binari: visite in profondità visitaprofondità(tree t) if t = nil then (1) esame anticipato del nodo radice di t visitaprofondità(t.left()) (2) esame simmetrico del nodo radice di t visitaprofondità(t.right()) (3) esame posticipato del nodo radice di t 23

Limite inferiore complessità ordinamento Albero delle scelte in algoritmi di ordinamento Sequenze di confronti (a due alternative) rappresentabile come albero binario Nodi interni confronti, foglie soluzioni del problema Percorso radice-foglia: insieme di confronti per individuare una soluzione Limite inferiore ordinamento Sia n la dimensione del vettore Numero di possibili soluzioni: n! Altezza minima albero: log2 n! n/2 log2 n/2 Da cui deriva che qualunque algoritmo di ordinamento richiede Ω(n log n) confronti si a < b no b < c c < b si no si no a,b,c a < c c,b,a a < c si no si no a,c,b c,a,b b,a,c b,c,a Figura 5.8: Albero delle scelte per l ordinamento di tre numeri. 24

Semplici esercizi basati su visite Es. 5.1 - Dato un albero radicato T, calcolare la sua altezza Dato un albero radicato T, calcolare il numero totale di nodi Dato un albero radicato T, stampare tutti i nodi a profondità h 25