Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione



Documenti analoghi
Esercizi Capitolo 6 - Alberi binari di ricerca

Alberi binari di ricerca

Algoritmi e Strutture Dati

4.1 Modelli di calcolo analisi asintotica e ricorrenze

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Esercizi per il corso di Algoritmi e Strutture Dati

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Esercizi Capitolo 5 - Alberi

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Alberi auto-aggiustanti

Sono casi particolari di MCF : SPT (cammini minimi) non vi sono vincoli di capacità superiore (solo x ij > 0) (i, j) A : c ij, costo di percorrenza

B-Tree. Struttura dati usata in applicazioni che necessitano di gestire insiemi di chiavi ordinate Una variante (B+-Tree) è diffusa in:

Algoritmi e Strutture Dati

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

Programmazione dinamica

Algoritmi di Ricerca. Esempi di programmi Java

B+Trees. Introduzione

Algoritmi e strutture dati. Codici di Huffman

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

Alberi binari di ricerca

Due algoritmi di ordinamento. basati sulla tecnica Divide et Impera: Mergesort e Quicksort

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

( x) ( x) 0. Equazioni irrazionali

Lezione 8. La macchina universale

La struttura dati ad albero binario

Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2)

Traccia di soluzione dell esercizio del 25/1/2005

Informatica 3. LEZIONE 23: Indicizzazione. Modulo 1: Indicizzazione lineare, ISAM e ad albero Modulo 2: 2-3 trees, B-trees e B + -trees

Algebra di Boole ed Elementi di Logica

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Laboratorio di architettura degli elaboratori Progetto finale AA 2005/2006

STRUTTURE NON LINEARI

f(x) = 1 x. Il dominio di questa funzione è il sottoinsieme proprio di R dato da

1 Applicazioni Lineari tra Spazi Vettoriali

risulta (x) = 1 se x < 0.

MATEMATICA DEL DISCRETO elementi di teoria dei grafi. anno acc. 2009/2010

LE FUNZIONI A DUE VARIABILI

Semantica Assiomatica

4. Operazioni elementari per righe e colonne

Matematica generale CTF

2 FUNZIONI REALI DI VARIABILE REALE

Esercizi Capitolo 2 - Analisi di Algoritmi

Descrizione di un algoritmo

Note su quicksort per ASD (DRAFT)

Soluzione dell esercizio del 2 Febbraio 2004

Raccolta degli Scritti d Esame di ANALISI MATEMATICA U.D. 1 assegnati nei Corsi di Laurea di Fisica, Fisica Applicata, Matematica

Soluzione di equazioni quadratiche

Introduzione al MATLAB c Parte 2

Algoritmi. Matricole dispari Prof.ssa Anselmo. Pre-appello del 15 Gennaio Attenzione:

LISTE, INSIEMI, ALBERI E RICORSIONE

10. Insiemi non misurabili secondo Lebesgue.

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI

RAPPRESENTAZIONE GRAFICA E ANALISI DEI DATI SPERIMENTALI CON EXCEL

Complessità Computazionale

PROVA FINALE V. AULETTA G. PERSIANO ALGORITMI II - -MAGIS INFO

Per visualizzare e immettere i dati in una tabella è possibile utilizzare le maschere;

Teoria in sintesi 10. Attività di sportello 1, 24 - Attività di sportello 2, 24 - Verifica conclusiva, 25. Teoria in sintesi 26

Introduzione ai tipi di dato astratti: applicazione alle liste

Plate Locator Riconoscimento Automatico di Targhe

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

LEZIONE 7. Esercizio 7.1. Quale delle seguenti funzioni è decrescente in ( 3, 0) e ha derivata prima in 3 che vale 0? x x2. 2, x3 +2x +3.

4 3 4 = 4 x x x 10 0 aaa

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Metodi e Modelli per l Ottimizzazione Combinatoria Il problema del flusso di costo minimo

AA LA RICORSIONE

Alberi binari di ricerca

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Capitolo 5. Funzioni. Grafici.

la funzione è definita la funzione non è definita Si osservi, infatti, che la radice di un numero negativo non esiste nel campo dei numeri reali.

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

Tricks & Tips. [Access] Tutorial - ActiveX - Controllo Tree View. - Michele de Nittis - Versione: 1 Data Versione: venerdì 30 agosto 2002

Proof. Dimostrazione per assurdo. Consideriamo l insieme complementare di P nell insieme

Iniziamo con un esercizio sul massimo comun divisore: Esercizio 1. Sia d = G.C.D.(a, b), allora:

