Algoritmi e strutture dati

Docente: Luciano Guala'

Comunicazioni

cambio aula esame 24/07/2015

17-07-2015 12:30

Si comunica che l'esame scritto del 24/07/2015 si svolgerà in Aula 2 edificio PP2.


orale ASD (dot. Gualà)

23-02-2015 11:37

Si comunica che l'orale di Algoritmi e Strutture Dati si terrà il giorno mercoledì 25/02 alle ore 10,30 in aula 3A.


rinvio orale ASD 19/02

18-02-2015 18:36

L'orale di ASD di giovedì 19/02 è rinviato alla prossima settimana per impossibilità del docente. La nuova data sarà comunicata a breve con un avviso successivo.


prima lezione dopo pausa natalizia

04-01-2015 13:45

Le lezioni di ASD riprenderanno il giorno mercoledì 7/01/2015.


annullata lezione luned́ 24/11

20-11-2014 22:50

Si comunica che la lezione di Algoritmi e strutture dati (dot. Gualà) di lunedì 24 novembre è annullata causa impegni del docente.


Materiale didattico del corso

15-10-2014 15:03

Tutto il materiale didattico del corso può essere scaricato alla pagina:

 

http://www.mat.uniroma2.it/~guala/ASDL_2014.htm


Lezioni

4903-06-2015

Esercitazione: risoluzione degli esercizi del Problem Set

4801-06-2015

Linear programming e rounding come tecnica per progettare algoritmi approssimanti per problemi NP-hard. Esempio: un algoritmo 2-approssimante per Weighted Vertex Cover

4727-05-2015

Verificare l'ottimalità di una soluzione di un linear program: il problema duale. I giochi a somma zero e la programmazione lineare.

4625-05-2015

Linear programming: interpretazione geometrica del problema. Le variabili slack e risoluzione tramite il simplex method. Cosa succede nel caso in cui il linear program è unbounded. Cenni a come trovare (se esiste) una soluzione feasible da cui far partire l'algoritmo.

4520-05-2015

Esercitazione su Network Flow

4418-05-2015

Il running time dell'algoritmo di Ford e Fulkerson. La variante con capacity scaling per rendere l'algoritmo polinomiale. Cenni ad altri modi di scegliere i cammini aumentanti (massimo bottleneck e visita in ampiezza)

4313-05-2015

Flusso massimo e taglio minimo: dimostrazione dell'ottimalità dell'algoritmo di Ford e Fulkerson.

4211-05-2015

Il problema Max-Flow e l'algoritmo di Ford e Fulkerson: correttezza e cenni sul tempo di completamento.

4106-05-2015

Esercitazione sulla tecnica greedy

4004-05-2015

Dimostrazione dell'ottimalità dell'algoritmo di Huffman. La tecnica greedy per progettare algoritmi approssimanti per problemi NP-hard. Esempio: il problema Load Balancing.

3929-04-2015

Codifiche a lunghezza variabile. Codici prefissi e alberi binari. La codifica di Huffman.

3827-04-2015

Dimostrare l'ottimalità di algoritmi Greedy: la tecnica Exchange Argument. Esempio di applicazione della tecnica all'analisi di un algoritmo per il problema Scheduling to Minimize Lateness.

3722-04-2015

Dimostrare l'ottimalità di algoritmi Greedy: la tecnica Greedy Stays Ahead. Esempio di applicazione della tecnica all'analisi di un algoritmo per il problema Interval Scheduling. Cenni ad alcune varianti del problema: Interval Partitioning e Weighted Interval Scheduling.

3620-04-2015

Correzione degli esercizi 2, 3 e 4 del Problem Set 4.

3515-04-2015

Algoritmo di Prim. Il problema del calcolo dei minimi antenati comuni in un albero. Algoritmo di Tarjan. Esercizio (ordinamenti topologici e programmazione dinamica) (Probl. 6): dato un dag G e due nodi s e t, calcolare in tempo lineare il numero di cammini distinti in G da s a t.

3413-04-2015

Il problema del minimo albero di copertura (minimum spanning tree). Definizione del problema, motivazioni, proprietà fondamentali su cicli e tagli. L'algoritmo di Kruskal. Discussione degli esercizi 1 e 3 del Problem Set 4.

