Algoritmi e Strutture di Dati

Codice: 20810078

Scheda insegnamento

Anno Accademico di erogazione
2026/2027
Periodo di erogazione
Primo semestre
CFU
9 CFU
Lingua
Italiano
SSD
ING-INF/05

Scopri il programma didattico

Programma, testi adottati e modalità d’esame sono quelli pubblicati dai docenti per l’anno accademico 2026/2027. L’insegnamento è diviso in canali: ogni canale ha il suo programma.

Curriculum
Sistemi informatici
Anno di corso
2
Periodo
Primo semestre
Ore
81
CUIN
260002580

Programma

PARTE 1: Generalità e strumenti.
Definizione di problema computazionale, algoritmo, struttura di dati.
Random Access Machine e pseudocodice.
Studio asintotico delle funzioni (notazioni O-grande, Omega e Theta).
Complessità asintotica degli algoritmi e dei problemi.
Complessità ammortizzata.
Analisi del caso migliore, medio, peggiore.
Ricorsione ed equazioni di ricorrenza.
Teoremi per l'analisi di funzioni ricorsive.

PARTE 2: Tipi astratti di dato.
Tipi astratti di dato e loro rappresentazioni.
Esempi già noti: insiemi, pile, code, liste, ecc.
Gestione telescopica di strutture di dati dinamiche.
Alberi: Alberi binari; Alberi di grado arbitrario; Visite di alberi; Alberi binari di ricerca; Alberi rosso-neri.
Tabelle hash.
Grafi: Rappresentazione con matrici e liste di adiacenza. Visite in ampiezza e profondità. Grafi e connettività. Componenti connesse. Cammini minimi su grafi.

PARTE 3: Paradigmi algoritmici.
Algoritmi greedy (esempio: Ordinamento tramite selection sort).
Algoritmi iterativi (esempio: Ordinamento tramite insertion sort).
Algoritmi divide et impera (esempio: Ordinamento tramite quick-sort).

PARTE 4: Il corso contiene richiami delle seguenti nozioni di Linguaggio C
Programmazione imperativa.
Tipi di dato elementari.
Funzioni.
Puntatori e Array.
Stringhe.
Gestione della memoria: Heap e Stack.
Gestione di progetti in C: prototipi e implementazioni.
Ricorsione e Memoria.
Puntatori e Record.
Gestione dinamica della memoria.

Prerequisiti

Sono prerequisiti di questo corso i concetti di base di un corso di Fondamenti di Informatica qui sotto elencati.
Funzionamento del calcolatore e rappresentazione dell'informazione (architettura del calcolatore, sistemi operativi, aritmetica binaria, compilazione del esecuzione dei programmi).
Fondamenti di programmazione (linguaggi i programmazione, il linguaggio C, variabili, istruzioni, tipi di dato, istruzioni strutturate, stile di programmazione, struttura del programma, funzioni).
Correttezza del software (metodi di test, debug).
Gestione di insiemi di dati (array, stringhe).

Testi adottati

Trasparenze fornite dal docente e scaricabili via via dal sito del corso: https://moodle1.ing.uniroma3.it/
Per scaricare le slides sono neccessarie le credenziali di ateneo.

Bibliografia di riferimento

I seguenti testi sono consigliati esclusivamente agli studenti che non possono seguire le lezioni:

T.H.CORMEN, C.E.LEISERSON, R.L.RIVEST, C.STEIN
INTRODUZIONE AGLI ALGORITMI E STRUTTURE DATI
(TERZA EDIZIONE) MCGRAW-HILL, 2010

B.W.KERNIGHAM, D.M.RITCHIE
IL LINGUAGGIO C, PRINCIPI DI PROGRAMMAZIONE E MANUALE DI RIFERIMENTO (SECONDA EDIZIONE)
PEARSON EDUCATION ITALIA, 2004

Qualsiasi altro testo introduttivo al linguaggio C potrebbe essere equivalente a questo qui sopra.

Modalità di erogazione

Lezioni con proiezione di slides. Esercitazioni in classe con scrittura da parte del docente (con suggerimenti degli studenti) di codice in lingaggio C, compilazione, linking ed esecuzione di programmi.

Modalità di frequenza

Le trasparenze del corso sono abbondantemente commentate allo scopo di rendere possibile la preparazione all'esame anche agli studenti non frequentanti.

Modalità di valutazione

Valutazione in itinere: durante l'erogazione del corso gli studenti verranno invitati a risolvere degli "homework" su Moodle consistenti in domande di teoria e in funzioni da scrivere in linguaggio C. Durante il corso verranno svolte diverse prove intermedie in laboratorio con esercizi analoghi a quelli svolti online negli homework. Le prove intermedie sostituiscono completamente la prova finale.