Quando A e B coincidono una coppia ordinata é determinata anche dalla loro posizione.

Algebra Booleana ed Espressioni Booleane

Architettura (10/9/2003) Pag. 1/6. Cognome e Nome (in stampatello):

Parte 1. Vettori di bit - AA. 2012/13 1.1

Calcolare il massimo di una lista

Schemi delle Lezioni di Matematica Generale. Pierpaolo Montana

Un metodo per il rilevamento degli errori: la tecnica del Bit di Parità

Protocollo di tracciamento e valutazione degli studenti dei corsi di italiano ICoNLingua A.A

Gli algoritmi: definizioni e proprietà

Ricerca binaria. Operazione dominante: confronto

Interpolazione ed approssimazione di funzioni

Funzioni. Parte prima. Daniele Serra

Si basano sul seguente Teorema: S = A sse S { A} è insoddisfacibile.

Per studio di funzione intendiamo un insieme di procedure che hanno lo scopo di analizzare le proprietà di una funzione f ( x) R R

ESEMPI DI QUERY SQL. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7

GESTIONE INFORMATICA DEI DATI AZIENDALI

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1

CONTINUITÀ E DERIVABILITÀ Esercizi proposti. 1. Determinare lim M(sinx) (M(t) denota la mantissa di t)

Corso di Tecniche di Programmazione

Funzioni - Parte II. 1 Composizione di Funzioni. Antonio Lazzarini. Prerequisiti: Funzioni (Parte I).

Anno 5 4. Funzioni reali: il dominio

Laboratorio di Algoritmi e Strutture Dati

Alberi di ricerca binari

ALGEBRA DELLE PROPOSIZIONI

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo

Transcript:

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione Esercizi II parte Esercizio 1 Discutere la correttezza di ciascuna delle seguenti affermazioni. Dimostrare formalmente la validità delle risposte date. 1. La ricerca di una chiave in un albero R/B ha complessità asintotica lineare nel numero dei nodi dell albero. 2. La ricerca di una chiave in un max-heap binario ha complessità asintotica lineare nel numero dei nodi dell albero. 3. L inserimento di una chiave in un BST ha complessità asintotica lineare nel numero dei nodi dell albero. 4. La ricerca di una chiave in un array ordinato ha complessità asintotica logaritmica nel numero di elementi dell array. 1. La ricerca di una chiave in un albero R/B ha complessità asintotica lineare nel numero dei nodi dell albero. No, la complessità asintotica è lineare nell altezza (come è stato dimostrato per tutti i BST) e negli alberi R/B tale altezza è logaritmica nel numero dei nodi. 2. La ricerca di una chiave in un max-heap binario ha complessità asintotica lineare nel numero dei nodi dell albero. Sì, la condizione di max-heap, nel caso peggiore in cui la chiave cercata non è presente ed è minore di tutte le chiavi presenti, richiede la visita di tutti gli elementi. 3. L inserimento di una chiave in un BST ha complessità asintotica lineare nel numero dei nodi dell albero. Sì, la complessità dell operazione di inserimento è lineare nell altezza che è, nel caso peggiore, lineare nel numero di nodi. 4. La ricerca di una chiave in un array ordinato ha complessità asintotica logaritmica nel numero di elementi dell array. Sì, perchè possiamo applicare l algoritmo di ricerca binaria. Esercizio 2 1. In quanto tempo è possibile trovare una chiave in un albero R/B di n elementi? Giustificare la risposta. 2. Dato il seguente albero BST 15 8 37 5 13 20 45 \ \ / 2 7 14 28 40 si consideri l inserimento della chiave 16 seguito dalla cancellazione della chiave 8 e si disegni l albero risultante.

