Sei sulla pagina 1di 38

Camil Demetrescu, Irene Finocchi, Giuseppe F.

Italiano Algoritmi e strutture dati


Copyright 2004 - The McGraw - Hill Companies, srl
1
Universit degli Studi dellAquila
Anno Accademico 2011/2012
Corso Integrato di Algoritmi e Strutture Dati con
Laboratorio
Modulo da 6 CFU di Algoritmi e Strutture Dati (Prof.
Guido Proietti)
Modulo da 6 CFU di Laboratorio di ASD (Dott.ssa
Giovanna Melideo)
Orario: Luned: 14.30 16.30 (Aula 1.7)
Mercoled: 14.30 16.30 (Aula 1.7)
Ricevimento: Mercoled 16.30-17.30


Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
2
Programma settimanale
1. Introduzione: problemi, algoritmi, complessit computazionale .
2. Notazione asintotica, problema della ricerca.
3. Ordinamento: Insertion sort, Selection sort.
4. Ordinamento efficiente: Merge sort, Quicksort, algoritmi di ordinamento
lineari.
5. Code di priorit: heap binario, Heapsort, heap binomiale.
6. Alberi di ricerca: problema del dizionario.
7. Alberi di ricerca: alberi AVL.
8. Prova intermedia (settimana 21-25 novembre 2011)
9. Tabelle hash; tecniche algoritmiche.
10. Grafi: visite.
11. Cammini minimi: Ordinamento topologico, Bellman&Ford.
12. Cammini minimi: Dijkstra, Floyd&Warshall.
13. Insiemi disgiunti
14. Minimo albero ricoprente: Kruskal, Prim, Boruvka.
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
3
Libro di testo
C. Demetrescu, I. Finocchi, G. Italiano
Algoritmi e Strutture dati
McGraw-Hill
Slide e materiale didattico
http://www.di.univaq.it/~proietti/didattica.html

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
4
Altri testi utili
T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein
Introduzione agli algoritmi e strutture dati
McGraw-Hill
P. Crescenzi, G. Gambosi, R. Grossi
Strutture di dati e algoritmi
Addison-Wesley
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
5
Modalit desame
Lesame consiste in una prova scritta e una prova
orale: gli scritti/orali di teoria e laboratorio possono
essere svolti disgiuntamente purch allinterno della
stessa sessione
Prove parziali (riservate agli studenti del secondo
anno): il superamento delle prove parziali d diritto a
svolgere lorale solo sulla seconda parte del
programma
Sei appelli (+1 a Novembre per i fuori corso)
2 appelli a gennaio/febbraio
2 appelli a giugno/luglio
2 appelli a settembre
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
6
Obiettivi del corso
Fornire le competenze necessarie per:
analizzare le principali tecniche di progettazione e
analisi degli algoritmi
identificare le scelte algoritmiche fondamentali e
saperle valutare in termini di complessit
computazionale
scegliere e realizzare strutture dati adeguate al
problema che si vuole risolvere
sviluppare unintuizione finalizzata alla soluzione di
problemi computazionali
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
7
Prerequisiti del corso
Cosa necessario sapere
strutture dati elementari
concetto di ricorsione
dimostrazione per induzione e calcolo
infinitesimale
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Capitolo 1
Unintroduzione informale
agli algoritmi
Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
9
Etimologia
Il termine Algoritmo deriva da Algorismus,
traslitterazione latina del nome di un
matematico persiano del IX secolo,
Muhammad al-Khwarizmi, che ne descrisse
il concetto applicato alle procedure per
eseguire alcuni calcoli matematici
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
10
Procedimento effettivo che consente di risolvere un problema
(ovvero di ottenere una risposta ad un determinato quesito)
eseguendo, in un determinato ordine, un insieme finito di passi
semplici (azioni), scelti tra un insieme (solitamente) finito di
possibili azioni.
Definizione (necessariamente
informale) di algoritmo
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
11
Le quattro propriet
fondamentali di un algoritmo

La sequenza di istruzioni deve essere finita
Essa deve portare ad un risultato
Le istruzioni devono essere eseguibili
materialmente
Le istruzioni non devono essere ambigue

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
12
Algoritmi e strutture dati
Concetto di algoritmo inscindibile da quello
di dato
Da un punto di vista computazionale, un
algoritmo una procedura che prende dei dati
in input e, dopo averli elaborati, restituisce dei
dati in output
I dati devo essere organizzati e strutturati in
modo tale che la procedura che li elabora sia
efficiente
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
13
Un algoritmo lessenza computazionale di un
programma, nel senso che fornisce il procedimento per
giungere alla soluzione di un dato problema di calcolo