Prova finale: la prova finale, sia per quanto riguarda la teoria, che per quanto riguarda la sintesi di soluzioni algoritmiche, sarà svolta su Moodle.

Criteri di assegnazione dei voti: La valutazione degli studenti si basa sui descrittori di Dublino e tiene conto del livello di conoscenza, comprensione ed elaborazione critica degli argomenti trattati nel corso. Gli studenti che dimostrano di aver acquisito i concetti fondamentali e di saperli applicare in contesti semplici otterranno una valutazione sufficiente. I voti medi saranno assegnati a coloro che, oltre a padroneggiare le basi, mostrano capacità di analisi e rielaborazione autonoma di concetti più complessi. I voti più alti sono riservati agli studenti che evidenziano una comprensione approfondita, capacità di sintesi, spirito critico e autonomia nel risolvere problemi anche nuovi o non affrontati esplicitamente durante il corso.

Prove previste

  • Prova pratica
  • Prove intermedie

Curriculum
Gestionale
Anno di corso
2
Periodo
Primo semestre
Ore
81
CUIN
260002588

Programma

PARTE 1: Generalità e strumenti.
Definizione di problema computazionale, algoritmo, struttura di dati.
Random Access Machine e pseudocodice.
Studio asintotico delle funzioni (notazioni O-grande, Omega e Theta).
Complessità asintotica degli algoritmi e dei problemi.
Complessità ammortizzata.
Analisi del caso migliore, medio, peggiore.
Ricorsione ed equazioni di ricorrenza.
Teoremi per l'analisi di funzioni ricorsive.

PARTE 2: Tipi astratti di dato.
Tipi astratti di dato e loro rappresentazioni.
Esempi già noti: insiemi, pile, code, liste, ecc.
Gestione telescopica di strutture di dati dinamiche.
Alberi: Alberi binari; Alberi di grado arbitrario; Visite di alberi; Alberi binari di ricerca; Alberi rosso-neri.
Tabelle hash.
Grafi: Rappresentazione con matrici e liste di adiacenza. Visite in ampiezza e profondità. Grafi e connettività. Componenti connesse. Cammini minimi su grafi.

PARTE 3: Paradigmi algoritmici.
Algoritmi greedy (esempio: Ordinamento tramite selection sort).
Algoritmi iterativi (esempio: Ordinamento tramite insertion sort).
Algoritmi divide et impera (esempio: Ordinamento tramite quick-sort).

PARTE 4: Il corso contiene richiami delle seguenti nozioni di Linguaggio C
Programmazione imperativa.
Tipi di dato elementari.
Funzioni.
Puntatori e Array.
Stringhe.
Gestione della memoria: Heap e Stack.
Gestione di progetti in C: prototipi e implementazioni.
Ricorsione e Memoria.
Puntatori e Record.
Gestione dinamica della memoria.

Prerequisiti

Sono prerequisiti di questo corso i concetti di base di un corso di Fondamenti di Informatica qui sotto elencati.
Funzionamento del calcolatore e rappresentazione dell'informazione (architettura del calcolatore, sistemi operativi, aritmetica binaria, compilazione del esecuzione dei programmi).
Fondamenti di programmazione (linguaggi i programmazione, il linguaggio C, variabili, istruzioni, tipi di dato, istruzioni strutturate, stile di programmazione, struttura del programma, funzioni).
Correttezza del software (metodi di test, debug).
Gestione di insiemi di dati (array, stringhe).

Testi adottati

Trasparenze fornite dal docente e scaricabili via via dal sito del corso: https://moodle1.ing.uniroma3.it/
Per scaricare le slides sono neccessarie le credenziali di ateneo.

Bibliografia di riferimento

I seguenti testi sono consigliati esclusivamente agli studenti che non possono seguire le lezioni:

T.H.CORMEN, C.E.LEISERSON, R.L.RIVEST, C.STEIN
INTRODUZIONE AGLI ALGORITMI E STRUTTURE DATI
(TERZA EDIZIONE) MCGRAW-HILL, 2010

B.W.KERNIGHAM, D.M.RITCHIE
IL LINGUAGGIO C, PRINCIPI DI PROGRAMMAZIONE E MANUALE DI RIFERIMENTO (SECONDA EDIZIONE)
PEARSON EDUCATION ITALIA, 2004

Qualsiasi altro testo introduttivo al linguaggio C potrebbe essere equivalente a questo qui sopra.

Modalità di erogazione

Lezioni con proiezione di slides. Esercitazioni in classe con scrittura da parte del docente (con suggerimenti degli studenti) di codice in lingaggio C, compilazione, linking ed esecuzione di programmi.

Modalità di frequenza