1. La risposta corretta è Θ(lg n), dato che un albero R/B è un BST bilanciato. 2. L albero finale è: 15 13 37 5 14 20 45 / 2 7 16 28 40 Esercizio 3 Sia T un albero generale i cui nodi hanno chiavi intere e gli attributi: chiave, figlio, fratello. Scrivere un algoritmo che trasforma T raddoppiando i valori di tutte le chiavi sui livelli dispari dell albero. Si tratta di realizzare una visita dell albero che tiene conto del livello del nodo considerato. La chiamata esterna sarà trasforma(root[t],false), assumendo che la radice si trovi sul livello 0 (pari). trasforma(x,raddoppia) if x =/= NIL then if raddoppia then chiave[x] <- 2*chiave[x] trasforma(fratello[x],raddoppia) trasforma(figlio[x], not(raddoppia)) Esercizio 4 Si assuma di disporre dei seguenti costruttori di alberi binari: - tree NIL() che restituisce una foglia NIL, - tree(x, T1,T2) che data una chiave x e due alberi binari T1 e T2 restituisce un nuovo albero binario con radice x, sottoalbero sinistro T1 e sottoalbero destro T2. Dato un max-heap memorizzato in un array A[1..n], si sviluppi un algoritmo efficiente per costruire un BST T che contiene tutte le chiavi di A. Si dica quale è la complessità dell algoritmo e si dimostri la sua correttezza. Nota: Si osservi che non si richiede che T sia bilanciato. trasforma(a,n) if n>1 then root <- A[1] A[1] <- A[n] heapify(a,1,n-1) T1 <- trasforma(a,n-1) T2 <- tree_nil() return tree(root,t1,t2) else return tree_nil() Si tratta di una diversa formulazione dell algoritmo heapsort; la complessità si valuta in modo analogo ed è Θ(n lg n). Per la correttezza possiamo dimostrare che per ogni m 0 se A[1..m] è un max-heap allora trasforma(a,m) costruisce un albero BST che è in realta una catena a sinistra ordinata in ordine decrescente dalla radice alla foglia più a sinistra.

La correttezza è ovvia se m=0. Per m = n > 0, osserviamo che prima della chiamata ricorsiva A[1..(n-1)] contiene un max-heap e pertanto, per ipotesi induttiva, trasforma(a,n-1) costruisce un BST T1 che è una catena a sinistra e contiene tutte le chiavi di A[1..n-1]. Osservando poi che root è l elemento più grande di A[1..n] otteniamo il risultato. Esercizio 5 1) Si scriva lo pseudocodice di un algoritmo che dato un BST T restituisce il numero massimo di ripetizioni di una chiave in T. Esempio la risposta associata a 4 4 5 / 2 4 5 sarà 3 perchè la chiave 4 compare 3 volte, la chiave 5 due volte e la chiave 2 una sola volta. 2) (facoltativo) Si dimostri la correttezza dell algoritmo e se ne discuta la complessità. 1) maxripetizioni(t) x <-- root(t) if (x = NIL) then return 0 y <- BST_minimum(x) max_corsa <- 1 corsa <- 1 k <- key[y] z <- BST_successor[y] // max_corsa rappresenta il numero massimo di ripetizioni di una chiave // nella porzione di albero gi\ a visitata, k \ e l ultima chiave incontrata e // corsa \ e il numero delle sue ripetizioni gi\ a trovate. while (z =\= NIL) do if (k = key[z]) then corsa <- corsa + 1 else max_corsa <- max(max_corsa,corsa) corsa <- 1 k <- key[z] z <- successor[z] return max_corsa Esercizio 6 Si disegni un albero 2-3-4 che contiene il seguente insieme di chiavi: { 12, 45, 4, 5, 18, 65, 23, 13, 11, 7, 48, 30, 25, 2, 6, 32, 33 } Si trasformi poi l albero in un albero R/B. L insieme ordinato è: { 2, 4, 5, 6, 7, 11, 12, 13, 18, 23, 25, 30, 32, 33, 45, 48, 65 } 18 ( 5, 11 ) ( 30, 45 ) / \ / \ ( 2, 4 ) ( 6, 7 ) ( 12, 13) ( 23, 25 ) ( 32, 33 ) ( 48, 65)

Esercizio 7 Diciamo che un albero binario è fortemente sbilanciato a destra se l altezza del suo sottoalbero destro è almeno il doppio di quella del suo sottoalbero sinistro. Si sviluppi un algoritmo ricorsivo che data la radice x di un albero binario T stampa tutte le radici dei sottoalberi di T che sono fortemente sbilanciati a destra. Un algoritmo efficiente restituirà anche l altezza del sottoalbero considerato sbilanciato(x) if (x = NIL) then return -1 h1 <- sbilanciato(left[x]) h2 <- sbilanciato(right[x]) if (h2 >= 2*h1) then write(x) return max(h1,h2)+1 Esercizio 8 Si consideri la struttura dati max-heap e si sviluppi un algoritmo efficiente (scrivere lo pseudo codice) che dato un max-heap memorizzato in un array A ed un indice i, 1 i heap size[a], incrementa A[i] di una quantità positiva k e restituisce un nuovo max-heap, ancora memorizzato in A. Discutere la complessità dell algoritmo proposto. Si tratta di realizzare l operazione increase key (vedi testo). Esercizio 9 Si consideri il seguente BST e si illustri il comportamento della funzione BST-delete applicata all albero considerato e al nodo con chiave 13. 22 13 30 8 18 25 35 / 5 12 16 20 23 \ 2 17 24 22 16 30 8 18 25 35 / 5 12 17 20 23 2 24 Esercizio 10 Scrivere un algoritmo che dato un albero binario di ricerca T, rappresentato con gli attributi key, left, right, e due chiavi k 1 < k 2 restituisce true se e solo se T contiene almeno una chiave k con k 1 k k 2.