Algoritmo Programma
Un algoritmo una procedura risolutiva depurata da dettagli
riguardanti il linguaggio di programmazione, ambiente di sviluppo,
sistema operativo
Un programma la codifica (in un linguaggio di programmazione) di
un algoritmo


Algoritmi e programmi
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
14
Problema: ricerca del massimo fra n numeri
Input: una sequenza di n numeri A=<a
1
,a
2
,,a
n
>
Output: un numero a
i
tale che a
i
> a
j
j=1,,n
Algoritmo (ad altissimo livello): Inizializza il valore del
massimo al valore del primo elemento. Poi, guarda uno
dopo laltro tutti gli elementi, e ad ogni passo confronta
lelemento in esame con il massimo corrente, e se
maggiore, aggiorna il massimo corrente
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
15
int InC(int a[], int n){
int i, max;
max = a[0];
for (i = 1; i < n; i++)
if (a[i] > max) {
max = a[i];
}
return max;
}
public static int InJava (int[] a){
int max=a[0];
for (int i = 1; i < a.length; i++)
if (a[i] > max) max = a[i];
return max;
function InPascal(var A: array[1Nmax] of integer): integer;
var k, max: integer;
begin
max:=A[1];
for k:= 2 to n do
begin
if A[k]>max then max:=A[k];
end;
InPascal:=max;
end;
Alcune codifiche classiche
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
16
Il nostro pseudo-codice
Input: Sequenza di n numeri: <a
1
,a
2
,, a
n
>
Output: valore massimo della sequenza

Massimo (A)
max= a
1

for j=2 to n do
if (a
j
> max) then max=a
j
return max
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
17
Correttezza ed efficienza
Vogliamo progettare algoritmi che:
Producano correttamente il risultato
desiderato
Siano efficienti in termini di tempo di
esecuzione ed occupazione di memoria
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
18
Analisi di algoritmi
Correttezza:
dimostrare formalmente che un algoritmo
corretto
Complessit:
Stimare la quantit di risorse (tempo e
memoria) necessarie allalgoritmo
stimare il pi grande input gestibile in tempi
ragionevoli
confrontare due algoritmi diversi
ottimizzare le parti critiche

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
19
Un esempio giocattolo:
i numeri di Fibonacci
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
20
Leonardo da Pisa (anche noto come Fibonacci)
si interess di molte cose, tra cui il seguente
problema di dinamica delle popolazioni:
Lisola dei conigli
Quanto velocemente si espanderebbe una popolazione
di conigli sotto appropriate condizioni?
In particolare, partendo da una coppia di conigli in unisola
deserta, e data una certa regola di riproduzione, quante
coppie si avrebbero nellanno n?
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
21
Una coppia di conigli concepisce due coniglietti
di sesso diverso ogni anno, i quali formeranno
una nuova coppia
La gestazione dura un anno

I conigli cominciano a riprodursi soltanto al
secondo anno dopo la loro nascita

I conigli sono immortali
Le regole di riproduzione
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
22
Lalbero dei conigli
La riproduzione dei conigli pu essere descritta in un
albero come segue:
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
23
Allinizio dellanno n, ci sono tutte le coppie
dellanno precedente, e una nuova coppia di
conigli per ogni coppia presente due anni prima
La regola di espansione
Indicando con F
n
il numero di coppie allinizio
dellanno n, abbiamo la seguente relazione di
ricorrenza:
1 se n=1,2

F
n-1
+ F
n-2
se n3
F
n
=
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
24
Il problema
Come calcoliamo F
n

?
Primi numeri della sequenza di Fibonacci:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,
610, 987, 1597, F
18
=2584,
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
25
Digressione: la sezione aurea
Rapporto | fra due grandezze disuguali a>b, in
cui a medio proporzionale tra b e a+b
(a+b) : a = a : b
a
b
e ponendo a=b|
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
26
Keplero osserv che


da cui si pu dimostrare che la soluzione in forma
chiusa della sequenza di Fibonacci (formula di
Binet):
Un approccio numerico
| =
+

n
n
n
F
F 1
lim
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
27
Algoritmo fibonacci1
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
28
Molto efficiente: una sola linea di codice (sebbene stiamo
trascurando la complessit delloperazione in essa contenuta)!
Ma siamo sicuri che sia corretto? Con quale accuratezza devo
fissare u e u per ottenere un risultato corretto?
Ad esempio, con 3 cifre decimali:
Correttezza ed efficienza

n
fibonacci1(n)
arrotondamento F
n

3 1.99992 2 2
16 986.698 987 987
18 2583.1 2583 2584
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
29
Algoritmo fibonacci2
algoritmo fibonacci2(intero n) intero
if (n 2) then return 1
else return fibonacci2(n-1) +
fibonacci2(n-2)
Poich fibonacci1 non corretto, un
approccio alternativo consiste nellutilizzare
direttamente la definizione ricorsiva:
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
30
Per valutare il tempo di esecuzione, calcoliamo
il numero di linee di codice T(n) mandate in
esecuzione
Se n2: una sola linea di codice
Se n=3: quattro linee di codice, due per la
chiamata fibonacci2(3), una per la chiamata
fibonacci2(2) e una per la chiamata
fibonacci2(1), cio
T(3)=2+T(2)+T(1)=2+1+1=4

Correttezza? Corretto per definizione!
Efficienza?
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
31
Relazione di ricorrenza
Per n 3, in ogni chiamata si eseguono due linee di
codice, oltre a quelle eseguite nelle chiamate
ricorsive
T(n) = 2 + T(n-1) + T(n-2) n 3
In generale, il tempo di esecuzione di un algoritmo
ricorsivo pari al tempo speso allinterno della
chiamata pi il tempo speso nelle chiamate ricorsive
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
32
Albero della ricorsione di fibonacci2
Utile per risolvere la relazione di ricorrenza T(n)
Ogni nodo corrisponde ad una chiamata ricorsiva
I figli di un nodo corrispondono alle sottochiamate
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
33
Etichettando i nodi dellalbero con il numero di
linee di codice eseguite nella chiamata
corrispondente:
I nodi interni hanno etichetta 2
Le foglie hanno etichetta 1
Calcolare T(n)
Per calcolare T(n):
Contiamo il numero di foglie
Contiamo il numero di nodi interni
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
34
Calcolare T(n)
In totale le linee di codice eseguite sono
F
n
+ 2 (F
n
-1) = 3F
n
-2
Lemma 1:
Il numero di foglie dellalbero della ricorsione di
fibonacci2(n) pari a F
n
dim
(da fare a casa, per induzione su n)

Lemma 2:
Il numero di nodi interni di un albero in cui ogni nodo interno
ha esattamente due figli pari al numero di foglie -1

dim
(da fare a casa, per induzione sul numero di nodi interni
dellalbero)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
35
fibonacci2 un algoritmo lento:

T(n) F
n
u
n

Osservazioni
n = 8
linee di codice eseguite
T(n)=3 F
8
2= 3 21 2 = 61
n = 45
T(n) =3F
45
2 = 31.134903.170 2 = 3.404.709.508
n = 100 con le attuali tecnologie, calcolare F
100
richiederebbe
circa 8000 anni!
Possiamo fare di meglio?
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
36
Perch lalgoritmo fibonacci2 lento? Perch
continua a ricalcolare ripetutamente la soluzione dello
stesso sottoproblema. Perch non memorizzare allora
in un array le soluzioni dei sottoproblemi?
Algoritmo fibonacci3
algoritmo fibonacci3(intero n) intero
sia Fib un array di n interi
Fib[1] Fib[2] 1
for i = 3 to n do
Fib[i] Fib[i-1] + Fib[i-2]
return Fib[n]
Correttezza? Corretto per definizione!
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
37
Linee 1, 2, e 5 eseguite una sola volta
Linea 3 eseguita n 1 volte (una sola volta per n=1,2)
Linea 4 eseguita n 2 volte (non eseguita per n=1,2)
T(n): numero di linee di codice mandate in
esecuzione da fibonacci3
Calcolo del tempo di esecuzione
T(n) = n 1 + n 2 + 3 = 2n n > 1
T(1) = 4
T(45) = 90
Per n=45, circa 38 milioni di volte pi veloce
dellalgoritmo fibonacci2!
T(100) = 200
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati
Copyright 2004 - The McGraw - Hill Companies, srl
38
Lalgoritmo fibonacci3 impiega tempo
proporzionale a n invece di esponenziale in n
come fibonacci2
Tempo effettivo richiesto da implementazioni in
C dei due algoritmi su piattaforme diverse:
Calcolo del tempo di esecuzione