Entrambe le parti precedenti la revisione
Revisione precedente
Prossima revisione
|
Revisione precedente
|
informatica:all-a:all12:start [07/02/2013 alle 20:08 (11 anni fa)] anna bernasconi |
informatica:all-a:all12:start [13/02/2014 alle 11:16 (10 anni fa)] (versione attuale) Linda Pagli [Anni accademici precedenti] |
| |
| ====== Algoritmica e Laboratorio - Corso A ====== |
| |
===== Informazioni Generali ===== | ===== Informazioni Generali ===== |
| |
**Docente**: Anna Bernasconi | **Docenti:** [[http://www.di.unipi.it/~pagli/|Linda Pagli]], [[http://www.di.unipi.it/~prencipe/|Giuseppe Prencipe]] |
| |
| |
| (**Docenti corso B:** [[http://www.di.unipi.it/~annab/|Anna Bernasconi]], [[http://www.di.unipi.it/~rossano/|Rossano Venturini]] ) |
| |
| **Assistente:** [[http://www.di.unipi.it/~ceccarel/doku.php?id=start/|Diego Ceccarelli]] |
| |
**Impegno:** 12 CFU di cui 9 teoria/esercitazioni e 3 Laboratorio. | **Impegno:** 12 CFU di cui 9 teoria/esercitazioni e 3 Laboratorio. |
**Semestre:** secondo. | **Semestre:** secondo. |
| |
**Ricevimento studenti:** martedì 11-13 e su appuntamento. | **Ricevimento studenti:** dopo ogni lezione e su appuntamento. |
| |
Il corso consiste ogni settimana di 3 lezioni di didattica frontale in aula e di 1 esercitazione in laboratorio nella quale le nozioni apprese in classe verranno sperimentate realizzando in C gli algoritmi corrispondenti. | Il corso consiste ogni settimana di 3 lezioni di didattica frontale in aula e di 1 esercitazione in laboratorio nella quale le nozioni apprese in classe verranno sperimentate realizzando in C gli algoritmi corrispondenti. |
| |
| |
| ===== Anni accademici precedenti ===== |
| * [[informatica:all-a:all11:|A.A. 2011/2012]] |
| * [[informatica:all-a:all10:|A.A. 2010/2011]] |
| * [[informatica:all-a:all09:|A.A. 2009/2010]] |
| |
| ===== Orario Lezioni ===== |
| |
| ^ Orario delle Lezioni ^^^^ |
| |Martedì | 9-11 | A | Teoria | |
| |Mercoledì | 11-13 | A | Teoria | |
| |Giovedì | 14-16 | H, M | Laboratorio | |
| |Venerdì | 11-13 | A | Teoria | |
| |
| |
| Si pregano gli studenti che dispongono di un portatile di portarlo **in Laboratorio**. |
| |
| ===== Obiettivi del Corso ===== |
| L'obiettivo del corso è quello di introdurre strutture dati e tecniche algoritmiche (di base) che consentano allo studente la risoluzione di problemi su sequenze, liste, alberi e grafi, in modo efficiente in tempo e/o spazio. Si discuteranno inoltre alcune tecniche analitiche per la valutazione delle prestazioni degli algoritmi, o delle limitazioni inerenti del calcolo. |
| |
| Il corso prevede una intensa attività di laboratorio che porterà gli studenti a sperimentare in linguaggio C le nozioni e le tecniche algoritmiche apprese in classe. |
| ===== Modalità e Appelli di Esame===== |
| |
| L'esame consiste di tre prove: |
| |
| * Una prova scritta con esercizi atti a valutare l'apprendimento delle nozioni teoriche e la capacità di "problem solving" dello studente. Tale prova viene valutata in trentesimi, e si intende superata se la valutazione è maggiore o uguale a 18, nel qual caso lo studente è ammesso a sostenere la prova di laboratorio. |
| * Una prova in laboratorio che verifica la capacità dello studente di realizzare in C gli algoritmi di base visti in classe, risolvendo semplici problemi su array, liste, alberi e grafi. Tale prova è da intendersi come un __test di idoneità__ il cui superamento permette allo studente di essere ammesso a sostenere la prova orale. |
| * Una prova orale sul programma del corso, la cui valutazione è in trentesimi e tiene in considerazione il risultato riportato dallo studente nella prova scritta. |
| |
| Le prove possono essere sostenute in appelli diversi. Se una prova non viene passata, occorre risostenere soltanto quella. |
| |
| Per avere una idea della tipologia delle prove, si consultino i testi dell'[[http://www.cli.di.unipi.it/doku/doku.php/informatica/all-a/all11/start|anno scorso]]. |
| |
| |
| ^ Data ^ Tipo Prova ^ Documento ^ Note ^ |
| | 03/04/2013, ore 11.00 | Scritto (primo compitino)|{{:informatica:all-b:algo1_030413.pdf|}}|{{:informatica:all-a:risalg3-41-3.pdf|Risultati}}| |
| | 30/05/2013, ore 9.00 | Scritto (secondo compitino)|{{:informatica:all-b:algo1_300513.pdf}} |{{:informatica:all-a:risalg_30-5-2013.pdf|Risultati}}| |
| | 12/06/2013, ore 9.00 | Scritto (primo appello)|{{:informatica:all-a:algo1_120613.pdf}}{{:informatica:all-b:soluzioni.pdf|soluzioni}}|{{:informatica:all-a:risalg12-6-13.pdf|Risultati}}| |
| | 12/07/2013, ore 9.00 | Scritto (secondo appello)|{{:informatica:all-a:algo_120713.pdf|testo}}|{{:informatica:all-a:risalg12-7-13.pdf|risultati}}| |
| | 9/09/2013, ore 15.00 | Scritto | {{:informatica:all-b:Algo1_090913.pdf}}|{{:informatica:all-a:risalg9-9-13.pdf|risultati}}|Orale: 13/9/2013 ore 9.30 ufficio Pagli| |
| | 4/11/2013, ore 14.00 | Scritto | {{:informatica:all-b:Algo1_041113.pdf}}|{{:informatica:all-a:risalg4-11-13.pdf|risultati}}| Visione scritti: mercoledì 6 novembre, ore 9:30, ufficio Bernasconi.| |
| | 21/01/2014, ore 9.30 | Scritto | {{:informatica:all-b:Algo1_210114SOL.pdf}} |{{:informatica:all-a:risalg21-1-14.pdf|}}| Visione scritti: venerdi'ore 11, ufficio Pagli.| |
| | 7/02/2014, ore 9.30 |Scritto ||{{:informatica:all-a:risalg7-2-14.pdf|}}|Visione scritti: 11/2/2014 ore 15.30, ufficio Pagli.| |
| Prossime date per le prove di laboratorio: |
| ^ Data ^ Ora ^ Aule ^ |
| | 11/06/2013 | 9:30 |H e M | |
| | 14/06/2013 | 9:30 |H e M | |
| | 16/07/2013 | 9:30 |H e M | |
| | 12/09/2013 | 9:30 |H e M | |
| | 24/01/2014 | 9:30 |H e M | |
| |
| Prossime date per le prove orali: |
| ^ Data ^ Ora ^ Aule ^ |
| | 11/06/2013 | dopo il laboratoio |ufficio Pagli | |
| | 14/06/2013 | 9-13 |aula L | |
| | 24/06/2013 | 9:30 |ufficio Pagli| |
| | 16/07/2013 | 11:00 |ufficio Pagli| |
| | 17/07/2013 | 9.00 |ufficio Pagli| |
| | 24/01/2014 | 11:00 |ufficio Pagli| |
| | 11/02/2014 | 15:30 |ufficio Pagli| |
| |
| |
| ===== Libri di testo ===== |
| |
| * **[CGGR]** P. Crescenzi, G. Gambosi, R. Grossi, G. Rossi. //Strutture di dati e algoritmi: progettazione, analisi e programmazione (seconda edizione)//. Pearson, 2012. [[http://wps.pearsoned.it/crescenzi_strutture-dati-algoritmi2/]] |
| |
| * **[CGG]** P. Crescenzi, G. Gambosi, R. Grossi. //Strutture di dati e algoritmi: progettazione, analisi e visualizzazione//. Addison-Wesley, 2005. Per approfondimenti ed errata: http://www.algoritmica.org/sda/pmwiki.php |
| |
| |
| * **[CLRS]** T. Cormen, C. Leiserson, R. Rivest, C. Stein. //Introduzione agli algoritmi e strutture dati//. McGraw-Hill, Terza edizione, 2010. |
| |
| Per il laboratorio, un testo fra: |
| * **[KR]** B.W. Kernighan, D.M. Ritchie. //Il Linguaggio C//, Pearson-Prentice Hall, seconda edizione, 2008. |
| * **[KP]** A. Kelley, I. Pohl. //C: Didattica e Programmazione//, Addison-Wesley, quarta edizione, 2004. |
| |
| ===== Materiale per il Laboratorio ===== |
| |
| * **__Prerequisito__**: Conoscenza approfondita della programmazione C per ciò che concerne gli operatori (aritmetici e relazionali), il flusso del controllo (If-then-else, while, for), le funzioni, gli array, i puntatori, le stringhe e l'allocazione dinamica della memoria. Quindi i capitoli 1-5 del libro "Il Linguaggio C", B.W. Kernighan e D.M. Ritchie, Pearson-Prentice Hall, seconda edizione, 2008. |
| * **__Strumenti per la programmazione__**: Un editore testuale (tipo ''Emacs''), e il compilatore ''gcc'', sono sufficienti per apprendere e testare le varie nozioni algoritmiche e di //coding// che verranno discusse in Laboratorio. I programmatori più esperti potranno eventualmente utilizzare un framework di sviluppo come [[http://www.eclipse.org/|Eclipse]] esteso con il suo plug-in [[http://www.eclipse.org/cdt/|Eclipse C/C++ Development Tooling]]. Per chi si trova a operare sotto Windows suggeriamo il compilatore e il debugger disponibili con [[http://www.mingw.org/|MinGW]], e consigliamo di istallare i 3 componenti suddetti secondo la sequenza: Eclipse-MinGW-CDevTool. Oppure istallare una macchina virtuale, come [[http://www.virtualbox.org/|VirtualBox]], con una qualunque distribuzione Linux sopra. Il **consiglio** è però quello di adoperare la combinazione minimale ''editor+gcc'' al fine di non perdersi nei meandri e nelle opzioni dei vari tools (non necessari per AIL), per concentrarsi **soltanto** sugli aspetti di //coding// degli algoritmi. |
| ===== Programma del corso ===== |
| |
| |
| - Breve introduzione a problemi computazionali, indecidibilità, e trattabilità (P, NP, NPC, EXP-TIME). |
| - Complessità computazionale: modello di calcolo, dimensione dell'input e dell'output, caso pessimo e caso medio. |
| - Limiti del calcolo: albero di decisione, limiti superiori e inferiori. |
| - Divide-et-impera, Relazioni di ricorrenza, Teorema fondamentale. |
| - Algoritmi per sequenze statiche e dinamiche: ricerca e ordinamento. |
| - Ordinamento basato su confronti: Insertion sort, Merge-sort, Quick-sort, Heap sort. |
| - Ordinamento di interi: Counting sort, Radix Sort. |
| - Ordinamento di stringhe: ''qsort''-based. |
| - Sottosequenza di somma massima. |
| - Programmazione dinamica: LCS, Partizione e Zaino |
| - Algoritmi randomizzati: Quicksort. |
| - Generazione di combinazioni e permutazioni |
| - Analisi ammortizzata: doubling di array, contatore binario, k ricerche. |
| - Dizionari: Alberi bilanciati (AVL), Tabelle hash (liste di trabocco e indirizzamento aperto). |
| - Alberi: rappresentazione e visite. |
| - Grafi I: rappresentazione e visite (DFS e BFS), DAG e ordinamento topologico. |
| - Grafi II: Ciclo/cammino euleriano, ciclo hamiltoniano, componenti (fortemente) connesse. |
| - Grafi III: Minimum Spanning Tree e Shortest Path. |
| |
| ===== Lavagna ===== |
| |
| {{:informatica:all-b:lavagna1.pdf|Primo "quaderno"}} |
| |
| {{:informatica:all-a:risalg3-41-3.pdf|}} |
| |
| ===== Registro delle Lezioni ===== |
| ^ Data ^ Argomento ^ Rif. Biblio ^ |
| | 19/02/2013 | Introduzione al corso. Moltiplicazione Egizia. Nozioni di Algoritmo, Problema, Limite Inferiore. Analisi di un problema semiserio | {{:informatica:all-b:12monete.pdf|appunti}}| |
| | 20/02/2012 | **Laboratorio**: Editing e compilazione. Richiami di linguaggio C: Costrutti, array, printf e scanf. | Cap. 2-3, 7.1-7.4 di [KR]. somma == P[b-1) [[http://algoritmica.spox.spoj.pl/ALGLAB2013|Sito Esercitazioni]]| |
| | 21/02/2012 | **Laboratorio**: Ripasso e esercizi su funzioni e puntatori. |Sez. 4.1-4.5 e 5.1-5.5 di [KR]. {{{{:informatica:all-b:lez2.pdf|Lucidi}}| |
| | 22/02/2013 | Problemi intrattabili: le torri di Hanoi, algoritmo, analisi del numero di mosse. Crescita esponenziale.|[CGGR] {{:informatica:all-b:capitoloonline.pdf|prologo}}; [CGG] cap. 1 | |
| | 27/02/2012 | **Laboratorio**: Funzioni e passaggio dei parametri. |Sez. 4.1-4.5 e 5.1-5.5 di [KR]. {{:informatica:all-b:lez3.pdf|Lucidi}}| |
| | 28/02/2012 | **Laboratorio**: Allocazione dinamica della memoria (malloc) e stringhe. |{{:informatica:all-b:lez4.pdf|Lucidi}} | |
| | 01/03/2013 | Teoria della calcolabilità. Insiemi numerabili.Esistenza di problemi non decidibili. Il problema dell'arresto |{{:informatica:all-b:calc.pdf|Lucidi}};| |
| | 05/03/2013 | Rappresentazione degli elementi di un insieme con vettore di appartenenza. Generazione di tutte le stringhe binarie, applicazione a PARTITION. Generazione di tutte le permutazioni, applicazione a HAMILTONIAN CYCLE. Esempi di certificati polinomiali. La classe NP.| [CGGR] {{:informatica:all-b:capitoloonline.pdf|prologo}}; [CGG] cap. 1 | |
| | 06/03/2013 | Il certificato polinomiale. Nozione di Riduzione Polinomiale. Problemi NP-completi. Il Problema SAT. | [CGGR]: {{:informatica:all-b:capitoloonline.pdf|prologo}}; [CGG]: cap. 1| |
| | 07/03/2013 | **Laboratorio**: Sottoarray di somma massima, intersezione e fusione di array. | {{:informatica:all-b:test_set.zip|File di test per intersezione}} {{:informatica:all-b:test_maxsum.zip|File di test per sottoarray di somma massima}}| |
| | 08/03/2013 | Esempi di problemi NPC: Problema SAT, Ciclo Hamiltoniano, k-clique. Esempio di riduzione: da SAT a k-Clique. Il modello RAM e costo delle istruzioni if, for, while. | Una riduzione ({{:informatica:all-a:all10:k-clique.pdf|K-clique}}). [CGG]: cap. 1, {{:informatica:all-a:esercizi0.pdf|}}| |
| | 12/03/2013 | Notazione asintotica: Theta, O-grande, Omega-grande, o-piccolo e w-piccolo, con esempi. Array di dimensione variabile. Selection Sort analisi complessità.| [CGGR]:introduzione e cap. 1; [CGG]: cap. 2; {{:informatica:all-b:prerequisiti.pdf|Formule utili}}| |
| | 13/03/2013 | Insertion Sort, analisi. Limiti inferiori: tecnica della dimensione dell'input, tecnica dell'albero delle decisioni e dell'oracolo. Esempi: ordinamento. Algoritmo del torneo e del doppio torneo. | {{:informatica:all-a:all10:lucciolb.pdf|limiti inferiori}} | |
| | 14/03/2013 | **Laboratorio**: Sottoarray di somma massima lineare, Insertion Sort su interi e stringhe, ricerca binaria su stringhe. | {{:informatica:all-b:sommaarray.pdf|Lucidi sottoarray somma massima}} {{:informatica:all-b:arraystrings.pdf|Lucidi Array Stringhe}} {{:informatica:all-b:puzzlelez6.pdf|Puzzle: L'intero mancante}} | |
| |15/03/2013 |Esercitazione: Limite inferiore per il problema della ricerca con albero di decisione. Soluzione degli esercizi proposti : generazione di tutti i sottoinsiemi di k elementi. Algoritmo di soluzione e verifica della k-clique. Algoritmo per il problema della Subset-Sum.| {{:informatica:all-a:esercizi0sol.pdf|esercizi corretti}} | |
| | 19/03/2013 | Il problema della ricerca: ricerca binaria ricorsiva; Analisi. Paradigma Divide et Impera. Un algoritmo ottimo di ordinamento di tipo Divide et Impera: MergeSort.| [CGGR]: cap 3; [CGG]: cap. 2; | |
| | 20/03/2013 | Quicksort: proprietà e analisi della complessità nel caso ottimo e pessimo. Equazioni di ricorrenza: enunciato teorema principale e esempi.| [CGGR]: cap 3; [CGG]: cap. 2; {{:informatica:all-a:ricorrenze.pdf|ricorrenze}} | |
| | 21/03/2012 | **Laboratorio**: Quick Sort su interi e su stringhe. Varianti (//pari&dispari//, //3-way partition//).| {{:informatica:all-a:quick_sort_parziale.c.zip|Quicksort parziale}} {{:informatica:all-b:partition.pdf|Pseudocodice Distribuzione}} {{:informatica:all-b:puzzlelez7.pdf|Puzzle: la scala e cavalli}}| |
| | 22/03/2013 | Randomized-Quicksort: analisi della complessità nel caso medio. Equazioni di ricorrenza: dimostrazione teorema principale e esempi.| [CGGR]: cap 5; [CGG]: cap. 2; {{:informatica:all-a:esercizi1.pdf|}} | |
| | 26/03/2013 | Moltiplicazione veloce di interi e matrici. Esercitazione: progettazione di algoritmi e analisi di complessità.|[CGGR]: cap 3; [CGG]: cap. 2; | |
| | 27/03/2013 | Selezione dell'erresimo elemento, QickSelect: analisi caso pessimo e caso medio. Esercitazione: progettazione di algoritmi e analisi di complessità.|[CGGR]: cap 3; [CGG]: cap. 2; | |
| | 3/04/2013 | {{:informatica:all-b:algo1_030413.pdf|Prima prova di verifica intermedia.}}|{{:informatica:all-a:risalg3-41-3.pdf|risultati}} | |
| | 9/04/2013 | Correzione della prima prova di verifica intermedia. Code con priorità, Heap come albero binario completo a sinistra, relazione tra numero di nodi e altezza. |[CGGR]: cap 2 ; [CGG]: cap. 8; | |
| |10/04/2013 | Operazioni Enqueue, First, Dequeue per un Heap di massimo. Complessità. Allocazione implicita in array. HeapSort. |[CGGR]: cap 2 ; [CGG]: cap. 8; | |
| | 11/04/2012 | **Laboratorio**: Esercizi d'esame: qsort e struct|{{:informatica:all-b:puzzlelez9.pdf|Puzzle: Elemento maggioritario}}| |
| | 12/04/2012 | Ordinamento di interi: Counting sort e Radix Sort. Introduzione alla Programmazione Dinamica.|{{:informatica:all-a:cormen-contingradixsort.pdf|[CLR] cap. 8}}; {{:informatica:all-a:pr_din.pdf|Programmazione dinamica (dispensa Prof. Luccio)}} ; [CGGR]: cap 6; [CGG]: cap 2; | |
| | 16/04/2013 | Programmazione Dinamica: Edit Distance, Longest Common Subsequence (introduzione al problema).|{{:informatica:all-a:pr_din.pdf|Programmazione dinamica (dispensa Prof. Luccio)}}; [CGGR]: cap 6; [CGG]: cap 2; | |
| | 17/04/2013 | Programmazione Dinamica: Longest Common Subsequence, Partizione di un insieme di interi. |[CGGR]: cap 6; [CGG]: cap 2; | |
| | 18/04/2013 | **Laboratorio**: Liste |{{:informatica:all-b:puzzlelez10.pdf|Puzzle: Ciclo in una lista}}| |
| | 19/04/2013 | Programmazione Dinamica: Il problema dello Zaino. Pseudopolinomialità. Esercizi sulla programmazione dinamica. |[CGGR]: cap 6; [CGG]: cap 2; {{:informatica:all-b:esercizipd.pdf|Esercizi}}| |
| | 23/04/2013 | Alberi binari: visite, algoritmi ricorsivi su alberi binari. Alberi con un numero qualsiasi di figli: memorizzazione binarizzata. Dizionari. |[CGGR]: cap 1, cap 3, cap 4; [CGG]: cap 4, cap 5; | |
| | 24/04/2013 | Dizionari: realizzazione con alberi binari di ricerca. Alberi AVL: definizione. |[CGGR]: cap 4; [CGG]: cap 5; | |
| | 26/04/2013 | Esercitazione: operazione DecreaseKey in un heap; simulazione di un algoritmo di programmazione dinamica per il problema dello Zaino. Progettazione di algoritmi di programmazione dinamica per problemi su scacchiera. | {{:informatica:all-a:ese26-4-2012.pdf}}| |
| | 30/04/2013 | Alberi binari 1-bilanciati: dimostrazione di altezza logaritmica nel numero di nodi. Dizionari: realizzazione con alberi AVL (ricerca; inserimento: rotazioni; cancellazione: cenni). |[CGGR]: cap 4; [CGG]: cap 5; | |
| | 3/05/2013 | Esercitazione: progettazione di algoritmi efficienti su alberi binari, ABR e AVL. |{{:informatica:all-a:ese03-5-2013.pdf|esercizi corretti}}| |
| | 07/05/2013 | Dizionari: funzioni hash, realizzazione del dizionario con tabelle hash con liste di trabocco e a indirizzamento aperto. Il problema della cancellazione. |[CGGR]: cap 4; [CGG]: cap 5; | |
| | 08/05/2013 | Dizionari: tabelle hash a indirizzamento aperto: analisi al caso medio; scansione lineare, quadratica, doppio hash. |[CGGR]: cap 4; [CGG]: cap 5; {{:informatica:all-b:16_hash.pdf|tabelle hash (dispensa Prof. Luccio)}};| |
| | 09/05/2013 | **Laboratorio**: Tabelle Hash | {{:informatica:all-b:hashtable.pdf|Lucidi}} {{:informatica:all-b:puzzlelez12.pdf|Puzzle: Griglia infetta}}| |
| | 10/05/2013 | Grafi: definizioni, rappresentazione di grafi in memoria; visita in ampiezza. |[CGGR]: cap 7; [CGG]: cap 6; | |
| | 14/05/2013 | Visita in ampiezza di un grafo: analisi e proprietà. Visita in profondità. Ordinamento topologico di un grafo diretto aciclico. |[CGGR]: cap 7; [CGG]: cap 6; | |
| | 15/05/2013 | Ordinamento topologico di un DAG: algoritmo e analisi. Ricerca di cammini minimi su grafi pesati: algoritmo di Dijkstra. |[CGGR]: cap 7; [CGG]: cap 6; | |
| | 16/05/2013 | **Laboratorio**: Simulazione della prova di laboratorio|{{:informatica:all-b:prova.pdf|Testo}} {{:informatica:all-b:input.tar|Input}} [[http://www.di.unipi.it/~ceccarel/algo/|Codice sottomesso]]| |
| | 17/05/2013 | Algoritmo di Dijkstra: simulazione, correttezza e analisi. |[CGGR]: cap 7; [CGG]: cap 6; | |