Definiamo l algoritmo verifica(x,k1,k2), dove x è un generico nodo dell albero, che verifica se la condizione è verificata nel sottoalbero radicato in x. Descrivere la complessità dell algoritmo proposto. verifica(x,k1,k2) if (x==nil) then return false if (key[x]=k1) then return true if (key[x]<k1) then return verifica(right[x],k1,k2) if (key[x]>k1 & key[x]<=k2) then return true if (key[x]>k1 & key[x]> k2) then return verifica(left[x],k1,k2) La complessità è lineare nell altezza dell albero. Esercizio 11 Si riporti il codice della versione ricorsiva dell algoritmo quicksort e si descrivano le proprietà che deve godere la procedura di partizione affinchè l algoritmo sia corretto. Vedi testo. Esercizio 12 Sia T un albero generale rappresentato associando ad ogni nodo n i campi key[n], figlio[n] e fratello[n], dove il campo key contiene numeri interi. Scrivere una funzione per contare il numero di nodi con chiave maggiore della chiave del padre. Prima soluzione. La chiamata esterna è Conta(root(T )). Conta(n) 1 k 0 2 if (n NIL) 3 then x figlio[n] 4 while (x NIL) 5 do if (key[x] > key[n]) 6 then k k + 1 7 k k + Conta(x) 8 x fratello[x] 9 return k Seconda soluzione. La chiamata esterna è Conta(root(T ), ). Conta(n, value) 1 if (n = NIL) 2 then return 0 3 else if key[n] > value 4 then return 1 + Conta(figlio[n], key[n]) + Conta(fratello[n], value) 5 else return Conta(figlio[n], key[n]) + Conta(fratello[n], value) Esercizio 13 Sia A[1,..., n], n 1, un array di numeri interi organizzato come un max-heap. Luca sostiene che il seguente ciclo while trasforma l array in un nuovo max-heap. Dovete dimostrare formalmente che Luca ha ragione trovando un opportuno invariante per il ciclo while. 1 i n 2 while (i 1) 3 do A [i] A[i] 1 4 i i 1

