algoritmi e strutture di dati

Documenti analoghi
Algoritmi e Strutture di Dati

Algoritmi e Strutture di Dati A.A Esempio di prova scritta del 19 gennaio 2018 D.M CFU Libri e appunti chiusi Tempo = 2:00h

algoritmi e strutture di dati

Note per la Lezione 4 Ugo Vaccaro

Soluzioni della settima esercitazione di Algoritmi 1

algoritmi e strutture di dati

Algoritmi e Strutture Dati

Problemi di ordinamento

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

7.1 Progettare un algoritmo per costruire ciclo euleriano di un grafo non orientato.

Algoritmi e Strutture di Dati

Algoritmi e Strutture di Dati

Progettazione di Algoritmi Anno Accademico Esercizi su Grafi: Parte Prima

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

PROVETTE D ESAME. Algoritmi e Strutture Dati

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

Esercizi di Algoritmi e Strutture Dati

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.

Dati e Algoritmi I (Pietracaprina) Esercizi svolti sui Grafi

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

In questa lezione Alberi binari di ricerca

Esempi. non. orientato. orientato

Esercitazione 3. Osserviamo che, dato un grafo con pesi distinti, questo ammette un unico MST.

Grafi: visita generica

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

Algoritmi e Strutture di Dati

Esercizi su alberi binari

G è 2-colorabile se ogni nodo può essere colorato di bianco o di nero in modo che nodi connessi da archi siano colorati con colori distinti.

Progettazione di algoritmi

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

Grafi non orientati. Grafi (non orientati) Rappresentazione di Grafi: matrice delle adiacenze. Tipiche applicazioni di modelli basati su grafi

Grafi Stessa distanza

Gennaio

Alberi. Definizione, realizzazione e algoritmi elementari. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 7

algoritmi e strutture di dati

Corso di Programmazione

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

Algoritmi e Strutture di Dati II 2. Visite di grafi

Fondamenti teorici e programmazione

Sommario della lezione

Esercitazione 7. Grafi. Rappresentazione e algoritmi di visita

LABORATORIO DI ALGORITMI E STRUTTURE DATI A-L. Ingegneria e scienze informatiche Cesena A.A: 2016/2017 Docente: Greta Sasso

Grafi Tutte le strade portano a Roma

Algoritmi e Strutture di Dati

Bioinformatica. Grafi. a.a Francesca Cordero. Grafi Bioinformatica

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

Note per la Lezione 21 Ugo Vaccaro

Sommario della lezione

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

Corso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 9/9/2015

Visite in Grafi BFS e DFS

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

Laboratorio di Programmazione

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

Graf. Progettazione di Algoritmi a.a Matricole congrue a 1. Docente: Annalisa De Bonis. Grafi non direzionati

tipi di dato astratti

Sommario della lezione

Algoritmi e Strutture Dati (Mod. B) Algoritmi su grafi Ricerca in profondità (Depth-First Search) Parte II

Alberi binari di ricerca

Grafi pesati Minimo albero ricoprente

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Algoritmi e Strutture Dati

Problemi, istanze, soluzioni

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

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

In questa lezione Alberi binari di ricerca: la cancellazione

Esercizi su BST. IASD a.a A. De Bonis

Esercizi Capitolo 5 - Alberi

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

Algoritmi e Strutture Dati

ALGORITMI E STRUTTURE DATI

Note per la Lezione 22 Ugo Vaccaro

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Laboratorio di Informatica. Lezione 8: Liste e alberi

Algoritmi e Strutture Dati Laboratorio 15/12/2008. Daniele Loiacono

Algoritmi e Strutture di Dati

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Esercizio. 2 i=i*2) j=j*2)

Lezione 12 Tabelle Hash

2 OTTIMIZZAZIONE SU GRAFI. E. Amaldi Fondamenti di R.O. Politecnico di Milano 1

Algoritmi e Strutture Dati

Strutture dati dinamiche in C (II)

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

Progettazione di Algoritmi - lezione 6

ricerca di un elemento, verifica dell appartenenza di un elemento

Esercizi BST - AVL. E. Fachini

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

Progettazione di Algoritmi

Lezione 6: 12 Novembre 2013

PROGRAMMAZIONE 1 e LABORATORIO (A,B) - a.a Prova scritta del 10/01/2012 SOLUZIONI PROPOSTE

