Algoritmi e Strutture Dati - Università degli Studi dell`Aquila

Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Università degli Studi dell’Aquila
Anno Accademico 2010/2011
• 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 – secondo semestre)
• Orario: Lunedì:
14.15 – 16.00 (Aula 1.7)
Mercoledì: 14.15 – 16.00 (Aula 1.7)
• Ricevimento: Mercoledì 16.00-17.00
1
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Programma settimanale
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
2
Introduzione: problemi, algoritmi, complessità computazionale,
Notazione asintotica, problema della ricerca
Ordinamento: Insertion, Selection
Ordinamento efficiente: Merge sort, Quicksort, algoritmi di ordinamento
lineari.
Code di priorità: heap binario, Heapsort, heap binomiale.
Alberi di ricerca: problema del dizionario.
Prova intermedia
Alberi di ricerca: alberi AVL.
Tabelle hash; tecniche algoritmiche.
Grafi: visite. Cammini minimi: Bellman&Ford,
Cammini minimi: Dijkstra, Floyd&Warshall
Insiemi disgiunti
Minimo albero ricoprente: Kruskal, Prim, Boruvka
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
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
3
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
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
4
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Modalità d’esame
• L’esame consiste in una prova scritta e una
prova orale
• Prova parziale: ?? Novembre (riservata agli
studenti del secondo anno)
• Sei appelli (+1 a Novembre per i fuori corso)
– 2 appelli a gennaio/febbraio
– 2 appelli a giugno/luglio
– 2 appelli a settembre
5
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
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 un’intuizione finalizzata alla soluzione di
problemi computazionali
6
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Prerequisiti del corso
Cosa è necessario sapere…
– strutture dati elementari
– concetto di ricorsione
– dimostrazione per induzione e calcolo
infinitesimale
7
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Algoritmi e Strutture Dati
Capitolo 1
Un’introduzione informale
agli algoritmi
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
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
9
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Definizione (necessariamente
informale) di algoritmo
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.
10
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
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
11
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
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”
12
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Algoritmi e programmi
• Un algoritmo è l’essenza computazionale di un
programma, nel senso che fornisce il procedimento per
giungere alla soluzione di un dato problema di calcolo
• Algoritmo ≠ Programma
– programma è la codifica (in un linguaggio di programmazione) di un
algoritmo
– un algoritmo è un programma depurato da dettagli riguardanti il
linguaggio di programmazione, ambiente di sviluppo, sistema
operativo
13
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Problema: ricerca del massimo fra n numeri
• Input: una sequenza di n numeri A=<a1,a2,…,an>
• Output: un numero ai tale che ai  aj j=1,…,n
Algoritmo (ad altissimo livello): Inizializza il valore del
massimo al valore del primo elemento. Poi, guarda uno
dopo l’altro tutti gli elementi, e ad ogni passo confronta
l’elemento in esame con il massimo corrente, e se
maggiore, aggiorna il massimo corrente
14
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Alcune codifiche classiche…
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[1…Nmax] 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;
15
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Il nostro pseudo-codice
Input: Sequenza di n numeri: <a1,a2,…, an>
Output: valore massimo della sequenza
Massimo (A)
max= a1
for j=2 to n do
if (aj  max) then max=aj
return max
16
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Correttezza ed efficienza
Vogliamo progettare algoritmi che:
– Producano correttamente il risultato
desiderato
– Siano efficienti in termini di tempo di
esecuzione ed occupazione di memoria
17
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Analisi di algoritmi
Correttezza:
– dimostrare formalmente che un algoritmo è
corretto
Complessità:
– Stimare la quantità di risorse (tempo e
memoria) necessarie all’algoritmo
– stimare il più grande input gestibile in tempi
ragionevoli
– confrontare due algoritmi diversi
– ottimizzare le parti “critiche”
18
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Un esempio giocattolo:
i numeri di Fibonacci
19
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
L’isola dei conigli
Leonardo da Pisa (anche noto come Fibonacci)
si interessò di molte cose, tra cui il seguente
problema di dinamica delle popolazioni:
Quanto velocemente si espanderebbe una popolazione
di conigli sotto appropriate condizioni?
In particolare, partendo da una coppia di conigli
in un’isola deserta, quante coppie si avrebbero
nell’anno n?
20
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Le regole di riproduzione
• 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
21
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
L’albero dei conigli
La riproduzione dei conigli può essere descritta in un
albero come segue:
22
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
La regola di espansione
• Nell’anno n, ci sono tutte le coppie dell’anno
precedente, e una nuova coppia di conigli per
ogni coppia presente due anni prima
• Indicando con Fn il numero di coppie dell’anno n,
abbiamo la seguente relazione di ricorrenza:
Fn =
23
1
se n=1,2
Fn-1 + Fn-2 se n≥3
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Il problema
Primi numeri della sequenza di Fibonacci:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,
610, 987, 1597, 2584, 4181, F20=6765,…
Come calcoliamo Fn ?
24
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
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
b
a
e ponendo a=b
25
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Un approccio numerico
• Keplero osservò che
Fn  1

lim
Fn
n
da cui si può dimostrare che la soluzione in forma
chiusa della sequenza di Fibonacci è (formula di
Binet):
26
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Algoritmo fibonacci1
27
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Correttezza ed efficienza
• Molto efficiente: una sola linea di codice (sebbene stiamo
trascurando la complessità dell’operazione in essa contenuta)!
• Ma siamo sicuri che sia corretto? Con quale accuratezza devo
ˆ per ottenere un risultato corretto?
fissare  e 
• Ad esempio, con 3 cifre decimali:
28
n
fibonacci1(n)
arrotondamento
Fn
3
16
18
1.99992
986.698
2583.1
2
987
2583
2
987
2584
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Algoritmo fibonacci2
Poiché fibonacci1 non è corretto, un
approccio alternativo consiste nell’utilizzare
direttamente la definizione ricorsiva:
algoritmo fibonacci2(intero n)  intero
if (n≤2) then return 1
else return fibonacci2(n-1) +
fibonacci2(n-2)
29
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Correttezza? Corretto per definizione!
Efficienza?
• Calcoliamo il numero di linee di codice T(n)
mandate in esecuzione
• Se n≤2: 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)
30
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
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 richiesto da un algoritmo
ricorsivo è pari al tempo speso all’interno della
chiamata più il tempo speso nelle chiamate ricorsive
31
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Albero della ricorsione di fibonacci2
• Utile per risolvere la relazione di ricorrenza T(n)
• Ogni nodo corrisponde ad una chiamata ricorsiva
• Figli di un nodo corrispondenti alle sottochiamate
32
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Calcolare T(n)
• Etichettando i nodi dell’albero con il numero di
linee di codice eseguite nella chiamata
corrispondente:
– I nodi interni hanno etichetta 2
– Le foglie hanno etichetta 1
• Per calcolare T(n):
– Contiamo il numero di foglie
– Contiamo il numero di nodi interni
33
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Calcolare T(n)
Lemma
Il numero di foglie dell’albero della ricorsione di
fibonacci2(n) è pari a Fn
dim
(da fare a casa, per induzione su n)
Lemma
Il numero di nodi interni di un albero in cui ogni nodo
(interno) ha due figli è pari al numero di foglie -1
dim
(da fare a casa, per induzione sul numero di nodi interni
dell’albero)
• In totale le linee di codice eseguite sono
Fn + 2 (Fn-1) = 3Fn-2
34
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Osservazioni
fibonacci2 è un algoritmo lento:
T(n) ≈ Fn ≈ n
linee di codice eseguite
n = 8 T(n)=3 · F8 – 2= 3 · 21 – 2 = 61
n = 45 T(n) =3 · F45 – 2 = 3 · 1.134903.170 = 3.404.709.508
n = 100… con le attuali tecnologie, calcolare F100 richiederebbe
circa 8000 anni!
Possiamo fare di meglio?
35
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Algoritmo fibonacci3
• Perché l’algoritmo 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(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]
36
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Calcolo del tempo di esecuzione
•
•
•
•
Linee 1, 2, e 5 eseguite una sola volta
Linea 3 eseguita n – 1 volte (eccetto per n=1,2)
Linea 4 eseguita n – 2 volte (eccetto per n=1,2)
T(n): numero di linee di codice mandate in
esecuzione da fibonacci3
T(n) = n – 1 + n – 2 + 3 = 2n
T(1) = 4
T(45) = 90
n>1
Per n=45, circa 38 milioni di volte più veloce
dell’algoritmo fibonacci2!
T(100) = 200
37
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Calcolo del tempo di esecuzione
• L’algoritmo 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:
38
Copyright © 2004 - The McGraw - Hill Companies, srl