SAPIENZA Università di Roma

Laurea in Ingegneria dell'Informazione - sede di Latina

Algoritmi e Strutture Dati (6 CFU)

Prof. Fabio Patrizi


Informazioni Generali

Il corso introduce gli algoritmi e le strutture dati utilizzati nella risoluzione di problemi fondamentali, presentando principi e tecniche che ne permettono l'analisi sistematica. L'obiettivo è fornire allo studente gli strumenti per progettare soluzioni algoritmiche corrette ed efficienti ed individuare, in presenza di varie alternative, la soluzione più adatta ad un problema.

Corso impartito dal 23 settembre 2019 al 18 dicembre 2019

Le lezioni si terranno lunedì 15.00-18.00 e mercoledì 10.00-13.00 in aula 5, presso la sede di Latina, in via A. Doria 3

Ricevimento studenti: per appuntamento, inviare un'email.


Programma


News


Materiale Didattico

Libro di Testo

[T1] C. Demetrescu, I. Finocchi, G. F. Italiano: Algoritmi e strutture dati, McGraw-Hill, seconda edizione (sito web)

Slides

Diario delle Lezioni

Settimana Lunedì Mercoledì
23-29/09/2019 Inizio corso. Introduzione agli algoritmi e loro costo. Numeri di Fibonacci.
[T1] 1.1-1.4
Notazione asintotica O-grande, Omega-grande, Theta-grande. Esempi. Limitazione inferiore e superiore al costo di un algoritmo. Teorema sull'andamento asintotico di un polinomio con dimostrazione [Slide e appunti]. Esercizi sulla notazione asintotica [Slide e appunti].
[T1] 1.5 - 1.7, 1.10, 2.1 - 2.2, 2.3.
30/09-6/10/2019 Metodi di analisi (caso peggiore, caso migliore, caso medio). Ricerca sequenziale iterativa: descrizione e analisi. Ricerca binaria iterativa: descrizione e analisi. Soluzione di equazioni di ricorrenza: metodo dell'albero della ricorsione e metodo della sostituzione. Principio di induzione matematica ed esempio di applicazione (formula di Gauss per la somma dei primi n interi) [Slide e appunti].
[T1] 2.4 - 2.5.1, 2.5.2.
Strategia Divide et Impera. Soluzione di equazioni di ricorrenza: teorema Master con dimostrazione. Esempi di applicazione del teorema Master.
[T1] 2.5.3.
7-13/10/2019 Introduzione ai tipi di dato astratto. Il tipo di dato Dizionario, Pila e Coda. Tecniche di rappresentazione dei dati. Implementazioni indicizzate e collegate di Dizionario e Pila. [Slide e appunti]
[T1] Cap.3 fino a 3.2 incluso.
Tipo di dato Albero. Rappresentazioni indicizzate di alberi: vettore dei padri; vettore posizionale. Esercizio d'esame su costo computazionale (17/01/2019, es.2). [T1] 3.3 - 3.3.1 incluso.
14-20/10/2019 Rappresentazioni collegate di alberi: lista di figli; primo figlio e fratello successivo. Visite di alberi: algoritmo di visita generica, con dimostrazione di terminazione, costo e correttezza. Visite di alberi (descrizione, pseudocodice, analisi): in profondità iterativa e ricorsiva, in ampiezza. Esercizi in aula: imnplementazione in C del tipo astratto Dizionario con rappresentazione indicizzata; Conteggio del numero dei nodi di un albero (soluzione ricorsiva).
[T1] 3.3.2.
Il problema dell'ordinamento. L'approccio incrementale. Algoritmi con approccio incrementale (descrizione, pseudocodice, analisi): SelectionSort, InsertionSort, BubbleSort. [T1] 4.2.
21-27/10/2019 Algoritmi con approccio incrementale (descrizione, pseudocodice, analisi): HeapSort. [T1] 4.3. Algoritmi con approccio divide et impera (descrizione, pseudocodice, analisi): MergeSort, QuickSort.
[T1] 4.4 - 4.5.
Dimostrazione del lower bound per ordinamento basato su confronti. Algoritmi di ordinamento di interi (descrizione, pseudocodice, analisi): IntegerSort.
[T1] 4.1, 4.6 (fino a BucketSort escluso).
28/10-03/11/2019 Algoritmi di ordinamento di interi (descrizione, pseudocodice, analisi): BucketSort, RadixSort. Il problema della ricerca. Alberi binari di ricerca (BST). Introduzione agli alberi AVL.
[T1] 4.6, 4.7, 6.1, 6.2 fino a 6.2.1 escluso.
Alberi AVL: analisi della profondità (dimostrazione); rotazioni.
[T1] 6.2.2 e dimostrazione di profondità su appunti e slide.
04-10/11/2019 Alberi AVL: ricerca, inserimento e cancellazione; analisi del costo delle operazioni. Tabelle ad accesso diretto. Introduzione alle hash table: generalità, esempi.
[T1] 6.2.3, 7.1.
Hash table: uniformità semplice, collisioni; risoluzione delle collisioni mediante liste di collisione e indirizzamento aperto; scansione lineare e hashing doppio; costo nel caso peggiore e nel caso medio.
[T1] 7.2, 7.3.
11-17/11/2019 Grafi: generalità e nozioni preliminari. Strutture dati per la rappresentazione di grafi (e costo delle operazioni comuni): lista di archi; liste di adiacenza; liste di incidenza; matrice di adiacenza. Algoritmi di visita di un grafo: generico, in ampiezza, in profondità (iterativo).
[T1] 11.1 - 11.3.
Grafi: visita in profondità ricorsiva; la relazione di raggiungibilità, componenti connesse e fortemente connesse, calcolo delle componenti connesse e fortemente connesse. Visita di grafi non connessi.
[T1] 11.4 - 11.5 (escluso 11.5.2).
18-24/11/2019 Minimo albero ricoprente, definizione e proprietà. Regola del ciclo. Regola del taglio. Algoritmo generico (con dimostrazione di terminazione e correttezza).
capitolo 12, fino a 12.2 (escluso).
Algoritmi per il calcolo del minimo albero ricoprente (descrizione e analisi di complessità): algoritmo di Kruskal; algoritmo di Prim; algoritmo di Borůvka. Cammini minimi: definizione e proprietà. Distanza tra nodi.
[T1] 12.2-12.4, esclusi 12.2.1 e 12.3.1; capitolo 13, fino a 13.1.3 escluso.
25/11 - 1/12/2019 Algoritmo per il calcolo dei cammini minimi a partire dalle distanze tra i nodi (descrizione e analisi). Albero dei cammini minimi. Algoritmo di Bellman e Ford per il calcolo delle distanze (descirizione e analisi).
[T1] 13.1.3 - 13.3.
Ordinamento topologico: definizione e algoritmo per il calcolo (descrizione e analisi). Algoritmo per il calcolo delle distanze in grafi diretti aciclici (descrizione e analisi). Algoritmo di Dijkstra (descrizione e analisi).
[T1] 13.4 - 13.5, escluso 13.5.1.
2-8/12/2019 Esercizi d'esame. Implementazione di tipi astratti (Pila con rappresentazione collegata). Implementazione del tipo astratto Albero (con lista dei figli).
9-15/12/2019 Esercizi d'esame. Esercizi d'esame.
16-22/12/2019 Esercizi d'esame. Fine corso.

Esami

Modalità d'esame

L'esame consiste in una prova scritta della durata di 2 ore, che include esercizi e domande di teoria. Il numero complessivo dei quesiti varia tra 4 e 6, a seconda della difficoltà. Se necessario, il docente potrà convocare gli studenti per una discussione dell'elaborato e per un'evenutale prova orale integrativa.

Appelli d'esame

(Per registrarsi all'esame, consultare InfoStud in prossimità dell'appello d'interesse.)