Le trasparenze del corso sono abbondantemente commentate allo scopo di rendere possibile la preparazione all'esame anche agli studenti non frequentanti.

Modalità di valutazione

Valutazione in itinere: durante l'erogazione del corso gli studenti verranno invitati a risolvere degli "homework" su Moodle consistenti in domande di teoria e in funzioni da scrivere in linguaggio C. Durante il corso verranno svolte diverse prove intermedie in laboratorio con esercizi analoghi a quelli svolti online negli homework. Le prove intermedie sostituiscono completamente la prova finale.

Prova finale: la prova finale, sia per quanto riguarda la teoria, che per quanto riguarda la sintesi di soluzioni algoritmiche, sarà svolta su Moodle.

Criteri di assegnazione dei voti: La valutazione degli studenti si basa sui descrittori di Dublino e tiene conto del livello di conoscenza, comprensione ed elaborazione critica degli argomenti trattati nel corso. Gli studenti che dimostrano di aver acquisito i concetti fondamentali e di saperli applicare in contesti semplici otterranno una valutazione sufficiente. I voti medi saranno assegnati a coloro che, oltre a padroneggiare le basi, mostrano capacità di analisi e rielaborazione autonoma di concetti più complessi. I voti più alti sono riservati agli studenti che evidenziano una comprensione approfondita, capacità di sintesi, spirito critico e autonomia nel risolvere problemi anche nuovi o non affrontati esplicitamente durante il corso.

Prove previste

  • Prova pratica
  • Prove intermedie

Curriculum
Automazione e Robotica
Anno di corso
2
Periodo
Primo semestre
Ore
81
CUIN
260002596

Programma

PARTE 1: Generalità e strumenti.
Definizione di problema computazionale, algoritmo, struttura di dati.
Random Access Machine e pseudocodice.
Studio asintotico delle funzioni (notazioni O-grande, Omega e Theta).
Complessità asintotica degli algoritmi e dei problemi.
Complessità ammortizzata.
Analisi del caso migliore, medio, peggiore.
Ricorsione ed equazioni di ricorrenza.
Teoremi per l'analisi di funzioni ricorsive.

PARTE 2: Tipi astratti di dato.
Tipi astratti di dato e loro rappresentazioni.
Esempi già noti: insiemi, pile, code, liste, ecc.
Gestione telescopica di strutture di dati dinamiche.
Alberi: Alberi binari; Alberi di grado arbitrario; Visite di alberi; Alberi binari di ricerca; Alberi rosso-neri.
Tabelle hash.
Grafi: Rappresentazione con matrici e liste di adiacenza. Visite in ampiezza e profondità. Grafi e connettività. Componenti connesse. Cammini minimi su grafi.

PARTE 3: Paradigmi algoritmici.
Algoritmi greedy (esempio: Ordinamento tramite selection sort).
Algoritmi iterativi (esempio: Ordinamento tramite insertion sort).
Algoritmi divide et impera (esempio: Ordinamento tramite quick-sort).

PARTE 4: Il corso contiene richiami delle seguenti nozioni di Linguaggio C
Programmazione imperativa.
Tipi di dato elementari.
Funzioni.
Puntatori e Array.
Stringhe.
Gestione della memoria: Heap e Stack.
Gestione di progetti in C: prototipi e implementazioni.
Ricorsione e Memoria.
Puntatori e Record.
Gestione dinamica della memoria.

Prerequisiti

Sono prerequisiti di questo corso i concetti di base di un corso di Fondamenti di Informatica qui sotto elencati.
Funzionamento del calcolatore e rappresentazione dell'informazione (architettura del calcolatore, sistemi operativi, aritmetica binaria, compilazione del esecuzione dei programmi).
Fondamenti di programmazione (linguaggi i programmazione, il linguaggio C, variabili, istruzioni, tipi di dato, istruzioni strutturate, stile di programmazione, struttura del programma, funzioni).
Correttezza del software (metodi di test, debug).
Gestione di insiemi di dati (array, stringhe).

Testi adottati

Trasparenze fornite dal docente e scaricabili via via dal sito del corso: https://moodle1.ing.uniroma3.it/
Per scaricare le slides sono neccessarie le credenziali di ateneo.

Bibliografia di riferimento

I seguenti testi sono consigliati esclusivamente agli studenti che non possono seguire le lezioni:

T.H.CORMEN, C.E.LEISERSON, R.L.RIVEST, C.STEIN
INTRODUZIONE AGLI ALGORITMI E STRUTTURE DATI
(TERZA EDIZIONE) MCGRAW-HILL, 2010

