====== Algoritmi e Strutture dei Dati: A.A. 2021-2022 ====== Prof. Roberto Grossi\\ Dott.ssa Giulia Punzi (supporto) {{:matematica:asd:asd_14:asd_logo.jpg?200|}} ==== Avvisi ==== * Sono disponibili il testo e i dati per il [[progetto_21|[progetto]]]. * Didattica erogata in presenza in aula Fib-E1. * [[https://teams.microsoft.com/l/team/19%3aP1cMb-TMJ8UrBTkJtPIiFZq5A1THr_ce8fV1Ca-T8TI1%40thread.tacv2/conversations?groupId=0a31f511-d484-4370-a6d2-73c9a625c31a&tenantId=c7456b31-a220-47f5-be52-473828670aa1|Canale su Microsoft Teams]]. * Orario lezioni: mar 14:00-15:45, mer 14:00-15:45, ven 14:00-15:45. * Per il ricevimento, su appuntamento in modalità telematica. ==== Motivazioni ==== //"Fino a poco tempo fa, i matematici teorici consideravano un problema risolto se esisteva un metodo conosciuto, o algoritmo, per risolverlo; il procedimento di esecuzione dell'algoritmo era di importanza secondaria. Tuttavia, c'è una grande differenza tra il sapere che è possibile fare qualcosa e il farlo. Questo atteggiamento di indifferenza sta cambiando rapidamente, grazie ai progressi della tecnologia del computer. Adesso, è importantissimo trovare metodi di soluzione che siano pratici per il calcolo. La teoria della complessità studia i vari algoritmi e la loro relativa effficienza computazionale. Si tratta di una teoria giovane e in pieno sviluppo, che sta motivando nuove direzioni nella matematica e nello stesso tempo trova applicazioni concrete quali quello fondamentale della sicurezza e identificazione dei dati."// -- E. Bombieri, Medaglia Fields, in //La matematica nella società di oggi//, Bollettino UMI, Aprile 2001 ==== Contenuti ==== Introduzione al modello di calcolo, all'analisi e alla complessità degli algoritmi. Algoritmi ricorsivi e relazioni di ricorrenza: divide et impera e programmazione dinamica. Strutture di dati combinatorie con applicazioni: algoritmi per array, liste, alberi, pile, code, code di priorità, dizionari, grafi. Problemi P, NP, NP-completi e approssimazione. ==== Obiettivi formativi ==== Definire formalmente le nozioni di algoritmo e di modello di calcolo caratterizzandone gli aspetti rilevanti. Organizzare e strutturare i dati da elaborare nel modo più opportuno al fine di agevolarne l'uso da parte degli algoritmi. Progettare algoritmi corretti (che risolvono cioè sempre e solo il problema a cui si è interessati) ed efficienti (cioè che lo risolvono il più velocemente possibile o usano il minor spazio di memoria possibile), attraverso l'esame di paradigmi diversi e problemi provenienti dal mondo reale. Studiare le limitazioni inerenti dei problemi da risolvere, in particolare di quelli la cui soluzione richiede l'esame di tutte le possibilità. ==== Prerequisiti e metodologia ==== * Conoscenza di un linguaggio di programmazione (C, C++, C#, Java, Phyton). * Lezioni frontali con esercitazioni. * Sviluppo di codice in laboratorio. * Uso di strumenti di visualizzazione. * Sviluppo di un progetto basato su "real-world data". ==== Modalità d'esame ==== * Parte prima, a scelta una delle seguenti possibilità: * [[progetto_21|[progetto]]] con sviluppo di nuovi algoritmi e relativa implementazione, avente una votazione in trentesimi (non richiede la presentazione del mini-progetto). * scritto con esercizi da svolgere, avente una votazione in trentesimi, più un mini-progetto con votazione booleana (prova superata o meno per valutare le capacità programmative); * seminario basato su un argomento di ricerca nel campo dell'algoritmica, avente una votazione in trentesimi, più un mini-progetto con votazione booleana (vedi sopra); * Parte seconda, comune per tutti: verifica tramite l'orale basato sul programma dettagliato (vedi sotto). Nota: le due parti posso essere svolte indipendentemente, senza un ordine o un vincolo temporale particolare tra di loro. ==== Testi e materiale didattico ==== * P. Crescenzi, G. Gambosi, R. Grossi, G. Rossi. Strutture di Dati e Algoritmi, Pearson, seconda edizione, 2012 [CGGR]. * [[http://wps.pearsoned.it/wps/media/objects/14141/14480998/calcolabilita_ecomplessita_.pdf|Capitolo 0, solo versione elettronica]], [[http://tinyurl.com/d9ajvky|Errata-corrige]],[[http://wps.pearsoned.it/crescenzi_strutture-dati-algoritmi2/|Sito Web]] * T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein. Introduction to algorithms, MIT Press, third edition, 2011. * C. Demestrescu, I. Finocchi, G. F. Italiano, Algoritmi e strutture dati, McGraw Hill, seconda edizione, 2008. ==== Programma ==== //Programma d'esame:// [[https://esami.unipi.it/programma.php?c=49294&aa=2021&cid=9&did=20|pagina ufficiale]] Capitolo 0 ([[http://wps.pearsoned.it/wps/media/objects/14141/14480998/calcolabilita_ecomplessita_.pdf|versione elettronica]]), Capitolo 1 (tranne par.1.3), Capitolo 2 (tranne par.2.2), Capitolo 3 (tranne par. 3.5), Capitolo 4 (più [[http://www.it-c.dk/people/pagh/papers/cuckoo-undergrad.pdf|cuckoo hashing]]), Capitolo 5 (par.5.1, 5.2, 5.3), Capitolo 6 (par. 6.1, 6.3, 6.4, 6.5, 6.8), Capitolo 7 (tranne par. 7.3.2), Capitolo 8 (tranne par. 8.7). Guardare [[http://tinyurl.com/d9ajvky|errata-corrige]], integrazioni ed esempi utilizzando ALVIE sul [[http://wps.pearsoned.it/crescenzi_strutture-dati-algoritmi2/|sito Web]]. Per la lista dettagliata, consultare il [[https://unimap.unipi.it/registri/printregistriNEW.php?re=3334096::::&ri=9172|registro delle lezioni]].