Ingegneria Informatica e Intelligenza artificiale L-8

Algoritmi e strutture dati

Settore scientifico disciplinare Numero crediti formativi (CFU) Docente
ING-INF/05 (IINF-05/A) 6 Marco Esposito

Obiettivi formativi

L'insegnamento si propone di fornire le competenze fondamentali per l'analisi, la progettazione e l'implementazione di algoritmi e strutture dati essenziali, con un focus specifico sulle esigenze metodologiche dell'ingegneria informatica. Gli studenti impareranno a formalizzare problemi computazionali e a risolverli in modo efficiente, comprendendo i trade-off tra diverse soluzioni algoritmiche in termini di tempo e spazio. Attraverso lo studio dei principali paradigmi di progettazione e l'analisi dei modelli di calcolo non ricorsivi e ricorsivi, il corso mira a sviluppare una mentalità analitica orientata alla progettazione di soluzioni efficienti, fornendo inoltre le basi metodologiche per l'approfondimento autonomo di tecniche algoritmiche più avanzate (programmazione dinamica, tecniche greedy, algoritmi su grafi) trattate in insegnamenti successivi del percorso di studi.

Risultati di apprendimento attesi

  Conoscenza e capacità di comprensione

Lo studente acquisirà familiarità con i principali algoritmi di ordinamento (selection sort, insertion sort, bubble sort, merge sort, quick sort, heap sort) e con i metodi di ricerca su array. Comprenderà a fondo le strutture dati lineari e non lineari, tra cui liste, pile, code, alberi (generici e binari) e grafi, incluse le operazioni sugli alberi binari di ricerca. Apprenderà inoltre i fondamenti della notazione asintotica per l'analisi di complessità e i principi della gestione della memoria in C++.

Capacità di applicare conoscenza e comprensione

Lo studente saprà tradurre problemi reali in pseudocodice e diagrammi di flusso, implementandoli efficacemente in linguaggio C++ tramite un ambiente di sviluppo online. Sarà in grado di manipolare strutture dati complesse come alberi e grafi, applicando algoritmi di visita quali la ricerca in ampiezza (BFS) e le operazioni fondamentali sui nodi (inserimento, ricerca, cancellazione).

Autonomia di giudizio

Lo studente svilupperà la capacità di valutare in modo indipendente e critico le prestazioni di algoritmi diversi applicati allo stesso problema, e di individuare la struttura dati più adeguata per uno specifico contesto applicativo, bilanciando efficienza temporale e consumo di memoria.

Abilità comunicative

Lo studente saprà esporre con rigore scientifico e proprietà di linguaggio le scelte progettuali effettuate, descrivendo la complessità computazionale di un algoritmo e illustrando il funzionamento di strutture dati complesse sia a livello concettuale sia tecnico.

Capacità di apprendimento

Il corso fornisce le basi metodologiche necessarie per studiare autonomamente algoritmi e strutture dati avanzati non trattati direttamente a lezione, favorendo la capacità di aggiornamento continuo tipica dei contesti informatici in rapida evoluzione.


Programma del corso

Introduzione agli algoritmi

Pseudocodice e flowchart

Un problema, due algoritmi

Divide et Impera

Notazione Asintotica

Complessità degli algoritmi non ricorsivi

Replit - online IDE

Complessità

Algoritmi per Array

Gestione della memoria in C++

Il problema della ricerca nell'array

Selection Sort

Insertion Sort

Bubble Sort

Merge Sort

Quick Sort

Heap Sort

Strutture Dati

Liste

Stack

Coda

Albero

Albero binario

Visita di un albero

Albero generico e BFS

Albero binario di ricerca

Albero binario di ricerca - Operazioni

Grafo

Testi consigliati

 Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest e Clifford Stein: Introduzione agli algoritmi e strutture dati, McGraw-Hill (2023).

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano: Algoritmi e Strutture Dati, McGraw-Hill (2008).

Calendario

 

Modalità di accertamento dei risultati di apprendimento acquisiti dallo studente

L'acquisizione dei risultati di apprendimento previsti viene accertata attraverso la verifica del completamento delle attività di autovalutazione presenti alla fine di ogni sezione dell'insegnamento e attraverso la prova d'esame. I test di autovalutazione permettono allo studente di monitorare la propria comprensione degli argomenti trattati e, in caso di difficoltà, di attivarsi per colmare le lacune o richiedere ulteriori spiegazioni al docente. Tutti i contenuti trattati nell'ambito dell'insegnamento costituiscono oggetto di valutazione. La valutazione delle competenze acquisite dallo studente avviene nelle modalità e date d'appello previste dall'Ateneo e pubblicate in piattaforma.

Modalità di esame

 

Propedeuticità

 Non sono previste propedeuticità.

Prerequisiti

 La frequenza proficua dell'insegnamento presuppone la conoscenza preliminare dei concetti base della programmazione, tra cui variabili, tipi di dato, costrutti condizionali, cicli, funzioni e nozioni elementari di ricorsione. Sono inoltre necessarie competenze matematiche di base relative all'analisi e all'algebra, in particolare sulle proprietà delle funzioni, sui logaritmi e sulle successioni.

Organizzazione didattica

  Modalità di erogazione del corso: sono comprese videolezioni e attività di Didattica Sincrona. Le attività didattiche, suddivise tra Didattica Erogativa (DE) e Didattica Sincrona (DS), saranno costituite da 7 ore per CFU e ripartite secondo una struttura di almeno 2,5 ore di DE (tenuta in considerazione la necessità di riascolto) e di 2 ore di DS per ciascun CFU. Attività didattica erogativa (30 ore): 30 lezioni frontali videoregistrate, della durata di circa 30 minuti ciascuna (tenuta in considerazione la necessità di riascolto), sempre disponibili in piattaforma. Attività di didattica sincrona (12 ore): 12 ore in forma di lezioni interattive in aula virtuale, svolte in modalità sincrona, organizzate in date e orari concordati e dedicate a tematiche di approfondimento e integrazione del programma per gli studenti che preparano l'esame. Verranno ripetute nel secondo semestre. Attività di autoapprendimento: lo studente è stimolato a sviluppare autonomia nel problem solving mediante la risoluzione di esercizi non standard e prove di autovalutazione. Il processo di apprendimento è supportato dall'utilizzo di risorse bibliografiche e digitali.

Ricevimento studenti

Online, tramite piattaforma, previo appuntamento con il docente.

Lezioni

Introduzione agli algoritmi

Pseudocodice e flowchart

Un problema, due algoritmi

Divide et Impera

Notazione Asintotica

Complessità degli algoritmi non ricorsivi

Replit - online IDE

Complessit

Complessit

Algoritmi per Array

Gestione della memoria in C++

Il problema della ricerca nell'array

Selection Sort

Insertion Sort

Bubble Sort

Merge Sort

Quick Sort

Heap Sort

Strutture Dati

Liste

Stack

Coda

Albero

Albero binario

Visita di un albero

Albero generico e BFS

Albero binario di ricerca

Albero binario di ricerca - Operazioni

Albero binario di ricerca - Operazioni

Grafo