DIPARTIMENTO DI MATEMATICA E INFORMATICA Corso di laurea in Informatica Anno accademico 2016/2017-2 anno E 9 CFU - 1 semestre Docenti titolari dell'insegnamento DOMENICO CANTONE - Modulo - INF/01-6 CFU Email: cantone@dmi.unict.it Edificio / Indirizzo: Dipartimento di Matematica e Informatica, Viale Andrea Doria 6, 95125 Catania Telefono: 095-7383052 Orario ricevimento: http://www.dmi.unict.it/~cantone/orarioricevimento.html SIMONE FARO - Modulo - INF/01-3 CFU Email: faro@dmi.unict.it Edificio / Indirizzo: Dipartimento di Matematica e Informatica, Viale A.Doria n.6 Telefono: 095 7383053 Orario ricevimento: Disponibile all'indirizzo http://www.dmi.unict.it/~faro/calendar.php OBIETTIVI FORMATIVI Conoscenza e capacità di comprensione (knowledge and understanding): saranno acquisite le conoscenze relative alle principali metodologie per la progettazione di algoritmi (incrementale, ricorsiva, programmazione dinamica, algoritmi golosi) nonché le tecniche per la loro analisi di complessità, sia nel caso pessimo che in quello medio. Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): saranno acquisite le capacità di risolvere semplici problemi che richiedono la progettazione e l'analisi di soluzioni algoritmiche. Autonomia di giudizio (making judgements): lo studente sarà in grado di valutare la qualità di una soluzione algoritmica in termini di efficienza e possibilità di riutilizzo. Abilità comunicative (communication skills): saranno acquisite le necessarie abilità comunicative ed un'adeguata appropriatezza espressiva nella comunicazione di problematiche inerenti gli studi algoritmici, anche ad interlocutori non esperti. Capacità di apprendimento (learning skills): lo studente avrà la capacita di adattare le conoscenze acquisite anche a nuovi contesti, nonché di aggiornarsi attraverso la consultazione delle fonti specialistiche del settore algoritmico. Conoscenza e capacità di comprensione (knowledge and understanding): saranno acquisite le conoscenze relative alle al funzionamento e all'implementazione delle principali stutture dati analizzate durante il modulo teorico di Algoritmi Capacità di applicare conoscenza e comprensione (applying knowledge and understanding):
saranno acquisite le capacità di implementazione e di progettazione di soluzioni algoritmiche. Autonomia di giudizio (making judgements): Lo studente sarà in grado di giudicare l'efficacia della propria implementazione e del proprio lavoro progettuale. Capacità di apprendimento (learning skills): lo studente sarà in grado di adattare le soluzioni analizzate durante le lezioni anche ad altri contesti. PREREQUISITI RICHIESTI Strutture dati elementari e loro manipolazioni (liste, code, pile, alberi). Elementi di matematica discreta, di programmazione I e II, e di analisi matematica Lo studente dovrà conoscere i proncipali paradigmi di programmazione e le principali strutture dati. La conoscenza del linguaggio di programmazione ad oggetti C++ è un prerequisito fondamentale. FREQUENZA LEZIONI Per una piena comprensione degli argomenti del corso e delle tecniche illustrate, la frequenza delle lezioni è fortemente consigliata. La frequenza delle lezioni è fortemente consigliata. CONTENUTI DEL CORSO Descrizione generale del corso Il corso presenta le principali metodologie di progettazione di algoritmi (incrementale, ricorsiva, programmazione dinamica, algoritmi golosi) e le tecniche per l'analisi di complessità, sia nel caso pessimo che nel caso medio. PROGRAMMA PARTICOLAREGGIATO DEL CORSO Introduzione Problemi computazionali e algoritmi: il problema dell'ordinamento Algoritmi come tecnologia Metodologia incrementale: algoritmo Insertion-Sort (correttezza e complessità) Metodologia divide-et-impera: algoritmo Merge-Sort (complessità) Notazioni asintotiche e relazioni tra esse
Notazioni standard e funzioni comuni Ricorrenze Il metodo di sostituzione Il metodo iterativo e dell'albero di ricorsione Il teorema master Ordinamento e statistiche d'ordine Heap e procedura per la sua costruzione L'algoritmo Heapsort Code di priorità L'algoritmo Quicksort e sua versione randomizzata Analisi di Quicksort nel caso peggiore e nel caso medio Limiti inferiori per l'ordinamento Ordinamento in tempo lineare: algoritmi Counting-Sort, Radix-Sort, Bucket-Sort Mediane e statistiche d'ordine Hashing Tabelle hash Funzioni hash (metodo della divisione, metodo della moltiplicazione, hashing universale) Indirizzamento aperto Alberi rosso-neri Rotazioni, inserimenti, cancellazioni Analisi di complessità Elementi della programmazione dinamica Sottostruttura ottima, ripetizione dei sottoproblemi, ricostruzione di una soluzione ottima Alcuni casi di studio: programmazione delle catene di montaggio, moltiplicazione di una sequenza di matrici, la più lunga sottosequenza comune, distanza di editing Elementi della strategia golosa Proprietà della scelta golosa, sottostruttura ottima Alcuni casi di studio: problema della selezione di attività, costruzione di un codice di Huffman Algoritmi elementari per grafi Visita in ampiezza Visita in profondità (classificazione degli archi) Ordinamento topologico Componenti fortemente connesse Il modulo di Laboratorio di Algoritmi ha lo scopo di fornire gli strumenti per l'implementazione degli algoritmi e delle strutture dati trattate nel corso di Algoritmi, attraverso l'utilizzo della programmazione ad oggetti. Il linguaggio C++ verrà usato come strumento principale per presentare le implementazioni delle strutture dati e degli algoritmi.
TESTI DI RIFERIMENTO Il libro di testo consigliato è: T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein. Introduction to algorithms (Third Edition), The MIT Press, Cambridge - Massachusetts, 2009 disponibile anche nella traduzione italiana 1) T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein. Introduzione agli algoritmi e strutture dati 3/ed, McGraw-Hill Italia, 2010. I testi di riferimento sono gli stessi specificati per iul modulo teorico di Algoritmi PROGRAMMAZIONE DEL CORSO * Argomenti Riferimenti testi 1 Introduzione. Algoritmi come tecnologia. Cap.1.1-1.2 di 1) 2 * Algoritmo Insertion-Sort Cap. 2.1 di 1) e materiale didattico integrativo 3 * Divide-et-impera Cap. 4.1 di 1) e materiale didattico integrativo 4 * Ricorrenze Cap. 4.3-4.5 di 1) e materiale didattico integrativo 5 * Heapsort Cap. 6 di 1) e materiale didattico integrativo 6 Quicksort Cap. 7 di 1) 7 * Ordinamento in tempo lineare Cap. 8 di 1) e materiale didattico integrativo 8 * Hashing Cap. 11.1-11.4 di 1) e materiale didattico integrativo 9 * Alberi rosso-neri Cap. 13 di 1) e materiale didattico integrativo 10 * Elementi della programmazione dinamica Cap. 15 di 1) e materiale didattico integrativo 11 * Elementi della strategia golosa Cap. 16.1-16.3 di 1) e materiale didattico integrativo 12 * Algoritmi elementari per grafi Cap. 22 di 1) e materiale didattico integrativo
* Argomenti Riferimenti testi 1 Heap ed HeapSort 2 Ordinamento in tempo lineare 3 Indicizzazione e Hashing 4 Programmazione dinamica 5 Programmazione greedy 6 Algoritmi di gestione e visita di un grafo * Conoscenze minime irrinunciabili per il superamento dell'esame. N.B. La conoscenza degli argomenti contrassegnati con l'asterisco è condizione necessaria ma non sufficiente per il superamento dell'esame. Rispondere in maniera sufficiente o anche più che sufficiente alle domande su tali argomenti non assicura, pertanto, il superamento dell'esame. MATERIALE DIDATTICO I lucidi delle lezioni e delle esercitazioni sono messi a disposizione degli studenti sul sito http://www.dmi.unict.it/~cantone/homealgoritmi-17/italgoritmi.html Il codice degli esempi e degli esercizi svolti a lezione sarà reso disponibile per gli studenti sul sito del docente, ed in particolare alla pagina web http://www.dmi.unict.it/~faro/laboratorio_algoritmi.php VERIFICA DELL'APPRENDIMENTO MODALITÀ DI VERIFICA DELL'APPRENDIMENTO L esame finale è essenzialmente scritto. La verbalizzazione sarà preceduta da una breve discussione sul compito scritto e, nei casi dubbi, da una breve verifica orale. L'esame si svolgerà in due prove. La prima prova, della durata di 45 minuti, consiste in un test a risposta multipla, che viene sostenuto attraverso il sistema di esercitazione e secondo le modalità specificate all'interno dello stesso. Gli studenti che avranno ottenuto una valutazione superiore o uguale a 18 nella prima prova potranno accedere all seconda prova, della durata di circa 90 minuti. Tale prova di laboratorio consisterà nell'implementazione, in C++, di una o più tre le strutture dati studiate a lezione. La seconda prova verrà svolta attraverso l'utilizzo di un editor di testo e di un compilatore.
DATE DEGLI APPELLI I SESSIONE 06/02/2017 23/02/2017 II SESSIONE 14/06/2017 07/07/2017 III SESSIONE 19/09/2017 6/10/2017 SESSIONE STRAORDINARIA 08/05/2017 7/12/2017 Tutti gli esami avranno inizio alle ore 9:00. L'esame del modulo di laboratorio si svolgerà di norma nel pomeriggio del medesimo giorno in cui si sosterrà l'esame di Algoritmi. PROVE IN ITINERE L esame finale del modulo di Algoritmi può essere completato mediante due prove in itinere. La prima prova in itinere verterà sulla prima parte del corso e sarà offerta durante la seconda parte del periodo didattico in data concordata con gli studenti. La seconda prova in itinere verterà sulla seconda parte del corso e sarà offerta in occasione del primo appello di esami. Le prove in itinere consistono in domande aperte che possono riguardare sia argomenti di natura teorica che soluzioni di problemi analoghi a quelli trattati nel corso. PROVE DI FINE CORSO La prova scritta finale del modulo di Algoritmi è costituita, di norma, da quattro domande aperte che possono riguardare sia argomenti di natura teorica che soluzioni di problemi analoghi a quelli trattati nel corso. ESEMPI DI DOMANDE E/O ESERCIZI FREQUENTI http://www.dmi.unict.it/~cantone/esami/esami TRIENNALE/Algoritmi-sample-2016.pdf
Le domande relative alla prima prova d'esame sono le medesime che gli studenti potranno trovare all'interno del Sistema di Esercitazione. I testi delle prove di laboratorio in C++ sono invece disponibili sul sito internet del docente.