Obiettivi formativi

Il corso fornirà agli studenti un’ampia conoscenza su algoritmi e strutture dati fondamentali, con particolare attenzione alle applicazioni e all’analisi delle prestazioni di implementazioni reali. Svilupperà competenze di progettazione algoritmica, esponendo gli studenti a problemi complessi che richiedono ottime capacità di problem solving e che possono essere applicati in una varietà di contesti.

Prerequisiti

Conoscenza di base di un linguaggio di programmazione, come Python, acquisita in un corso introduttivo alla programmazione, insieme a conoscenze di base di matematica e calcolo.

Risultati di apprendimento attesi

Conoscenza e capacità di comprensione: Al termine del corso, gli studenti avranno acquisito una conoscenza approfondita delle tecniche algoritmiche fondamentali per risolvere in modo efficiente una varietà di problemi computazionali. Acquisiranno inoltre una chiara comprensione dell’impatto degli algoritmi sul business e sulla società di oggi e di domani. Capacità di applicare conoscenza e comprensione Gli studenti saranno in grado di: comprendere e definire requisiti chiari per un problema, scomporlo in sottoproblemi, valutare strategie alternative di risoluzione e impiegare tecniche algoritmiche per progettare soluzioni efficienti; implementare e ingegnerizzare le proprie soluzioni algoritmiche utilizzando le competenze di programmazione acquisite nei corsi precedenti. Autonomia di giudizio Gli studenti saranno in grado di analizzare e confrontare diverse soluzioni a problemi computazionali, scegliendo quella più efficiente sulla base di un rigoroso approccio metodologico. Abilità comunicative: Il corso fornirà agli studenti la capacità di comunicare efficacemente — in inglese — le proprie idee, proposte e riflessioni critiche nell’ambito della progettazione, analisi e implementazione di algoritmi. Capacità di apprendimento: Questo corso fornirà agli studenti la capacità di apprendere una serie di strumenti progettuali e analitici e di applicarli a problemi reali. Il metodo di studio renderà gli studenti capaci di scomporre problemi complessi, derivanti da specifiche applicazioni, in parti gestibili e di applicare schemi algoritmici al fine di progettare soluzioni rigorose e documentabili.

Contenuti Del Corso

Il corso si concentra sulla progettazione e sull’analisi di algoritmi e strutture dati. In particolare, tratterà i seguenti argomenti: Algoritmi fondamentali: ricerca e ordinamento Tipi di dati avanzati: code di priorità e dizionari Algoritmi su grafi: visita in ampiezza e in profondità, alberi di copertura minimi e cammini minimi Tecniche algoritmiche: divide et impera, algoritmi greedy, programmazione dinamica

Testi Di Riferimento

Ecco la traduzione in italiano: Appunti delle lezioni e altro materiale didattico forniti dal docente e resi disponibili sulla piattaforma myluiss. Due testi utili: Algorithm Design, di Jon Kleinberg ed Eva Tardos. Introduction to Algorithms. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, The MIT Press

Metodologie Didattiche

Lezioni, sessioni di laboratorio e lavoro di gruppo su progetto. La partecipazione degli studenti durante le lezioni è fortemente incoraggiata.

Modalità di verifica dell'apprendimento

Le competenze saranno valutate attraverso un esame scritto di teoria e un lavoro di gruppo su progetto.

Criteri per l’assegnazione dell’elaborato finale

Una tesi sarà assegnata, su specifica richiesta al docente, agli studenti che dimostreranno un interesse serio e motivato per gli argomenti del corso.

Settimana 1

Course overview and organization. Syllabus discussion. Deadlines and rules of conduct. Algorithmic thinking. A toy example: Fibonacci numbers. Correctness, running time, memory usage. Software lab: project presentation (part 1 released). Theory lab.

Settimana 2

More on recursion: recursion trees, recurrence relations. Analysis of recursive vs iterative algorithms. Asymptotic analysis. Theory and software labs.

Settimana 3

Input size. Worst case, best case, average case analysis. Searching algorithms: sequential and binary search. Solving recurrences by iteration. Quadratic sorting algorithms. First test preparation. Bubblesort lab, theory homework solution.

Settimana 4

Efficient comparison-based sorting algorithms. Master theorem. Divide and conquer sorting algorithms: mergesort. Software and theory labs. First intermediate test.

Settimana 5

Quicksort. Solving recurrences by substitution. Priority queues and heapsort. Project part 2 released. Discussion of part 1.

Settimana 6

Upper and lower bounds. Lower bound on sorting. Counting sort. Dictionaries. Binary search trees: introduction. Software and theory labs.

Settimana 7

More on binary search trees. Balanced search trees: AVL trees. Software and theory labs.

Settimana 8

Graphs. Data structures for graphs. Second test preparation. Software and theory labs. Second intermediate test.

Settimana 9

Depth-first search. Breadth-first search. Applications. Project part 3 released. Software and theory labs.

Settimana 10

Algorithmic techniques: greedy algorithms. Software and theory labs.

Settimana 11

More algorithmic techniques: dynamic programming. Theory and software labs.

Settimana 12

Course recap. Third intermediate test preparation. Third intermediate test.