Il Problema dell Albero Ricoprente Minimo (Shortest Spanning Tree - SST)

Problema del cammino minimo

Introduzione ai Grafi: Implementazione e operazioni di base

Algoritmi e Strutture Dati

Esercizi Union-Find e su Grafi. Ugo Vaccaro

Transcript:

algoritmi e strutture di dati esercizi di ricapitolazione m.patrignani esercizi sulle liste (1) scrivi lo pseudocodice della procedura TOGLI_MINORI(l, k) che elimina dalla lista di interi doppiamente concatenata l tutti gli elementi di valore minore di k, inserendoli in un altra lista (in qualunque ordine) che viene restituita in output scrivi lo pseudocodice della procedura MULTIINSIEME(l) che ritorna TRUE se una lista di interi doppiamente concatenata l rappresenta un multiinsieme (cioè un insieme con elementi ripetuti), altrimenti, se tutti gli elementi sono distinti, ritorna FALSE 1

esercizi sulle liste (2) scrivi lo pseudocodice della procedura INTERSEZIONE(l 1,1 2 ) che accetti come input due insiemi di interi, rappresentati tramite liste doppiamente concatenate, e restituisca in output una lista doppiamente concatenata che rappresenti l intersezione dei due insiemi scrivi lo pseudocodice della procedura UNIONE(l 1,1 2 ) che accetti come input due insiemi di interi, rappresentati tramite liste doppiamente concatenate, e restituisca in output una lista doppiamente concatenata che rappresenti l unione dei due insiemi esercizi sugli alberi binari (1) scrivi lo pseudocodice della funzione CONTA_MINORI(t) che accetti in input un albero binario t e restituisca il numero di nodi di t che hanno un valore della chiave minore di quello del genitore la radice, non avendo genitore, non deve essere contata 2

esercizi sugli alberi binari (2) scrivi lo pseudocodice della funzione CONTA_MAGGIORI(t) che accetti in input un albero binario t e restituisca il numero di nodi di t che hanno un valore della chiave maggiore della somma dei valori dei loro discendenti alberi di grado arbitrario scrivi lo pseudocodice la funzione MERGE(t 1,t 2 ) che accetti in input due alberi di grado arbitrario t 1 e t 2, in cui si assume che il campo info della radice di t2 sia uguale a quello di una foglia di t1, e produca in output un albero t 3 che abbia gli stessi nodi ed archi di t 1 e di t 2 gli alberi t 1 e t 2 devono rimanere invariati gli alberi sono rappresentati con la struttura figliosinistro fratello-destro 3

visite di grafi scrivi lo pseudocodice la funzione CONNETTI(A) che accetti in input un grafo non orientato descritto tramite un array A di liste di adiacenza doppiamente concatenate, calcoli le componenti connesse del grafo e modifichi il grafo stesso aggiungendo gli archi che sono sufficienti per produrre un grafo connesso LEGENDA 3 1 4 componente connessa 2 5 7 9 arco presente in input 6 8 10 arco aggiunto per connettere il grafo grafi e alberi (1) scrivi lo pseudocodice la funzione GRAFO- DA-ALBERO(t) che accetti in input un albero di grado arbitrario t (con i nodi numerati da 0 ad n-1) e produca in output un grafo non orientato A con gli stessi archi e nodi dell albero t l albero t è rappresentato con la struttura figliosinistro fratello-destro il grafo A è rappresentato da un array di riferimenti al primo elemento delle liste di adiacenza (doppiamente concatenate) 4

grafi e alberi (2) scrivi lo pseudocodice la funzione SEMPLIFICA(A,t) che accetti in input un grafo non orientato A e un albero ricoprente di A di grado arbitrario t e rimuova dal grafo A tutti gli archi che fanno parte dell albero t il grafo A è rappresentato da un array di riferimenti al primo elemento delle liste di adiacenza (doppiamente concatenate) l albero t è rappresentato con la struttura figliosinistro fratello-destro grafi e alberi (3) scrivi lo pseudocodice la funzione SEMPLIFICA(A,t) che accetti in input un grafo non orientato A e un albero ricoprente di A di grado arbitrario t e rimuova dal grafo A tutti gli archi che non fanno parte dell albero t il grafo A è rappresentato da un array di riferimenti al primo elemento delle liste di adiacenza (doppiamente concatenate) l albero t è rappresentato con la struttura figliosinistro fratello-destro 5

