Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Università degli Studi dell’Aquila Anno Accademico 2009/2010 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 (Prof.ssa Giovanna Melideo) Orario: Lunedì: – – Aula 2.4 Mercoledì: 9.45 – – Aula 2.4 Mercoledì: – Aula 2.4 Venerdì: – Aula 2.4 Ricevimento: Mercoledì
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 2 Programma settimanale 1.Introduzione: problemi, algoritmi, complessità computazionale, 2.Notazione asintotica, problema della ricerca 3.Ordinamento: Insertion, Selection 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 9.Tabelle hash; tecniche algoritmiche. 10.Grafi: visite. Cammini minimi: Bellman&Ford, 11.Cammini minimi: Dijkstra, Floyd&Warshall 12.Insiemi disgiunti 13.Minimo albero ricoprente: Kruskal, Prim, Boruvka
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 5 Modalità d’esame L’esame consiste in una prova scritta e una prova orale Prova parziale: ?? Dicembre (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
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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 un’intuizione finalizzata alla soluzione di problemi computazionali
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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. ItalianoAlgoritmi e strutture dati Capitolo 1 Un’introduzione informale agli algoritmi Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 10 Procedimento che consente di ottenere un risultato atteso (ovvero di risolvere un problema) eseguendo, in un determinato ordine, un insieme finito di passi semplici (azioni), scelti tra un insieme finito di possibili azioni. Definizione di algoritmo
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 12 Algoritmi e strutture dati Concetto di algoritmo è inscindibile da quello di dato Da un punto di vista funzionale, 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. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 13 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 Algoritmi e programmi
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 14 Problema: ricerca del massimo fra n numeri Input: una sequenza di n numeri A= 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 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
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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[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; Alcune codifiche classiche…
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 16 Il nostro pseudo-codice Input: Sequenza di n numeri: 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. ItalianoAlgoritmi e strutture dati Copyright © 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. ItalianoAlgoritmi e strutture dati Copyright © 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 all’algoritmo –stimare il più grande input gestibile in tempi ragionevoli –confrontare due algoritmi diversi –ottimizzare le parti “critiche”
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 19 Un esempio giocattolo: i numeri di Fibonacci
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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: L’isola dei conigli 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?
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 21 Una coppia di conigli genera due coniglietti di sesso diverso ogni 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. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 22 L’albero dei conigli La riproduzione dei conigli può essere descritta in un albero come segue:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 23 Nell’anno n, ci sono tutte le coppie dell’anno 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 dell’anno n, abbiamo la seguente relazione di ricorrenza: 1 se n=1,2 F n-1 + F n-2 se n≥3 F n =
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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, 2584, 4181, F 20 =6765,…
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 26 Keplero osservò che da cui si può dimostrare che (formula di Binet): Un approccio numerico
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 27 Algoritmo fibonacci1
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 28 Qual è l’accuratezza su e per ottenere un risultato corretto? Ad esempio, con 3 cifre decimali: Correttezza? ˆ n fibonacci1 (n) arrotondamentoFnFn
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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 nell’utilizzare direttamente la definizione ricorsiva:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 30 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) Correttezza? Corretto per definizione ! Efficienza?
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 31 Relazione di ricorrenza 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
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 32 Albero della ricorsione Utile per risolvere la relazione di ricorrenza Nodi corrispondenti alle chiamate ricorsive Figli di un nodo corrispondenti alle sottochiamate
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 33 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 Calcolare T(n) Per calcolare T(n): –Contiamo il numero di foglie –Contiamo il numero di nodi interni
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 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 Il numero di foglie dell’albero della ricorsione di fibonacci2(n) è pari a F n dim (per induzione su n) Lemma Il numero di nodi interni di un albero in cui ogni nodo ha due figli è pari al numero di foglie -1 dim (per induzione sul numero di nodi dell’albero n)
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 35 fibonacci2 è un algoritmo lento: T(n) ≈ F(n) ≈ n Osservazioni n = 8 linee di codice eseguite 3 · F 8 – 2= 3 · 21 – 2 = 61 n = 45 3 · F 45 – 2 = 3 · = n = 100… con le attuali tecnologie, calcolare F(100) richiederebbe circa 8000 anni!) Possiamo fare di meglio?
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 36 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 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]
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 37 Linee 1, 2, e 5 eseguite una sola volta Linea 3 eseguita n – 1 volte (eccetto per n=1) Linea 4 eseguita n – 2 volte (eccetto per n=1) T(n): numero di linee di codice mandate in esecuzione da fibonacci3 Calcolo del tempo di esecuzione T(n) = n – 1 + n – = 2n n > 1 T(1) = 4 T(45) = 90 Circa 38 milioni di volte più veloce dell’algoritmo fibonacci2! T(100) = 200
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 38 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: Calcolo del tempo di esecuzione