B.W.KERNIGHAM, D.M.RITCHIE
IL LINGUAGGIO C, PRINCIPI DI PROGRAMMAZIONE E MANUALE DI RIFERIMENTO (SECONDA EDIZIONE)
PEARSON EDUCATION ITALIA, 2004

Qualsiasi altro testo introduttivo al linguaggio C potrebbe essere equivalente a questo qui sopra.

Modalità di erogazione

Lezioni con proiezione di slides. Esercitazioni in classe con scrittura da parte del docente (con suggerimenti degli studenti) di codice in lingaggio C, compilazione, linking ed esecuzione di programmi.

Modalità di frequenza

Le trasparenze del corso sono abbondantemente commentate allo scopo di rendere possibile la preparazione all'esame anche agli studenti non frequentanti.

Modalità di valutazione

Valutazione in itinere: durante l'erogazione del corso gli studenti verranno invitati a risolvere degli "homework" su Moodle consistenti in domande di teoria e in funzioni da scrivere in linguaggio C. Durante il corso verranno svolte diverse prove intermedie in laboratorio con esercizi analoghi a quelli svolti online negli homework. Le prove intermedie sostituiscono completamente la prova finale.

Prova finale: la prova finale, sia per quanto riguarda la teoria, che per quanto riguarda la sintesi di soluzioni algoritmiche, sarà svolta su Moodle.

Criteri di assegnazione dei voti: La valutazione degli studenti si basa sui descrittori di Dublino e tiene conto del livello di conoscenza, comprensione ed elaborazione critica degli argomenti trattati nel corso. Gli studenti che dimostrano di aver acquisito i concetti fondamentali e di saperli applicare in contesti semplici otterranno una valutazione sufficiente. I voti medi saranno assegnati a coloro che, oltre a padroneggiare le basi, mostrano capacità di analisi e rielaborazione autonoma di concetti più complessi. I voti più alti sono riservati agli studenti che evidenziano una comprensione approfondita, capacità di sintesi, spirito critico e autonomia nel risolvere problemi anche nuovi o non affrontati esplicitamente durante il corso.

Prove previste

  • Prova pratica
  • Prove intermedie

Curriculum
Intelligenza Artificiale e Machine Learning
Anno di corso
2
Periodo
Primo semestre
Ore
81
CUIN
260002604

Programma

PARTE 1: Generalità e strumenti.
Definizione di problema computazionale, algoritmo, struttura di dati.
Random Access Machine e pseudocodice.
Studio asintotico delle funzioni (notazioni O-grande, Omega e Theta).
Complessità asintotica degli algoritmi e dei problemi.
Complessità ammortizzata.
Analisi del caso migliore, medio, peggiore.
Ricorsione ed equazioni di ricorrenza.
Teoremi per l'analisi di funzioni ricorsive.

PARTE 2: Tipi astratti di dato.
Tipi astratti di dato e loro rappresentazioni.
Esempi già noti: insiemi, pile, code, liste, ecc.
Gestione telescopica di strutture di dati dinamiche.
Alberi: Alberi binari; Alberi di grado arbitrario; Visite di alberi; Alberi binari di ricerca; Alberi rosso-neri.
Tabelle hash.
Grafi: Rappresentazione con matrici e liste di adiacenza. Visite in ampiezza e profondità. Grafi e connettività. Componenti connesse. Cammini minimi su grafi.

PARTE 3: Paradigmi algoritmici.
Algoritmi greedy (esempio: Ordinamento tramite selection sort).
Algoritmi iterativi (esempio: Ordinamento tramite insertion sort).
Algoritmi divide et impera (esempio: Ordinamento tramite quick-sort).

PARTE 4: Il corso contiene richiami delle seguenti nozioni di Linguaggio C
Programmazione imperativa.
Tipi di dato elementari.
Funzioni.
Puntatori e Array.
Stringhe.
Gestione della memoria: Heap e Stack.
Gestione di progetti in C: prototipi e implementazioni.
Ricorsione e Memoria.
Puntatori e Record.
Gestione dinamica della memoria.

Prerequisiti

Sono prerequisiti di questo corso i concetti di base di un corso di Fondamenti di Informatica qui sotto elencati.
Funzionamento del calcolatore e rappresentazione dell'informazione (architettura del calcolatore, sistemi operativi, aritmetica binaria, compilazione del esecuzione dei programmi).
Fondamenti di programmazione (linguaggi i programmazione, il linguaggio C, variabili, istruzioni, tipi di dato, istruzioni strutturate, stile di programmazione, struttura del programma, funzioni).
Correttezza del software (metodi di test, debug).
Gestione di insiemi di dati (array, stringhe).

Testi adottati

Trasparenze fornite dal docente e scaricabili via via dal sito del corso: https://moodle1.ing.uniroma3.it/
Per scaricare le slides sono neccessarie le credenziali di ateneo.