soluzioni soluzioni: TOGLI_MINORI TOGLI_MINORI(l, k) /* lout è una nuova lista doppiamente concatenata di interi */ lout.head = NULL /* inizializzazione (non indispensabile) */ x = l.head temp = x.next /* potrei dover rimuovere x, perdendo x.next */ if (x.info < k) AGGIUNGI(lout,x.info) RIMUOVI(l,x) x = temp return lout AGGIUNGI(l,v) /* temp è un nuovo elemento della lista */ temp.info = v temp.prev = NULL temp.next = l.head if (l.head!= NULL) l.head.prev = temp l.head = temp RIMUOVI(l,x) /* suppongo x appartenga ad l */ if x.prev!= NULL /* non è primo elemento */ x.prev.next = x.next else l.head = x.next if x.next!= NULL /* esiste successivo */ x.next.prev = x.prev 6

soluzioni: MULTIINSIEME MULTIINSIEME(l) x = l.head y = x.next /* confronto x con i successivi */ while y!= NULL if x.info == y.info return TRUE /* trovato doppione */ y = y.next return FALSE soluzioni: INTERSEZIONE INTERSEZIONE(l1,l2) /* lout è una nuova lista doppiamente concatenata di interi */ lout.head = 0 /* inizializzazione (non indispensabile) */ x = l1.head if TROVATO(l2, x.info) AGGIUNGI(lout, x.info) return lout TROVATO(l,v) x = l.head if (x.info == v) return TRUE return FALSE Nota: per la funzione AGGIUNGI vedi le soluzioni dei precedenti esercizi 7

soluzioni: UNIONE UNIONE(l1,l2) /* lout è una nuova lista doppiamente concatenata di interi */ lout.head = 0 /* inizializzazione (non indispensabile) */ x = l1.head AGGIUNGI(lout, x.info) x = l2.head if!trovato(lout, x.info) AGGIUNGI(lout.x.info) return lout Nota: per le funzioni AGGIUNGI e TROVATO vedi le soluzioni degli esercizi precedenti soluzioni: CONTA_MINORI CONTA_MINORI(t) return CONTA_RIC(t.root) CONTA_RIC(n) minori = 0 if (n == NULL) return minori if (n.parent!= NULL) if (n.info < n.parent.info) minori = 1 return minori + CONTA_RIC(n.left) + CONTA_RIC(n.right) Nota: la complessità della funzione è Θ(n), dove n è il numero di nodi dell albero t 8

soluzioni: CONNETTI (1) CONNETTI(A) cont = 0 /* contatore delle componenti connesse */ /* color è un array di interi con A.length posizioni */ for i = 0 to color.length-1 color[i] = 0 for i = 0 to A.length-1 if (color[i]==0) cont = cont + 1 /* nuova componente connessa */ DFS(A, i, color, cont) /* visito e marco con cont */ /* rapp è un array di interi di dimensione cont+1. rapp[i] è l indice di un nodo qualsiasi che appartiene alla componente connessa i-esima (rapp[0] non è utilizzato) */ for i = 1 to cont for j = 0 to color.length-1 if (color[j] == i) rapp[i] = j j = color.length /* per interrompere la scansione (break) */ for i = 2 to cont AGGIUNGI_ARCO(A,rapp[1],rapp[i]) AGGIUNGI_ARCO(A,rapp[i],rapp[1]) soluzioni: CONNETTI (2) DFS(A, i, color,k) /* visito e marco tutto con k */ color[i] = k /* visitato*/ x = A[i] v = x.info if (color[v] == 0) DFS(A, v, color, k) AGGIUNGI_ARCO(A,i,j) /* temp nuovo elemento della lista */ temp.info = j temp.prev = NULL temp.next = A[i] if (A[i]!= NULL) A[i].prev = temp A[i] = temp 9

soluzione alternativa: CONNETTI CONNETTI(A) /* color è un array di interi con A.length posizioni */ for i = 0 to color.length-1 color[i] = 0 for i = 0 to A.length-1 if (color[i]==0) DFS(A, i, color, cont) /* visito e marco con cont */ if (i!= 0) AGGIUNGI_ARCO(A,0,i) 10