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.