Bibliografia di riferimento

I seguenti testi sono consigliati esclusivamente agli studenti che non possono seguire le lezioni:

T.H.CORMEN, C.E.LEISERSON, R.L.RIVEST, C.STEIN
INTRODUZIONE AGLI ALGORITMI E STRUTTURE DATI
(TERZA EDIZIONE) MCGRAW-HILL, 2010

B.W.KERNIGHAM, D.M.RITCHIE
IL LINGUAGGIO C, PRINCIPI DI PROGRAMMAZIONE E MANUALE DI RIFERIMENTO (SECONDA EDIZIONE)
PEARSON EDUCATION ITALIA, 2004

Qualsiasi altro testo introduttivo al linguaggio C potrebbe essere equivalente a questo qui sopra.

Modalità di erogazione

Lezioni con proiezione di slides. Esercitazioni in classe con scrittura da parte del docente (con suggerimenti degli studenti) di codice in lingaggio C, compilazione, linking ed esecuzione di programmi.

Modalità di frequenza

Le trasparenze del corso sono abbondantemente commentate allo scopo di rendere possibile la preparazione all'esame anche agli studenti non frequentanti.

Modalità di valutazione

Valutazione in itinere: durante l'erogazione del corso gli studenti verranno invitati a risolvere degli "homework" su Moodle consistenti in domande di teoria e in funzioni da scrivere in linguaggio C. Durante il corso verranno svolte diverse prove intermedie in laboratorio con esercizi analoghi a quelli svolti online negli homework. Le prove intermedie sostituiscono completamente la prova finale.

Prova finale: la prova finale, sia per quanto riguarda la teoria, che per quanto riguarda la sintesi di soluzioni algoritmiche, sarà svolta su Moodle.

Criteri di assegnazione dei voti: La valutazione degli studenti si basa sui descrittori di Dublino e tiene conto del livello di conoscenza, comprensione ed elaborazione critica degli argomenti trattati nel corso. Gli studenti che dimostrano di aver acquisito i concetti fondamentali e di saperli applicare in contesti semplici otterranno una valutazione sufficiente. I voti medi saranno assegnati a coloro che, oltre a padroneggiare le basi, mostrano capacità di analisi e rielaborazione autonoma di concetti più complessi. I voti più alti sono riservati agli studenti che evidenziano una comprensione approfondita, capacità di sintesi, spirito critico e autonomia nel risolvere problemi anche nuovi o non affrontati esplicitamente durante il corso.

Prove previste

  • Prova pratica
  • Prove intermedie

Esplora gli obiettivi dell’insegnamento

Ambito disciplinare: Ingegneria informatica

Fornire conoscenze sui metodi di rappresentazione delle principali strutture di dati (pile, code, liste, alberi, grafi) e sugli algoritmi fondamentali per la loro gestione. Esporre gli strumenti formali per la valutazione rigorosa della complessità computazionale degli algoritmi e dei problemi. E' un obiettivo del corso anche l'acquisizione di familiarità con i principali approcci algoritmici (divide et impera, greedy, incrementale) e con i paradigmi di programmazione ricorsivo e iterativo.
Il linguaggio di programmazione utilizzato nel corso è il linguaggio C.

Risultati di apprendimento attesi — Maurizio Patrignani

Al termine del corso, lo studente sarà in grado di:

Conoscenza e comprensione
- Comprendere i concetti fondamentali di problema computazionale, algoritmo e struttura dati.
- Conoscere il modello della Random Access Machine (RAM) e l’uso del pseudocodice per descrivere algoritmi.
- Comprendere e utilizzare le principali notazioni asintotiche (O-grande, Ω, Θ) per la valutazione della complessità.
- Comprendere le nozioni di complessità computazionale nel caso migliore, medio e peggiore, e di complessità ammortizzata.
- Comprendere il ruolo della ricorsione e delle equazioni di ricorrenza nell’analisi degli algoritmi.
- Conoscere i principali tipi astratti di dato (pile, code, liste, insiemi) e le loro implementazioni.
- Conoscere le principali strutture dati dinamiche, incluse alberi binari, alberi di ricerca, alberi rosso-neri, tabelle hash e grafi.
- Comprendere le principali tecniche di visita e manipolazione di alberi e grafi.
- Conoscere i principali paradigmi algoritmici: divide et impera, greedy e algoritmi iterativi.
- Comprendere i concetti fondamentali della programmazione in linguaggio C, inclusi gestione della memoria, puntatori, array e strutture.

