Esercizi di Algoritmi e Strutture Dati Moreno Marzolla http://www.moreno.marzolla.name/ Ultima Modifica: 7 ottobre 202
Copyright Portions of this work are Copyright 202, Moreno Marzolla. This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 9404, USA. Feedback Ringrazio fin d'ora chi vorrà segnalarmi errori all'indirizzo marzolla@cs.unibo.it Data di pubblicazione Bologna, 7 ottobre 202
Indice Prefazione... 4 Notazioni asintotiche... 5 2 Strutture elementari... 8 3 Ordinamento e ricerca...4 4 Hashing... 22 5 Divide et impera... 24 6 Programmazione dinamica...29 7 Grafi... 44
Prefazione Questo documento raccoglie alcuni esercizi proposti durante il corso di Algoritmi e Strutture Dati, corso di laurea in Informatica per il Management, Università di Bologna, a partire dall'anno Accademico 2009/200. Alcuni degli esercizi facevano parte di prove d'esame, altri sono stati svolti a lezione. Alcuni esercizi sono tratti da Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano, Algoritmi e strutture dati 2/ed, McGraw- Hill, 2008, ISBN: 978 88 386 64687, o da corsi di Algoritmi di altri Atenei. Naturalmente tutti gli errori sono da attribuire esclusivamente a me. Questo documento non è da considerare definitivo, in quanto è tutt'ora soggetto a modifiche e integrazioni. Bologna, 7 ottobre 202
Notazioni asintotiche. Esercizio Sia f(n) = n(n+)/2. Utilizzando la definizione di O( ), dimostrare o confutare le seguenti affermazioni:. f(n) = O(n) 2. f(n) = O(n 2 ) Richiamo teorico. Date due funzioni costo f(n) e g(n), diciamo che f(n) = O(g(n)) se esistono costanti c>0 e n 0 0 tali che f(n) cg(n) per ogni n n 0 Soluzione. Proviamo a dimostrare se f(n) = O(n). Per definizione, dobbiamo trovare una costante positiva c>0 tale che per ogni n n 0 si abbia f(n) cn. Proviamo a sviluppare la disuguaglianza: n n cn 2 n 2 c Osserviamo che non esiste nessuna costante c che soddisfi la relazione precedente per ogni n sufficientemente grande, quindi l'affermazione f(n) = O(n) è falsa. Proviamo ora a verificare se f(n) = O(n 2 ). Come prima, cerchiamo una costante c>0 per cui f(n) cn 2 per ogni n n 0. n n cn 2 2 n 2 n 2n c 2 2 2n c Consideriamo l'ultima disuguaglianza. Per ogni n possiamo scrivere: 2 2n 2 2 =c per cui scegliendo c= e n 0 = la relazione è verificata per ogni n n 0. Quindi l'affermazione f(n) = O(n 2 ) è vera..2 Esercizio Scrivere un algoritmo il cui costo computazionale T(n) sia dato dalla seguente relazione di ricorrenza: T O se n 0 n ={ nt n O altrimenti dove n è un parametro intero positivo passato come input all'algoritmo. Non è richiesto il calcolo della
soluzione della ricorrenza, né è richiesto che l'algoritmo produca un risultato di una qualsivoglia utilità pratica. Soluzione. Un possibile algoritmo (totalmente inutile!) è il seguente algoritmo pippo(int n) int if ( n 0 ) then return ; else int a:=0; for i:= to n do a := a + pippo(n-); endfor return a; endif.3 Esercizio Si consideri il seguente algoritmo ricorsivo: algoritmo F(array A[..n] di float, int i, int j) float if ( j<i ) then return 0; elseif ( i==j ) then return A[i]; else int m := (i+j)/2; // arrotondato all'intero inferiore return F(A, i, m) + F(A, m+, j); endif L'algoritmo accetta come parametri un array A[..n] di n numeri reali e due interi i, j; l'algoritmo restituisce un numero reale, e viene inizialmente invocato con F(A,, n).. Scrivere la relazione di ricorrenza che descrive il costo computazionale di F in funzione di n 2. Risolvere la ricorrenza di cui al punto. 3. Cosa calcola F(A,, n)? (spiegare a parole) Soluzione. La funzione F calcola la somma dei valori presenti in A. Il costo computazionale T(n) soddisfa la seguente equazione di ricorrenza: c T n ={ 2T n/2 c 2 se n altrimenti che, in base al Master Theorem (caso ) ha soluzione T(n) = Θ(n).4 Esercizio Determinare in modo esplicito il costo computazionale del seguente algoritmo ricorsivo: algoritmo pippo( int n ) int if ( n ) then return n; else int a := ;
for k:= to n do a := a*2; endfor return a + 2*pippo(n/2); endif Soluzione. Il costo T(n) soddisfa l'equazione di ricorrenza: c T n ={ T n /2 c 2 n se n altrimenti che in base al caso 3) del Master Theorem ha come soluzione T(n) = Θ(n)