L invariante è: k (i < k n) = (A [k] è radice di un max-heap) (A [k] = A[k] 1) L assegnazione A [i] A[i] 1 lo preserva in quanto: (A[i] A[figlio[i]) = (A[i] 1 A[figlio(i)] 1). Esercizio 14 Disegnare un albero R/B che contiene le seguenti chiavi: 18,24,1,7,15,31,27,8,6,5. Aggiungere poi la chiave 10 simulando l operazione di inserimento in un albero binario di ricerca. Dire se l albero ottenuto colorando di rosso il nodo così inserito è ancora un albero R/B. Una possibile soluzione è: 15 B 6 B 24 B 5 B 8 B 18 B 31 B / / / 1 R 7 R 27 R ============================================================================== 15 B 6 B 24 B 5 B 8 B 18 B 31 B / / 1 R 7 R 10 R 27 R Esercizio 15 Quale è la complessità di una operazione di inserimento di una chiave in un B-albero con n chiavi, in funzione di n? Giustificare la risposta. Si consideri il seguente albero 2-3-4 e lo si trasformi in un albero R/B. [ 8, 28 ] / \ [ 3 ] [ 10, 12, 20 ] [ 30, 40 ] / \ / \ [1] [4,6] [9] [11] [15,17,18] [22,25] [28] [31,37,39] [45,50] [8]N [3]N [28]R [1]N [6]N [12]N [30]N

N N [4]R N [10]R [20]R [28]N [40]R N N [9]N [11]N [17]N [22]N N N [37]N [45]N N N N N [15]R [18]R N [25]R [31]R [39]R N [50]R N N N N N N N N N N N N Esercizio 16 Si consideri la struttura dati albero generale i cui nodi hanno gli attributi: key, fratello, figlio e padre e si sviluppi un algoritmo per verificare se è soddisfatta la seguente proprietà speciale: key[padre[x]] > key[x], per ogni nodo x diverso dalla radice test_property(t) x <- root[t] return test(x) test(x) if (padre[x] == NIL) OR (key[padre[x] > key[x]) return (test(figlo[x]) AND test(fratello[x]) else return false Esercizio 17 Si sviluppi un algoritmo per calcolare il grado massimo dei nodi di un albero generale rappresentato tramite gli attributi: fratello, figlio e padre. (Ricordiamo che il grado di un nodo di un albero è pari al numero dei suoi figli.) Esercizio 18 Dire se il seguente albero binario di ricerca può essere colorato in modo da diventare un albero R/B. Giustificare la risposta. (Il simbolo * rappresenta la foglia-nil.) 30 17 35 4 20 * * 1 5 * * * * * 7 * * Disegnare l albero che si ottiene applicando una rotazione destra alla radice dell albero precedente.

Esercizio 19 Scrivere lo pseudocodice per una funzione che, dato un albero binario di ricerca T contenente chiavi distinte, determina se la radice di T contiene l elemento mediano inferiore dell insieme delle chiavi contenute in T. DEF: l elemento mediano inferiore di un insieme di n elementi è l elemento che si trova in posizione (n + 1)/2 nella sequenza ordinata degli elementi dell insieme. Esempio: il mediano inferiore dell insieme {5, 1, 10, 2, 4} è 4 mentre il mediano inferiore dell insieme {9, 1, 5, 7, 8, 2} è 5. Si tratta di verificare se la differenza tra numero di nodi di left[root[t]] e di rigth[root[t]] è compresa tra -1 e 0. Esercizio 20 1. Si elenchino tutte le operazioni definite sulla struttura dati albero binario di ricerca (BST), descrivendone le funzionalità. 2. Siano A un albero binario di ricerca contenente n interi e B un array contenente m interi. (a) Scrivere lo pseudo codice di una procedura efficiente per stampare in ordine non decrescente ( ) gli elementi dell insieme UNIONE degli elementi di A e di B. (b) Indicare la complessità della procedura in funzione di n ed m. 1. Si tratta di realizzare un algoritmo di merge degli elementi delle due strutture. x <- minimum(a); i <- 1; while (x =/= NIL) and (i <= m) do if (key[x] <= B[i] then stampa key[x]; x <- tree-successor(x) else stampa B[i]; i <- i+1 while (x =/= NIL) do stampa key[x]; x <- succ[x] while (i <= m) do stampa B[i]; i <- i+1 2. Si ricorda che la visita di un albero BST tramite la funzione tree-successor richiede un tempo lineare nel numero dei nodi dell albero. Poichè anche l array B viene percorsa linermente, la complessità totale è Θ(n + m). Esercizio 21 Sia T un albero R/B. Per ciascuna delle seguenti affermazioni dire se essa è vera o falsa. Giustificare la risposta. Per ogni nodo x di T, su ogni cammino da x ad una foglia esiste almeno un nodo nero. Per ogni nodo x di T, su ogni cammino da x alla radice esiste almeno un nodo rosso. Per ogni nodo x di T, su ogni cammino da x ad una foglia esiste lo stesso numero di nodi neri. Per ogni nodo x di T, su ogni cammino da x ad una foglia il numero dei nodi neri è almeno il doppio di quelli rossi. Per ogni nodo x di T, su ogni cammino da x ad una foglia il numero dei nodi neri è al più il doppio di quelli rossi.

Per ogni nodo x di T, su ogni cammino da x ad una foglia esiste almeno un nodo nero. VERA, la foglia è sempre nera Per ogni nodo x di T, su ogni cammino da x alla radice esiste almeno un nodo rosso. FALSA, potrebbero essere tutti neri. Per ogni nodo x di T, su ogni cammino da x ad una foglia esiste lo stesso numero di nodi neri. VERA, per la proprietà R/B. Per ogni nodo x di T, su ogni cammino da x ad una foglia il numero dei nodi neri è almeno il doppio di quelli rossi. FALSA, è sufficiente considerare un albero con 4 livelli ed i nodi così colorati: radice/nera; primo livello/rosso, secondo livello/nero, terzo livello/ rosso, quarto livello (foglie)/nero. Su ogni cammino vi sono due rossi e solo 3 neri. Per ogni nodo x di T, su ogni cammino da x ad una foglia il numero dei nodi neri è al più il doppio di quelli rossi. FALSA, si pensi ad un albero con solo nodi neri.