Capacità di applicare conoscenza e comprensione
- Analizzare la complessità temporale e spaziale di algoritmi e strutture dati.
- Risolvere equazioni di ricorrenza per stimare la complessità di algoritmi ricorsivi.
- Progettare e implementare strutture dati astratte utilizzando rappresentazioni appropriate.
- Utilizzare correttamente alberi, tabelle hash e grafi per la risoluzione di problemi computazionali.
- Applicare algoritmi di visita (BFS e DFS) per l’analisi di grafi e problemi di connettività.
- Implementare algoritmi fondamentali di ordinamento basati su paradigmi iterativi, greedy e divide et impera.
- Sviluppare programmi in linguaggio C utilizzando correttamente puntatori, gestione della memoria dinamica e strutture dati.
- Tradurre problemi reali in modelli algoritmici e strutture dati appropriate.

Autonomia di giudizio
- Valutare la correttezza e l’efficienza di un algoritmo in termini di complessità computazionale.
- Confrontare diverse strutture dati in base a prestazioni, memoria e facilità di implementazione.
- Scegliere il paradigma algoritmico più appropriato per un dato problema.
- Identificare potenziali errori logici e inefficienze nelle implementazioni in C.

Abilità comunicative
- Utilizzare correttamente la terminologia tecnica relativa ad algoritmi e strutture dati.
- Descrivere algoritmi e strutture dati mediante pseudocodice, diagrammi e analisi formale.
- Comunicare in modo chiaro la complessità e il funzionamento di soluzioni algoritmiche.

Capacità di apprendimento
- Acquisire autonomia nello studio di nuovi algoritmi e strutture dati non trattati nel corso.
- Comprendere documentazione tecnica e letteratura scientifica di base sull’analisi degli algoritmi.
- Sviluppare capacità di astrazione per affrontare problemi computazionali sempre più complessi.

Risultati di apprendimento attesi — Maurizio Patrignani

Al termine del corso, lo studente sarà in grado di:

Conoscenza e comprensione
- Comprendere i concetti fondamentali di problema computazionale, algoritmo e struttura dati.
- Conoscere il modello della Random Access Machine (RAM) e l’uso del pseudocodice per descrivere algoritmi.
- Comprendere e utilizzare le principali notazioni asintotiche (O-grande, Ω, Θ) per la valutazione della complessità.
- Comprendere le nozioni di complessità computazionale nel caso migliore, medio e peggiore, e di complessità ammortizzata.
- Comprendere il ruolo della ricorsione e delle equazioni di ricorrenza nell’analisi degli algoritmi.
- Conoscere i principali tipi astratti di dato (pile, code, liste, insiemi) e le loro implementazioni.
- Conoscere le principali strutture dati dinamiche, incluse alberi binari, alberi di ricerca, alberi rosso-neri, tabelle hash e grafi.
- Comprendere le principali tecniche di visita e manipolazione di alberi e grafi.
- Conoscere i principali paradigmi algoritmici: divide et impera, greedy e algoritmi iterativi.
- Comprendere i concetti fondamentali della programmazione in linguaggio C, inclusi gestione della memoria, puntatori, array e strutture.

Capacità di applicare conoscenza e comprensione
- Analizzare la complessità temporale e spaziale di algoritmi e strutture dati.
- Risolvere equazioni di ricorrenza per stimare la complessità di algoritmi ricorsivi.
- Progettare e implementare strutture dati astratte utilizzando rappresentazioni appropriate.
- Utilizzare correttamente alberi, tabelle hash e grafi per la risoluzione di problemi computazionali.
- Applicare algoritmi di visita (BFS e DFS) per l’analisi di grafi e problemi di connettività.
- Implementare algoritmi fondamentali di ordinamento basati su paradigmi iterativi, greedy e divide et impera.
- Sviluppare programmi in linguaggio C utilizzando correttamente puntatori, gestione della memoria dinamica e strutture dati.
- Tradurre problemi reali in modelli algoritmici e strutture dati appropriate.

Autonomia di giudizio
- Valutare la correttezza e l’efficienza di un algoritmo in termini di complessità computazionale.
- Confrontare diverse strutture dati in base a prestazioni, memoria e facilità di implementazione.
- Scegliere il paradigma algoritmico più appropriato per un dato problema.
- Identificare potenziali errori logici e inefficienze nelle implementazioni in C.

Abilità comunicative
- Utilizzare correttamente la terminologia tecnica relativa ad algoritmi e strutture dati.
- Descrivere algoritmi e strutture dati mediante pseudocodice, diagrammi e analisi formale.
- Comunicare in modo chiaro la complessità e il funzionamento di soluzioni algoritmiche.

Capacità di apprendimento
- Acquisire autonomia nello studio di nuovi algoritmi e strutture dati non trattati nel corso.
- Comprendere documentazione tecnica e letteratura scientifica di base sull’analisi degli algoritmi.
- Sviluppare capacità di astrazione per affrontare problemi computazionali sempre più complessi.

