Il concetto di Algoritmo.
I numeri di Fibonacci. Formula analitica ed errori numerici. Algoritmo
ricorsivo. Alberi binari e alberi di ricorsione. Complessità dell'algoritmo
ricorsivo per i numeri di Fibonacci. Gli algoritmi esponenziali. Algoritmo
iterativo per calcolare i numeri di Fibonacci. Algoritmo ottimo basato su
moltiplicazione di matrici.
Notazione Asintotica. Notazione Theta grande, O grande, Omega grande.
Notazione o e omega piccolo.
Equazioni di ricorrenza. Metodo si sostituzione e metodo iterativo per
risolvere le ricorrenze. Metodo dell'albero di ricorsione e metodo principale.
Il problema della Torri di Hanoi: soluzione ricorsiva e complessità.
Introduzione alla teoria delle probabilità. Le interpretazioni della probabilità:
combinatoria, oggettiva e soggettiva. Lo spazio campionario e i vettori di
probabilità. Incompatibilità, indipendenza, probabilità condizionate. Speranza
matematica.
Introduzione alla teoria dei grafi.
Algoritmi di Ordinamento
Insertion-Sort. Invarianti di ciclo e correttezza di Insertion-Sort. Complessità di
Insertion-Sort.
Il paradigma divide et impera. Merge-sort. Correttezza di Merge-Sort e
Merge. Albero di ricorsione di Merge-Sort e complessità. L'equazione di
ricorrenza per Merge-Sort.
Selection-Sort. Le heap: definizione, rappresentazione mediante array,
heapify. Costruzione di una heap: correttezza e complessità. HeapSort:
correttezza e complessità. Code di max e min priorità e loro implementazione
mediante heap.
QuickSort. La procedura Partition: correttezza e complessità. Complessità di
QuickSort nel caso peggiore. Intuizioni sulla complessità media di QuickSort.
Analisi formale della complessità media. Randomized-QuickSort.
Limite inferiore alla complessità dell'ordinamento basato su confronti
mediante alberi di decisione.
Counting-Sort: complessità e properità di stabilità.
Radix-Sort: correttezza e complessità.
Il problema della selezione. Randomized-Select: calcolo della complessità
media.
Strutture Dati
Strutture dati per insiemi dinamici. Interfaccia e implementazione. Pile, code,
liste concatenate (inserimento, cancellazione e ricerca). Liste circolari con
sentinella.
Tabelle ad indirizzamento aperto, tabelle di hash. Risoluzione delle collisioni
per concatenazione. Analisi della complessità media della ricerca con
successo ed insuccesso nell'ipotesi di uniformità semplice. Funzioni di hash:
metodo di divisione, moltiplicazione e hashing universale. Risoluzione delle
collisioni per indirizzamento aperto. Scansione lineare e double hashing.
Alberi binari di ricerca. Propriet à fondamentale, ricerca di una chiave, ricerca
del minimo, del massimo, del successore e del predecessore. Inserimento di
un nuovo nodo. Cancellazione di un nodo.
Alberi AVL. Fattore di bilanciamento. Alberi di Fibonacci e altezza logaritmica
degli alberi AVL. Rotazione destra e sinistra. Schemi di rotazione per
ripristinare il bilanciamento. Inserimento e cancellazione di nuovi nodi,
mantenendo la proprietà di bilanciamento.
Strutture dati union-find. Alberi quick-find. Alberi quick-union. Euristica di
bilanciamento per alberi quick-find e quick-union con analisi della
complessità. Euristica di compressione dei cammini per alberi quick-union.
Algoritmi su grafi
Richiami di teoria dei grafi. Cammini, cammini minimi, distanze tra vertici.
Rappresentazione di grafi mediante liste e matrici di adiacenza.
Visita in ampiezza, complessità. Correttezza della visita in ampiezza per il
calcolo dei cammini minimi e delle distanze.
Visita in profondità. Complessità. Lemma delle parentesi e teorema del
cammino bianco. Classificazione degli archi.
Applicazioni della visita in profondità: ordinamento Topologico e algortimo di
Tarjan per le componenti fortemente connesse.
Introduzione alla programmazione dinamica. Calcolo della distanza di
Levenhstein tra due stringhe
Alberi ricoprenti minimi. Regola del taglio e regola del ciclo. Schema generale
greedy e correttezza. Algoritmi per alberi ricoprenti minimi: algoritmo di
Kruskal e algoritmo di Prim. Complessità e correttezza.
Cammini minimi in un grafo orientato e pesato. Proprietà dei cammini minimi.
Algoritmo di Dijkstra. Complessità e correttezza. Cammini minimi tra tutte le
coppie di vertici. Algoritmo di Floyd-Warshall.