Progettazione di Algoritmi
Professore:
Paul Wollan Giacomo Paesani: sito per l'esercitazione giovedì 10:30 - 12:00
Viale Regina Elena 295,
ufficio G28
Orario delle lezioni:
martedì 17:00 - 19:00 - 16:00 in Aula 2, Edificio Caglioti
mercoledì 14:00 - 16:00 in Aula 3 Fisica, Edificio Fermi
giovedì 16:00 - 19:00 in Aula 2, Edificio Caglioti
Gli appunti per le lezioni si trovano qui.
Lezione 1: Definizioni: Grafo, nodi e vertici, archi e lati, grado di un nodo, grafi diretti, vertice incidente ad un arco, vertici adiacenti, passeggiata in un grafo, passeggiata Euleriano, matrice di adiacenze, lista di adiacenze. Problema: algoritmo per trovare un ciclo in un grafo con grado minimo 2. Lezione 2: Proposizione: se esiste una passeggiata collegando due vertici, allora esista un cammino collegando i vertici. Definizioni: Grafi connessi, ricerca in profondità (DFS). Algoritmo per il DFS con la dimostrazione di correttezza. Lezione 3: Definizioni: albero di visita, arborescenza di visita, ordine topologiche di un grafo diretto aciclico. Proposizione: Ogni grafo diretto aciclico ha un vertice senza archi entranti. Algoritmo O(n3) per trovare un ordine topologiche di un grafo aciclico. Definizioni: Tempo di visita e tempo di chiusura di un vertice in un DFS. Archi in avanti, archi al indietro, e archi di attraversamenti. Lezione 4: Definizioni: Tempo di visita e tempo di chiusura di un vertice in un DFS. Archi in avanti, archi al indietro, e archi di attraversamenti. Proposizione: Un grafo connesso/fortemente connesso ha cicli se e solo se esiste un arco al indietro per un DFS. Lezione 5: Esercitazioni. Problemi. Lezione 6: Algoritmo O(n+m) per trovare un ordine topologiche con dimostrazione di correttezza. Definizioni: ponti in un grafo. Algoritmo O(n(n+m)) per trovare tutti i ponti in un grafo non-diretto. Proposizione: Un arco xy nel albero di visita T di un grafo non-diretto e un ponte se e solo se non esiste un arco collegando i due componenti di T-xy. Algoritmo O(n+m) per trovare tutti i ponti in un grafo non-diretto. Lezione 7: Definizioni: componente fortemente connesso, c-radice, contrazione di un sotto insieme di vertici, G/X. Proposizione: G un grafo diretto, u un vertice. G è fortemente connesso se e solo se for all vertici x esiste un cammino diretto da u ad x e da x ad u. Proposizione: G un grafo diretto, H un sottografo di G fortemente connesso. Allora G/V(H) é fortemente connesso. Algoritmo O(n(n+m)) per trovare i componenti fortemente connessi in un grafo diretto. Proposizione: Un arco xy nel albero di visita T di un grafo non-diretto e un ponte se e solo se non esiste un arco collegando i due componenti di T-xy. Lezione 8: Algoritmo O(n+m) per trovare i componenti fortemente connessi in un grafo diretto, dato un subroutine per riconoscere le c-radice. Proposizione: Un nodo u non é un c-radice se e solo se nella chiamata ricorsiva del DFS_SCC con radice u viene attraversato un arco (v,w) tale che w é stato già visitata ma il componente di w non é stato ancora determinato. Algoritmo O(n+m) per trovare i componenti fortemente connessi in un grafo diretto. Lezione 9: Esercitazioni. Problemi. Lezione 10: Definizioni: distanza in un grafo. Definizioni: Breadth-first search. Algoritmo O(n+m) per effettuare un BFS con la dimostrazione che DIST contiene le distanze dei vertici dalla radice. Algoritmo O(n+m) contare i numeri ci cammini di lunghezza minima tra due vertici dato in input. Lezione 11: Esercitazioni. Problemi. Lezione 12: Algoritmo O(n+m) per trovare la distanza tra due insieme di vertici. Lezione 13: Definizioni: grafi pesati, distanza in un grafo pesato. Proposizione: Per ogni grafo G con pesi w(e) sugli archi del grafo,
Diario delle lezioni
Algoritmo di Dijkstra per trovare la distanza tra due vertices in un grafo con pesi sugli archi.
Lezione 14:
Esercitazioni.
Lezione 15:
Implementazione di Dijkstra con un heap per realizzare la complessitá di O(log n (n + m))
Algoritmo greedy per trovare un sottoinsieme di intervali disgiunti di cardinalitá massima con la dimostrazione di correttezza.
Lezione 16:
Esercitazioni.
Lezione 17:
Definizioni: albero di copertura di peso minimo (MST).
Algoritmo di Kruskal per trovare il MST con la dimostrazione di correttezza.
Lezione 18:
Algoritmo di Prim per trovare il MST con la dimostrazione di correttezza.
Lezione 19:
Esercitazioni.
Lezione 20:
Discussione del Master Theorem per trovare la formula per la complessità dato una relazione di ricorrenza.
Algoritmo divide et impera per trovare il massimo sottovettore di un array.
Lezione 21:
Esercitazioni.
Lezione 22:
Algoritmo divide et impera per trovare la coppia di punti più vicini nel plano.