Risultati di apprendimento attesi — Maurizio Patrignani

Al termine del corso, lo studente sarà in grado di:

Conoscenza e comprensione
- Comprendere i concetti fondamentali di problema computazionale, algoritmo e struttura dati.
- Conoscere il modello della Random Access Machine (RAM) e l’uso del pseudocodice per descrivere algoritmi.
- Comprendere e utilizzare le principali notazioni asintotiche (O-grande, Ω, Θ) per la valutazione della complessità.
- Comprendere le nozioni di complessità computazionale nel caso migliore, medio e peggiore, e di complessità ammortizzata.
- Comprendere il ruolo della ricorsione e delle equazioni di ricorrenza nell’analisi degli algoritmi.
- Conoscere i principali tipi astratti di dato (pile, code, liste, insiemi) e le loro implementazioni.
- Conoscere le principali strutture dati dinamiche, incluse alberi binari, alberi di ricerca, alberi rosso-neri, tabelle hash e grafi.
- Comprendere le principali tecniche di visita e manipolazione di alberi e grafi.
- Conoscere i principali paradigmi algoritmici: divide et impera, greedy e algoritmi iterativi.
- Comprendere i concetti fondamentali della programmazione in linguaggio C, inclusi gestione della memoria, puntatori, array e strutture.

Capacità di applicare conoscenza e comprensione
- Analizzare la complessità temporale e spaziale di algoritmi e strutture dati.
- Risolvere equazioni di ricorrenza per stimare la complessità di algoritmi ricorsivi.
- Progettare e implementare strutture dati astratte utilizzando rappresentazioni appropriate.
- Utilizzare correttamente alberi, tabelle hash e grafi per la risoluzione di problemi computazionali.
- Applicare algoritmi di visita (BFS e DFS) per l’analisi di grafi e problemi di connettività.
- Implementare algoritmi fondamentali di ordinamento basati su paradigmi iterativi, greedy e divide et impera.
- Sviluppare programmi in linguaggio C utilizzando correttamente puntatori, gestione della memoria dinamica e strutture dati.
- Tradurre problemi reali in modelli algoritmici e strutture dati appropriate.

Autonomia di giudizio
- Valutare la correttezza e l’efficienza di un algoritmo in termini di complessità computazionale.
- Confrontare diverse strutture dati in base a prestazioni, memoria e facilità di implementazione.
- Scegliere il paradigma algoritmico più appropriato per un dato problema.
- Identificare potenziali errori logici e inefficienze nelle implementazioni in C.

Abilità comunicative
- Utilizzare correttamente la terminologia tecnica relativa ad algoritmi e strutture dati.
- Descrivere algoritmi e strutture dati mediante pseudocodice, diagrammi e analisi formale.
- Comunicare in modo chiaro la complessità e il funzionamento di soluzioni algoritmiche.

Capacità di apprendimento
- Acquisire autonomia nello studio di nuovi algoritmi e strutture dati non trattati nel corso.
- Comprendere documentazione tecnica e letteratura scientifica di base sull’analisi degli algoritmi.
- Sviluppare capacità di astrazione per affrontare problemi computazionali sempre più complessi.

Risultati di apprendimento attesi — Maurizio Patrignani

Al termine del corso, lo studente sarà in grado di:

Conoscenza e comprensione
- Comprendere i concetti fondamentali di problema computazionale, algoritmo e struttura dati.
- Conoscere il modello della Random Access Machine (RAM) e l’uso del pseudocodice per descrivere algoritmi.
- Comprendere e utilizzare le principali notazioni asintotiche (O-grande, Ω, Θ) per la valutazione della complessità.
- Comprendere le nozioni di complessità computazionale nel caso migliore, medio e peggiore, e di complessità ammortizzata.
- Comprendere il ruolo della ricorsione e delle equazioni di ricorrenza nell’analisi degli algoritmi.
- Conoscere i principali tipi astratti di dato (pile, code, liste, insiemi) e le loro implementazioni.
- Conoscere le principali strutture dati dinamiche, incluse alberi binari, alberi di ricerca, alberi rosso-neri, tabelle hash e grafi.
- Comprendere le principali tecniche di visita e manipolazione di alberi e grafi.
- Conoscere i principali paradigmi algoritmici: divide et impera, greedy e algoritmi iterativi.
- Comprendere i concetti fondamentali della programmazione in linguaggio C, inclusi gestione della memoria, puntatori, array e strutture.

