Algoritmi e strutture dati

Docente: Luciano Guala'

Comunicazioni


Lezioni

4803-06-2025

Riepilogo ragionato degli argomenti del secondo modulo (per guardare le cose in prospettiva). Consigli su come preparare l’esame.

4729-05-2025

Discussione scritto dell’appello del 18/07/2022.

4627-05-2025

Tabelle Hash.

4522-05-2025

Algoritmi di approssimazione. Algoritmo 2-apx per Load Balancing. Un algoritmo migliore: 3/2-apx per Load Balancing. Un algoritmo 2-apx per il problema del k-center.

4420-05-2025

Esercitazione su NP-completezza (riduzioni).

4315-05-2025

Qualche altro esempio di riduzione polinomiale. Super Mario, Peg Solitaire, Tetris.

4213-05-2025

Ancora sull’NP-completezza. Le classi P, NP, EXP. P vs NP. Problemi NP-completi. La classe co-NP.

4108-05-2025

Introduzione all’NP-completezza. Concetto di riduzione polinomiale. Alcune riduzioni polinomiali (Da/a Vertex Cover a/da Independent Set, da Vertex Cover a Set Cover, da 3-SAT a Independent Set.

4006-05-2025

Esercitazione su problemi di flusso. Tre problemi che si possono ridurre a problemi di flusso.

3929-04-2025

Applicazioni del max-flow. Massimo matching su grafi bipartiti. Massimo numero di cammini arco-disgiunti. Image Segmentation. Baseball elimination.

3824-04-2025

Il teorema del max-flow min-cut; Scegliere buoni cammini aumentanti.

3717-04-2025

Il problema del massimo flusso e il problema del minimo taglio. Algoritmo di Ford-Fulkerson.

3610-04-2025

Esercitazione programmazione dinamica.

3508-04-2025

Il problema del calcolo dei cammini minimi a singola sorgente per grafi con pesi negativi: l’algoritmo di Bellman-Ford. Implementazione efficiente.

3403-04-2025

Il problema del sequence alignment/calcolo della edit distance fra due stringe. Un algoritmo di programmazione dinamica di tempo O(mn) e spazio O(mn). Ridurre lo spazio a O(m+n): l’algoritmo di Hirschberg.

3301-04-2025

Esercitazione su programmazione dinamica. Due problemi per fare esperienza di progettazione di algoritmi di programmazione dinamica.

3227-03-2025

Ancora sulla programmazione dinamica. Il problema del Segmented Least Square. Il problema del Knapsack. Algoritmi pseudopolinomiali.

3125-03-2025

Ancora sulla programmazione dinamica. Il problema del weighted Interval Scheduling. Progettare algoritmi di programmazione dinamica ricorsivi: la tecnica della memoization. Ancora un altro esempio di programmazione dinamica all’opera: Il problema della più lunga sottosequenza crescente. Esercizio: House coloring problem.

3020-03-2025

La tecnica della programmazione dinamica. Un primo esempio della tecnica all’opera sul problema dell’Insieme Indipendente di peso massino su un grafo a cammino.

2918-03-2025

Esercitazione sugli algoritmi greedy (si vedano le slide per i dettagli sui due problemi discussi).

2813-03-2025

Ancora sul problema del Minimum Spanning Tree (MST). L’algoritmo di Prim e sua implementazione efficiente (che usa una struttura dati efficiente per una coda con priorità). Un problema apparentemente non collegato con il problema dell’MST: il problema del k-clustering di massimo spacing. Un algoritmo greedy che trova la soluzione ottima: il single-link clustering. Analisi dell’ottimalità dell’algoritmo.

2711-03-2025

Il problema del Minimum Spanning Tree (minino albero ricoprente). Definizione e motivazioni. Proprietà dei tagli e Proprietà dei cicli. L’algoritmo di Kruskal e la sua implementazione efficiente (che usa la struttura dati Union-Find).

2606-03-2025

Il problema del mantenimento di insiemi disgiunti, ovvero il problema di progettare una struttura dati Union-Find. Struttura dati QuickFind con euristica union by size. Analisi ammortizzata per una sequenza arbitraria di n makeset, n-1 union e m find. Struttura dati QuickUnion con euristica union by size. Analisi della complessità temporale. Cenni sull’euristica della compressione dei cammini.

2504-03-2025

Introduzione al modulo 2. Algoritmi greedy. Il problema dell’Interval Scheduling e l’algoritmo greedy che lo risolve. Il problema dell’Interval Partitioning e l’algoritmo greedy che lo risolve.

2408-01-2025

Riepilogo ragionato degli argomenti del primo modulo (per guardare le cose in prospettiva). Consigli su come preparare l’esame.

2307-01-2025

Esercitazione 6. Esercizi di progettazione di algoritmi su grafi.

2218-12-2024

Esercitazione 5. Esercizi di progettazione di algoritmi su grafi.

2117-12-2024

Cammini minimi in grafi pesati. Il problema del calcolo dei cammini minimi a singola sorgente. Un algoritmo veloce quando il grafo ha pesi non negativi: l'algoritmo di Dijkstra.

2011-12-2024

Usi meno scontati della visita DFS. Catalogare per tipo gli archi del grafo. Individuare un ciclo in grafi diretti. Grafi diretti aciclici (DAG) e ordinamento topologico. Usare la visita DFS per trovare un ordinamento topologico di un DAG. Componenti fortemente connesse: un algoritmo lineare per calcolarle.

1910-12-2024

Strutture dati per rappresentare un grafo. Matrice di adiacenza e Liste di adiacenza. Visite di un grafo. Visita in ampiezza (BFS): cammini minimi da una sorgente. Visita in profondità (DFS): uscire da un labirinto.

1804-12-2024

I Grafi (diretti, non diretti, pesati). Nozioni preliminari. Cammini, distanze, diametro. Alberi. Grafi Euleriani. I grafi come linguaggio potente per descrivere scenari e problemi. Esempi di scenari/problematiche descrivibili come grafi/problemi su grafi (reti stradali/di trasporto, reti sociali, reti “delle dipendenze”).

1703-12-2024

Il problema della Coda con priorità. d-Heap, Heap Binomiali, (cenni sugli) Heap di Fibonacci e complessità ammortizzata.

1627-11-2024

Esercitazione 4. Progettare un algoritmo che, dato un vettore ordinato A[1:n] di n bit, trova il numero k di zero presenti in A. Algoritmo con complessità O(log n). Un miglior algoritmo con tempo O(log k). Progettare un algoritmo con complessità lineare che, dato un vettore A[1:n] di n bit, trova l’indice k tale che il numero di zeri in A[1:k] è uguale al numero di uni in A[k+1:n].

1526-11-2024

Il problema del Dizionario: secondo episodio. Alberi AVL: definizione ed esempi. Dimostrazione della delimitazione superiore dell’altezza di un albero AVL (che usa la nozione di albero di Fibonacci). Operazioni sugli alberi AVL: search, insert, delete.

1420-11-2024

Il problema del Dizionario. Alberi binari di ricerca. Definizione. Visita in ordine simmetrico di un BST. Ricerca, inserimento, cancellazione (ricerca del massimo, del minimo, del predecessore e del successore di un nodo).

1319-11-2024

Esercitazione 3. Esercitazione sulle visite di alberi. Progettazione di un algoritmo che, preso un albero con valori e colori (rosso e nero), trova il valore del cammino rosso di tipo nodo-radice di valore massimo. Altro esercizio: progettare un algoritmo che,  preso un albero e in intero h, restituisce il numero di nodi dell'albero di profondità almeno h. Altro esercizio: preso un albero binario con valori, calcola il numero di nodi per cui la somma dei valori degli antenati è uguale alla somma dei valori dei discendenti.

1213-11-2024

Strutture dati elementari: rappresentazioni indicizzate e rappresentazioni collegate. Implementazione di un dizionario con array ordinato/non ordinato e lista ordinata/non ordinata. Rappresentazioni di alberi. Algoritmi di visita di un albero: profondità versione iterativa, profondità versione ricorsiva (preordine, postordine, ordine simmetrico), ampiezza. Algoritmo per calcolare l’altezza di un albero.

1112-11-2024

Esercitazione 2. Primo esercizio: dato un array di n numeri unimodale, progettare un algoritmo con complessità o(n) che trova il massimo e uno con complessità o(n log n) che lo ordina. Secondo esercizio: dato un vettore A di n numeri, progettare un algoritmo che in tempo O(n) trova due indici i e j con i<j che massimizzano A[j]-A[i].

1006-11-2024

Esercitazione 1. Esercizio: dimostrare o confutare una relazione asintotica. Esercizio di progettazione di un algoritmo che, dato un vettore ordinato A di n interi distinti e un valore x, trova (se esistono) due elementi di A che sommano a x. Soluzione banale con complessità quadratica, soluzione di complessità O(n log n) e soluzione con tempo O(n).

905-11-2024

Ancora algoritmi di ordinamento non basati su confronti. Una variante dell’IntegerSort per ordinare n record con chiavi intere: BucketSort. Un algoritmo veloce per ordinare interi “grandi”: il RadixSort. Discussione del seguente esercizio: dato un array di n interi compresi fra 1 e k, costruire in tempo O(n+k) un oracolo (struttura dati) che sia in grado di rispondere in tempo costante a domande del tipo "quanti interi nell'array sono compresi fra a e b?"(Esercizio e soluzioni a fine delle slide sull'IntegerSort).

830-10-2024

Delimitazioni superiori e inferiori di algoritmi e problemi. Un lower bound alla complessità temporale necessaria per ordinare n elementi (per una classe di algoritmi ragionevoli, quelli basati su confronti). Un algoritmo veloce per ordinare interi “piccoli”: IntegerSort.

729-10-2024

Progettare algoritmi efficienti attraverso la progettazione di strutture dati efficienti. Un esempio: l'HeapSort - che ordina in loco n elementi in tempo O(n log n) nel caso peggiore.

623-10-2024

Il Problema dell’ordinamento. Un algoritmo semplice ma inefficiente: il Selection Sort. Un algoritmo migliore: il MergeSort. Un altro algoritmo che usa la tecnica divide et impera: il QuickSort: analisi del caso peggiore, migliore, e intuizioni sul caso medio. Discussione versione randomizzata del QuickSort e differenza fra complessità nel caso medio e tempo atteso di un algoritmo randomizzato.

522-10-2024

Ancora sulle equazioni di ricorrenza. Metodo della sostituzione. Teorema Fondamentale delle Ricorrenze (Master). Semplici esempi. Quando non si può applicare. Metodo del cambiamento di variabile.

416-10-2024

Analisi della complessità nel caso medio: un esempio. Il problema della ricerca di un elemento in un insieme: ricerca sequenziale e ricerca binaria. Equazioni di ricorrenza. Metodo dell’iterazione. Metodo che usa l’albero della ricorsione.

315-10-2024

Modello di calcolo RAM. Costi uniformi e logaritmici. Complessità caso peggiore e caso medio. Notazioni asintotiche: O-grande, Omega-grande, Theta. O-piccolo, Omega-piccolo. Definizioni e semplici esempi. Proprietà. Usare la notazione asintotica nelle analisi della complessità computazionale degli algoritmi.

209-10-2024

Il problema del calcolo dell’n-esimo numero di Fibonacci. Un algoritmo numerico e un algoritmo ricorsivo. Analisi della complessità temporale dell’algoritmo ricorsivo. Un algoritmo iterativo di complessità temporale O(n) e di complessità spaziale O(n) (Fibonacci3). Portare la memoria a O(1): Fibonacci4. Introduzione informale alla notazione asintotica. Algoritmo con complessità O(log n) per il calcolo dell’n-simo numero di Fibonacci. Discussione della complessità spaziale degli algoritmi ricorsivi Fibonacci2 e Fibonacci6.

108-10-2024

Introduzione al corso. Motivazioni e concetti fondamentali. Un primo esempio: il problema di trovare una moneta falsa (più pesante) fra n monete usando una bilancia a due piatti.


Materiale didattico

Informazioni

Anno accademico2024-2025
Crediti12
SettoreINF/01
Anno2
Semestre1-2
PropedeuticitàAnalisi Matematica. Matematica discreta. Programmazione dei calcolatori con laboratorio.

Programma

https://www.mat.uniroma2.it/%7Eguala/ASDL_2024.htm


Testi di riferimento

https://www.mat.uniroma2.it/%7Eguala/ASDL_2024.htm


Ricevimento studenti

https://www.mat.uniroma2.it/%7Eguala/ASDL_2024.htm


Modalità di esame

https://www.mat.uniroma2.it/%7Eguala/ASDL_2024.htm

 

(se vedano le slide della prima lezione del modulo 1)