====== Laboratorio di Algoritmi e Strutture Dati ====== ---- ===== News ===== * **9 Giugno 2016**: Il corso termina con le presentazioni di argomenti non trattati a lezione da parte di alcuni studenti * **3 Marzo 2016**: Il modulo inizia alle ore 10.00 in Aula "A. Turing" del palazzo di Informatica (ex-tribunale), per la mappa delle aule si veda [[didattica:classrooms:main|qui]] ---- ===== Informazioni Generali ===== **Docente**: * [[http://docenti.unicam.it/pdett.aspx?ids=N&tv=d&UteId=572&ru=RU|Luca Tesei]] **Orario delle Lezioni**: * Giovedì 10 - 13 (Aula, A. Turing) **Ricevimento studenti**: * Il Ricevimento è **tutti i mercoledì dalle 11.30 alle 14.00** nella stanza CS 07 al secondo piano del Polo Tecnologico Palazzo Battibocca, via del Bastione 1, Camerino. Per eventuali variazioni si consulti preventivamente [[http://docenti.unicam.it/pdett.aspx?ids=N&tv=d&UteId=572&ru=RU|questa pagina]]. * A partire dal 13 Giugno 2016 l'orario di ricevimento valido sarà solo quello indicato su [[http://docenti.unicam.it/pdett.aspx?ids=N&tv=d&UteId=572&ru=RU|questa pagina]] ---- ===== Obiettivi del Corso ===== Gli obiettivi indicati sono quelli del corso intero, comprensivo della parte teorica e della parte di laboratorio. **CONOSCENZA E CAPACITÀ DI COMPRENSIONE** Al termine di questa attività formativa, lo studente dovrà dimostrare di essere in grado di: * Comprendere la nozione di complessità computazionale di un algoritmo in tempo e in spazio * Illustrare le principali tecniche di progettazione di algoritmi * Conoscere le strutture dati di base e le principali strutture dati evolute per risolvere problemi specifici di ricerca e rappresentazione di strutture complesse **CAPACITÀ DI APPLICARE CONOSCENZA E COMPRENSIONE** Al termine di questa attività formativa, lo studente dovrà dimostrare di essere in grado di: * Applicare le principali tecniche di progettazione di algoritmi * Classificare ed analizzare gli algoritmi in base alla loro complessità computazionale * Ideare e implementare algoritmi per risolvere problemi specifici utilizzando le tecniche e le strutture dati conosciute **AUTONOMIA DI GIUDIZIO** Al termine di questa attività formativa, lo studente dovrà dimostrare di essere in grado di: * Scegliere (ed implementare) le strutture dati più adatte alla risoluzione di un dato problema realizzando opportuni compromessi tra esigenze conflittuali come costo, semplicità ed efficienza. **ABILITÀ COMUNICATIVE** Al termine di questa attività formativa, lo studente dovrà dimostrare di essere in grado di: * Produrre una relazione dettagliata sull’ideazione e l’implementazione di un progetto * Avere la capacità di lavorare in gruppo per la realizzazione di un progetto **CAPACITÀ DI APPRENDIMENTO** Al termine di questa attività formativa, lo studente dovrà dimostrare di essere in grado di: * Ricercare, comprendere e implementare algoritmi e strutture dati esistenti, ma non trattati nel corso, per la risoluzione di problemi specifici ---- ===== Contenuti del Corso ===== La parte di laboratorio verterà sui seguenti contenuti: * Richiami di Java e programmazione orientata agli oggetti, ereditarietà e polimorfismo, uguaglianza e ordinamento fra gli elementi di una classe * Tipi generici e Collections * Implementazione di tipi di dato astratto tramite tipi generici e interfacce di specifica: liste, pile, code, insiemi * Implementazione di diversi algoritmi di ordinamento generici, realizzazione di un benchmark per la valutazione numerica della loro complessità computazionale e per la loro comparazione * Implementazione di algoritmi su strutture dati dinamiche: alberi bilanciati, alberi binari di ricerca * Rappresentazione di grafi e alberi, implementazione di visite e altri algoritmi su grafi e alberi ---- ===== Materiale ===== **Slides e Codice** * 03/03/2016 {{:didattica:triennale:algoritmi:ay_1516:java_oop.pdf|Richiami di Java e OOP}} {{:didattica:triennale:algoritmi:ay_1516:equazionisecondogrado.zip|Codice Java su Equazioni di Secondo Grado}} * 10/03/2016: {{:didattica:triennale:algoritmi:ay_1516:interfaccepolimorfismoereditarieta_.pdf|Interfacce, Polimorfismo, Ereditarietà}} {{:didattica:triennale:algoritmi:ay_1516:datasets.zip|Codice DataSets}} {{:didattica:triennale:algoritmi:ay_1516:bankaccounts.zip|Codice BankAccounts}} * 17/03/2016: {{:didattica:triennale:algoritmi:ay_1516:collections.pdf|Collections}} - [[https://docs.oracle.com/javase/tutorial/java/generics/|Tutorial Java sui Generics]] * 24/03/2016: {{:didattica:triennale:algoritmi:ay_1516:doublelinkedlist.pdf|Liste Concatenate Doppie}} {{:didattica:triennale:algoritmi:ay_1516:mylistcode-lezione_del_24_03_2016.zip|Implementazione (parziale) sviluppata a lezione}} * 31/03/2016: {{:didattica:triennale:algoritmi:ay_1516:mylist.zip|Implementazione di Liste Concatenate Doppie con Iteratore}} {{:didattica:triennale:algoritmi:ay_1516:bintree.zip|Implementazione di Alberi Binari. Visite e alcune funzioni ricorsive.}} * 07/04/2016: {{:didattica:triennale:algoritmi:ay_1516:trees.pdf|Alberi, Alberi Binari, Alberi Generici, Metodi Ricorsivi su Alberi}} {{:didattica:triennale:algoritmi:ay_1516:trees.zip|Codice Sviluppato a Lezione su Alberi, Alberi Binari, Alberi Generici, Metodi Ricorsivi su Alberi}} * 14/04/2016: {{:didattica:triennale:algoritmi:ay_1516:algoritmiordinamentogenerici.pdf|Slides: Framework di Valutazione di Algoritmi di Ordinamento (Parziale)}} {{:didattica:triennale:algoritmi:ay_1516:sorting.zip|Codice del Framework di Valutazione di Algoritmi di Ordinamento (Parziale) con implementazione di Bubble Sort}} {{:didattica:triennale:algoritmi:ay_1516:sorting-bubbleinsertionmerge.zip|Codice del Framework di Valutazione di Algoritmi di Ordinamento (Parziale) con implementazione di Bubble Sort, Insertion Sort e Merge Sort}} * 21/04/2016: {{:didattica:triennale:algoritmi:ay_1516:sorting-frameworkandalgs.zip|Framework di valutazione per Algoritmi di Ordinamento con quattro algoritmi implementati e uno (HeapSort) da testare}}, {{:didattica:triennale:algoritmi:ay_1516:heap.zip|Implementazione fatta a lezione di Heap binomiali (da testare)}}, {{:didattica:triennale:algoritmi:ay_1516:provavalutazione.zip|Esempio di valutazione della complessità computazionale nel caso medio usando i dati generati dal framework di valutazione}} * 28/04/2016: {{:didattica:triennale:algoritmi:ay_1516:hash.zip|Codice per tabella hash statica (sviluppato a lezione)}}, {{:didattica:triennale:algoritmi:ay_1516:bst.zip|Codice della classe per Alberi Binari di Ricerca (parziale)}} * 05/05/2016: {{:didattica:triennale:algoritmi:ay_1516:regine.zip|BackTracking e Problema delle otto regine}}, {{:didattica:triennale:algoritmi:ay_1516:grafi-parziale.zip|Strutture dati per la rappresentazione dei grafi (parziale, da completare nella prossima lezione)}} * 12/05/2016: {{:didattica:triennale:algoritmi:ay_1516:grafi-interface-and-edges.zip|Interface generica per grafi e classe per gli archi}}, Esercitazione: implementazione dell'interfaccia tramite una classe per grafi non diretti rappresentati con liste di adiacenza. * 19/05/2016: {{:didattica:triennale:algoritmi:ay_1516:bfs-generica-con-test.zip|Nuova interfaccia generica per grafi e codice dell'implementazione dell'interfaccia tramite una classe per grafi non diretti rappresentati con liste di adiacenza - Implementazione di una generica visita in ampiezza con calcolo di albero di copertura e distanza minima data dal numero di archi da attraversare per raggiungere il nodo sorgente.}} * 26/05/2016: Alberi minimi di copertura. Algoritmo di Prim. {{:didattica:triennale:algoritmi:ay_1516:graph-mst.zip|Codice sviluppato a lezione per implementazione senza coda di priorità (manca Test)}} * 09/06/2016: Presentazioni degli studenti riguardo argomenti concordati: Algoritmi di ordinamento non basati su confronti. Algoritmi di scheduling. Algoritmi per cammini minimi su grafi. **Testi di Riferimento** * T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduzione agli Algoritmi e Strutture Dati, McGraw-Hill, 2005 * C. Toffalori, F. Corradini, S. Leonesi, S. Mancini, Teoria della computabilità e della complessità, McGraw-Hill, 2005 * Saranno fornite dal docente dispense e slides integrative su cui studiare e fare esercizi. Per scaricare le dispense si consulti questo sito, nella sezione qui sopra. **Testi di Approfondimento** * Maurizio Gabbrielli, Simone Martini, "Linguaggi di programmazione - Principi e paradigmi 2/ed", McGraw-Hill, 2011, ISBN: 9788838665738, [[http://www.ateneonline.it/gabbrielli/home.asp|Sito Web]] * Duane A. Bailey, "Java Structures. Data Structures in Java, for the Principled Programmer", Sito Web con versione pdf: [[http://www.cs.williams.edu/~bailey/JavaStructures|http://www.cs.williams.edu/~bailey/JavaStructures]] ---- ===== Mini Progetti per i Frequentanti ===== **Regole di consegna dei Mini Progetti** * I file da consegnare per ogni Mini Progetto (indicati nel testo) dovranno essere caricati, entro la scadenza, in una cartella Google Drive dal nome ''ASDL1516''CodiceMiniProgetto''-''CognomeStudente''-''NomeStudente che deve essere condivisa, in sola lettura, tramite l'account ''nome-studente.cognome-studente@studenti.unicam.it'' con gli account: * ''luca.tesei@unicam.it'' (docente) e * ''lorenzo.rossi@studenti.unicam.it'' (tutor). Ad esempio, lo studente Mario Rossi, alla consegna del Mini Progetto 1 con codice ''MP1'' dovrà caricare i file nella cartella ''ASDL1516MP1-Rossi-Mario''. Per la scadenza, farà fede la data dei file su Google Drive. **Testo dei Mini Progetti e Scadenze** * {{:didattica:triennale:algoritmi:ay_1516:asdl1516mp1-con-allegati.pdf|Mini Progetto 1 (Codice MP1)}} - Scadenza **16 Marzo 2016 ore 23.59** * **ATTENZIONE: Versione del testo modificata il 7 Aprile 2016 ore 15.06**: {{:didattica:triennale:algoritmi:ay_1516:asdl1516mp2.pdf|Mini Progetto 2 (Codice MP2)}} - Scadenza **20 Aprile 2016 ore 23.59** - Allegati: {{:didattica:triennale:algoritmi:ay_1516:myset.zip|Stub del codice da implementare.}} {{:didattica:triennale:algoritmi:ay_1516:mylist.zip|Implementazione di MyList con liste concatenate doppie.}} * {{:didattica:triennale:algoritmi:ay_1516:asdl1516mp3.pdf|Mini Progetto 3 (Codice MP3)}} - Scadenza **11 Maggio 2016 ore 23.59** - Allegati: {{:didattica:triennale:algoritmi:ay_1516:sortingeval.zip|Codice Framework di valutazione e codice degli altri algoritmi di ordinamento}}, {{:didattica:triennale:algoritmi:ay_1516:provavalutazione.zip|Esempio di valutazione}} * {{:didattica:triennale:algoritmi:ay_1516:asdl1516mp4.pdf|Mini Progetto 4 (Codice MP4)}} **Attenzione!!! Versione corretta del 1 Giugno 2016.** Correzione: GenericGraphDFS --> GenericGraphDFS - Scadenza **13 Giugno 2016 ore 23.59** - Allegati: {{:didattica:triennale:algoritmi:ay_1516:graph-interface-edge.zip|Codice dell'interfaccia Graph e della classe Edge}} ** VALUTAZIONE PARZIALI E VERBALIZZAZIONE ** La valutazione di tutti i mini progetti è disponibile sul foglio di valutazione Google Drive condiviso con lo studente. Il voto finale, con la data di attribuzione, è visibile anche alla prof.ssa Merelli che provvede alla determinazione della media finale delle due prove e alla verbalizzazione dei 12 CFU. Per gli orari e le modalità di verbalizzazione si prega di fare riferimento alla prof.ssa Merelli e alla Dott.ssa Michela Quadrini (michela quadrini unicam it). ---- ===== Progetti Totali per i non Frequentanti ===== **Regole di consegna dei Progetti Totali** I file ''.java'' per le classi, senza indicazione di package (cioè appartenenti al package di default), e il file con la relazione in pdf, devono essere caricati entro la data di scadenza dell'appello scelto per la consegna (si vedano le date nella sezione "Esami" qui sotto) in una cartella Google Drive dal nome ''ASDL1516PTN-APPX-CognomeStudente-NomeStudente'' dove ''N'' è il numero della traccia e ''X'' è il numero dell'appello in cui si consegna il progetto. La cartella deve essere condivisa, in sola lettura, tramite l'account ''nome-studente.cognome-studente@studenti.unicam.it'' di uno degli studenti del gruppo con gli account: * luca.tesei@unicam.it * emanuela.merelli@unicam.it e con gli account degli altri studenti del gruppo. Per la scadenza, farà fede la data dei file su Google Drive. **Testi proposti per i Progetti Totali** * {{:didattica:triennale:algoritmi:ay_1516:asdl1516pt1.pdf|Progetto totale 1 - Codice PT1 - max 2 studenti}} * {{:didattica:triennale:algoritmi:ay_1516:asdl1516pt2.pdf|Progetto totale 2 - Codice PT2 - max 3 studenti}}, {{:didattica:triennale:algoritmi:ay_1516:graph-interface-edge.zip| Codice allegato per l'interfaccia Graph e per la classe Edge}}. ---- ===== Esami ===== **Date Esami A.A. 2015/2016** Di seguito sono indicati gli appelli fissati con le relative date per la prova scritta (teoria) e la consegna dei progetti totali (laboratorio senza parziali): * Appello I * Prova Scritta: 06/06/2016, ore 11.00, Aula Turing (ex Tribunale) * Consegna Progetto Totale di Laboratorio: entro Lun 13/06/2016 ore 23:59 * Pubblicazione Calendario orali: Mar 14/06/2016 su questo sito * Orali: NON CI SONO PROGETTI CONSEGNATI * Appello II * Prova Scritta: 01/07/2016, ore 11.00, Aula Turing (ex Tribunale) * Consegna Progetto Totale di Laboratorio: entro Dom 10/07/2016 ore 23:59 * Pubblicazione Calendario orali: Lun 11/07/2016 su questo sito * Orali: Luca Tasso e Simone Dominici - Mer 13/07/16 ore 12:00 Sala Riunioni Palazzo Battibocca * Appello III * Prova Scritta: 25/07/2016, ore 11.00, Aula Turing (ex Tribunale) * Consegna Progetto Totale di Laboratorio: entro Dom 24/07/2016 ore 23:59 * Pubblicazione Calendario orali: Lun 25/07/2016 su questo sito * Orali: NON CI SONO PROGETTI CONSEGNATI * Appello IV * Prova Scritta: 12/09/2016, ore 11.00, Aula Turing (ex Tribunale) * Consegna Progetto Totale di Laboratorio: entro Lun 05/09/2016 ore 23:59 * Pubblicazione Calendario orali: Mar 06/09/2016 su questo sito * Orali: NON CI SONO PROGETTI CONSEGNATI * Appello V * Prova Scritta: 30/09/2016, ore 11.00, Aula Turing (ex Tribunale) * Consegna Progetto Totale di Laboratorio: entro Lun 19/09/2016 ore 23:59 * Pubblicazione Calendario orali: Mar 20/09/2016 su questo sito * Orali: Lucia Benigni - Gio 22/09/2016 ore 12.00 Sala Riunioni Palazzo Battibocca * Appello VI **Riservato agli studenti fuori corso** * Prova Scritta: 07/11/2016, ore 11.00, Aula Turing (ex Tribunale) * Consegna Progetto Totale di Laboratorio: entro Mar 08/11/2016 ore 23:59 * Pubblicazione Calendario orali: Mer 09/11/2016 su questo sito * Giorni possibili per l'orale: Gio 10/11/2016 - Ven 11/11/2016 **Regole di esame**: la parte di laboratorio assegna un voto che fa media con il voto ottenuto nella parte teorica. La registrazione del voto è unica per il totale di 12 CFU. Il voto per la parte di laboratorio può essere ottenuto presentando un progetto, assegnato dal docente, svolto singolarmente o in gruppi di massimo 2 o 3 persone (il progetto indicherà il numero massimo di componenti del gruppo). Gli studenti che seguono le lezioni potranno sostituire la realizzazione del progetto consegnando, nei tempi previsti, dei Mini Progetti (si veda la sezione apposita qui sopra) assegnati durante il corso. Questi ultimi potranno essere svolti solo singolarmente. **Voto Finale e Registrazione** * Il voto ottenuto nella parte di laboratorio sarà comunicato al docente della parte teorica che provvederà a fare la media e alla registrazione * Qualora lo studente ottenga il voto nella parte di laboratorio prima di ottenere un voto nella parte teorica, tale voto potrà rimanere congelato, in attesa dell'ottenimento del voto nella parte teorica, per un massimo di 6 appelli.