Capacità di applicare conoscenza e comprensione
- Analizzare la complessità temporale e spaziale di algoritmi e strutture dati.
- Risolvere equazioni di ricorrenza per stimare la complessità di algoritmi ricorsivi.
- Progettare e implementare strutture dati astratte utilizzando rappresentazioni appropriate.
- Utilizzare correttamente alberi, tabelle hash e grafi per la risoluzione di problemi computazionali.
- Applicare algoritmi di visita (BFS e DFS) per l’analisi di grafi e problemi di connettività.
- Implementare algoritmi fondamentali di ordinamento basati su paradigmi iterativi, greedy e divide et impera.
- Sviluppare programmi in linguaggio C utilizzando correttamente puntatori, gestione della memoria dinamica e strutture dati.
- Tradurre problemi reali in modelli algoritmici e strutture dati appropriate.

Autonomia di giudizio
- Valutare la correttezza e l’efficienza di un algoritmo in termini di complessità computazionale.
- Confrontare diverse strutture dati in base a prestazioni, memoria e facilità di implementazione.
- Scegliere il paradigma algoritmico più appropriato per un dato problema.
- Identificare potenziali errori logici e inefficienze nelle implementazioni in C.

Abilità comunicative
- Utilizzare correttamente la terminologia tecnica relativa ad algoritmi e strutture dati.
- Descrivere algoritmi e strutture dati mediante pseudocodice, diagrammi e analisi formale.
- Comunicare in modo chiaro la complessità e il funzionamento di soluzioni algoritmiche.

Capacità di apprendimento
- Acquisire autonomia nello studio di nuovi algoritmi e strutture dati non trattati nel corso.
- Comprendere documentazione tecnica e letteratura scientifica di base sull’analisi degli algoritmi.
- Sviluppare capacità di astrazione per affrontare problemi computazionali sempre più complessi.

Obiettivi di sostenibilità

  • 8 Lavoro dignitoso e crescita economica

Esempi di domande d’esame

Maurizio Patrignani

Le domande di teoria vertono sul programma del corso. La parte teorica più insidiosa riguarda la notazione asintotica, la complessità degli algoritmi e la complessità dei problemi.
Esempi:
- Cosa vuol dire se una funziona f(n) appartiene ad O-grande di g(n)? Fai un esempio con due funzioni f(n) e g(n) di tua scelta.
- E' possibile che un problema che appartiene a Theta(n) abbia un algoritmo risolutore che appartiene a Theta(n^2)?
- Supponi che un problema appartenga da Omega(n^2). E' possibile che esista un algoritmo che lo risolve che appartiene ad Omega(n)?
- Parlami dell'algoritmo di ordinamento Quick-sort

Maurizio Patrignani

Le domande di teoria vertono sul programma del corso. La parte teorica più insidiosa riguarda la notazione asintotica, la complessità degli algoritmi e la complessità dei problemi.
Esempi:
- Cosa vuol dire se una funziona f(n) appartiene ad O-grande di g(n)? Fai un esempio con due funzioni f(n) e g(n) di tua scelta.
- E' possibile che un problema che appartiene a Theta(n) abbia un algoritmo risolutore che appartiene a Theta(n^2)?
- Supponi che un problema appartenga da Omega(n^2). E' possibile che esista un algoritmo che lo risolve che appartiene ad Omega(n)?
- Parlami dell'algoritmo di ordinamento Quick-sort

Maurizio Patrignani

Le domande di teoria vertono sul programma del corso. La parte teorica più insidiosa riguarda la notazione asintotica, la complessità degli algoritmi e la complessità dei problemi.
Esempi:
- Cosa vuol dire se una funziona f(n) appartiene ad O-grande di g(n)? Fai un esempio con due funzioni f(n) e g(n) di tua scelta.
- E' possibile che un problema che appartiene a Theta(n) abbia un algoritmo risolutore che appartiene a Theta(n^2)?
- Supponi che un problema appartenga da Omega(n^2). E' possibile che esista un algoritmo che lo risolve che appartiene ad Omega(n)?
- Parlami dell'algoritmo di ordinamento Quick-sort

Maurizio Patrignani

Le domande di teoria vertono sul programma del corso. La parte teorica più insidiosa riguarda la notazione asintotica, la complessità degli algoritmi e la complessità dei problemi.
Esempi:
- Cosa vuol dire se una funziona f(n) appartiene ad O-grande di g(n)? Fai un esempio con due funzioni f(n) e g(n) di tua scelta.
- E' possibile che un problema che appartiene a Theta(n) abbia un algoritmo risolutore che appartiene a Theta(n^2)?
- Supponi che un problema appartenga da Omega(n^2). E' possibile che esista un algoritmo che lo risolve che appartiene ad Omega(n)?
- Parlami dell'algoritmo di ordinamento Quick-sort

Il corso in cui è erogato questo insegnamento

API