3308-04-2015

Mantenere efficientemente degli insiemi disgiunti: il problema Union-Find. Due approcci: QuickFind e Quick Union. Euristiche per l'operazione di Union. Stato dell'arte sul problema, una complessità che dipende dalla funzione inversa della funzione di Ackermann.

3201-04-2015

Esercitazione. Esercizio uno (Probl. 4): dato grafo G non orientato con pesi positivi sugli archi, e dato un sottoinsieme di k nodi detti centri, partizionare i nodi di G in k insiemi in modo che l'insieme i contenga i nodi che sono più vicini all'i-esimo centro che ad ogni altro. Esercizio due (Probl. 5): dato un grafo orientato G con pesi positivi sugli archi e che ha un sottoinsieme di archi detti blu, trovare il cammino di costo minimo da un certo nodo s a un certo nodo t che usa al più k archi blu.

3130-03-2015

Cammini minimi in grafi pesati: episodio III. Calcolare le distanze fra tutte le coppie di nodi. Algoritmo di Foyd e Warshall e algoritmo di Johson.

3025-03-2015

Cammini minimi in grafi pesati: episodio II. Ancora sul problema del calcolo dei cammini minimi a singola sorgente. Un algoritmo per grafi con pesi negativi (ma non cicli negativi): algoritmo di Bellman e Ford. Usare l'algoritmo di Bellman e Ford per rilevare un ciclo di peso negativo. Trovare i cammini minimi a singola sorgente in un DAG in tempo lineare.

2923-03-2015

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

2818-03-2015

Esercitazione. Primo esercizio (Probl. 1): dato un insieme di esami e un insieme di propedeuticità, progettare un algoritmo che determina quali esami fare in ogni sessione in modo minimizzare il numero di sessioni. Secondo esercizio (Probl. 2): due robot telecomandabili si possono muovere su un grafo; in ogni istante si può sposare lungo un arco solo uno dei due robot e i robot non possono essere troppo vicini fra loro (per motivi di interferenza delle antenne); trovare la sequenza più corta di mosse che spostano i due robot dalle posizioni iniziali a due date posizioni finali. Terzo esercizio (Probl. 3): si vogliono posizionare più monete possibile su un grafo; la mossa che si può fare è mettere una moneta su un nodo libero e (necessariamente) farla scorrere lungo un arco verso un altro nodo libero; trovare un algoritmo che determina la strategia ottima.

2716-03-2015

Usi meno comuni 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.

2611-03-2015

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

2509-03-2015

Teoria dei grafi, problemi su grafi, algoritmi su grafi. Nozioni preliminari. Grafi Euleriani. Il problema della colorazione di un grafo. Un algoritmo greedy per colorare un grafo.

2421-01-2015

Correzione Problem Set 3.

2319-01-2015

Esercitazione sulla programmazione dinamica. Aiutate Homer a mangiare più donut possibile (Es. 11). Dare il resto usando il minimo numero di monete. Il problema del distributore automatico: minimizzare il numero di monete nel dare il resto (Es. 12). Algoritmo greedy (goloso): non sempre funziona. Algoritmo di programmazione dinamica che risolve il problema.

2214-01-2015

Code con priorità. d-Heap, Heap Binomiali, (cenni sugli) Heap di Fibonacci.

2112-01-2015

Discussione soluzione dell'esercizio sul calcolo della sottosequenza crescente più lunga di un vettore. Insieme indipendente di peso massimo di un grafo: un algoritmo polinomiale per trovare un tale insieme indipendente vale un milione di dollari (e la gloria eterna fra gli scienziati). Un algoritmo di programmazione dinamica per calcolare un insieme indipendente di peso massimo di un albero (Es. 9). Esercizio: il Signor Marche va in vacanza fra Roma e Firenze: aiutatelo a spendere il meno possibile (Es. 10).

2007-01-2015

Correzione Problem Set 2.

1917-12-2014

Ancora sulla tecnica della programmazione dinamica. Calcolo della distanza fra due parole. Esercizio: calcolo della sottosequenza crescente più lunga di un vettore (Es. 8): una prima discussione.

1815-12-2014

Tecnica della programmazione dinamica. Un primo problema per vederla all'opera: calcolare un insieme indipendente di peso massimo in un cammino. Principi generali della programmazione dinamica.

1710-12-2014

Esercitazione. Dato un array di n valori reali. Trovare la coppia di indici i e j con i<j che massimizza A[j]-A[i] (Es. 6). Esercizio su albero AVL e "distanza" fra chiavi (Es. 7).

1603-12-2014

Alberi AVL: definizione ed esempi. Alberi di Fibonacci. Dimostrazione della delimitazione superiore dell’altezza di un albero AVL. Operazioni sugli alberi AVL: search, insert, delete.

1501-12-2014

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). Correzione esercizio relativo alla possibilità di usare un vettore posizionale anche per alberi non completi (vedere slide cap. 3).

1426-11-2014

Esercitazione sulle visite di alberi. Ricostruire un albero, dati gli ordini di visita simmetrica e in preordine dei nodi (Problema 3.7 del libro di testo). Dimostrazione che la sequenze di visita in preordine più quella in postordine non sono sufficienti in generale per ricostruire l'albero. Progettazione di un algoritmo che, preso un albero con chiavi e colori (rosso e nero), trova il valore del cammino rosso di tipo nodo-radice di valore massimo (Es 5).

1317-11-2014

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.

1212-11-2014

Esercitazione. Primo 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). Secondo esercizio: dato un vettore A di n bit, progettare un algoritmo che in tempo O(n) trova un indice k tale che il numero di zeri in A[1;k] è uguale al numero di uni in A[k+1,n] (Es. 4).

1110-11-2014

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). Algoritmi veloci per ordinare interi: IntegerSort, BucketSort, RadixSort.

1005-11-2014

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

903-11-2014

Algoritmo di ordinamento 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. Esercizio: dato un vettore ordinato di bit, trovare in tempo O(log k) l'indice k dell'ultimo zero (Es. 3). Discussione Esercizio 4 del secondo problem set.

829-10-2014

Esercitazione. Esercizio: mettere in ordine le funzioni per velocità crescenti. Esercizio: dimostrare o confutare una relazione asintotica (Es. 1). 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) (Es. 2).

727-10-2014

Problema dell’ordinamento. Selection Sort. Insertion Sort: due varianti. Algoritmo di ordinamento MergeSort.

622-10-2014

Equazioni di ricorrenza: uno scenario meno comune. Picture-Hanging Puzzles, ovvero come appendere un quadro in modo perverso arrotolando un corda intorno a dei chiodi in modo tale che, rimuovendo uno qualsiasi dei chiodi, il quadro cada. Soluzione per due chiodi. Soluzione ricorsiva per n chiodi che usa corda esponenzialmente lunga. E soluzione che usa corda di lunghezza polinomiale.

520-10-2014

Teorema Fondamentale delle Ricorrenze (Master). Semplici esempi. Quando non si può applicare. Metodo del cambiamento di variabile. Metodo che usa l’albero della ricorsione.

415-10-2014

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 della sostituzione. Discussione sull'importanza di lavorare sui Problem Set.

313-10-2014

Modello di calcolo RAM. Costi uniformi e logaritmici. Complessità caso peggiore, migliore, 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.

208-10-2014

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.

106-10-2014

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 accademico2014-2015
Crediti12
SettoreINF/01
Anno2
Semestre1-2
PropedeuticitàAnalisi Matematica. Matematica discreta. Programmazione dei calcolatori con laboratorio.

Programma

http://www.mat.uniroma2.it/~guala/ASDL_2014.htm

 

http://www.mat.uniroma2.it/~pasquale/dida/asd15/asd.htm


Testi di riferimento

http://www.mat.uniroma2.it/~guala/ASDL_2014.htm

 

http://www.mat.uniroma2.it/~pasquale/dida/asd15/asd.htm


Ricevimento studenti

Il normale orario di ricevimento nel periodo di svolgimento delle lezioni di questo corso e' il lunedi' dalle 14,45 alle 16,15. (Contattare il docente per email in tutti gli altri casi).

http://www.mat.uniroma2.it/~guala/ASDL_2014.htm


Modalità di esame

Il corso è diviso in due moduli da 6 cfu. Per ogni modulo ci sarà una prova scritta e una prova orale.