PROGRAMMA DETTAGLIATO DEL CORSO DI ALGORITMI (ELEMENTI) DOCENTE: DOTT. ALBERTO LEPORATI TURNO: PES-Z Conoscenze di matematica richieste (prerequisiti): 1. Insiemistica 1.1. Insieme, elemento, sottoinsieme, appartenenza, inclusione 1.2. Operazioni sugli insiemi: unione, intersezione, complemento 1.3. Relazioni e loro proprietà 2. Proprietà di funzioni 2.1. Logaritmi 2.2. Polinomi 2.3. Funzioni esponenziali 2.4. Funzioni fattoriali 2.5. Parte intera superiore (tetto) e inferiore (base): , 3. Limiti di funzioni a una variabile 3.1. Limiti di funzioni logaritmiche 3.2. Limiti di funzioni polinomiali e con radici n-esime 3.3. Limiti di funzioni esponenziali e fattoriali 3.4. Limiti di funzioni composte 3.5. Limiti di rapporti di funzioni 4. Sommatorie 4.1. Serie aritmetica 4.2. Serie geometrica 4.3. Serie armonica 4.4. Manipolazione di sommatorie 5. Metodi di dimostrazione 5.1. Per induzione 5.2. Per assurdo 5.3. Per casi 6. Calcolo della media aritmetica 7. Combinatoria 7.1. Numeri di Fibonacci 7.2. Coefficienti binomiali: definizione e proprietà 7.3. Permutazioni 7.4. Fattoriale 8. Matrici e relative operazioni 9. Aritmetica modulo n (corso di Matematica Discreta) 9.1. Definizioni di modulo e divisione intera (mod e div) 1 9.2. Operazioni modulo n PROGRAMMA DEL CORSO 1. Introduzione 1.1. Presentazione corso, modalità esame (scritto+orale+progettino), prerequisiti 1.2. Nozione di algoritmo 1.3. Esempi di problemi computazionali 1.4. La questione dell'efficienza computazionale 2. Analisi degli algoritmi: un modello formale 2.1. Convenzioni sullo pseudocodice 2.2. Dimensione delle istanze di un problema 2.3. Definizione di tempo e spazio di calcolo 2.4. Caso peggiore, caso migliore e caso medio 3. Algoritmi di ordinamento e loro analisi 3.1. Bubble Sort 3.2. Selection Sort 3.3. Insertion Sort 4. Algoritmi di ricerca e loro analisi 4.1. Ricerca sequenziale (con analisi nel caso medio) 4.2. Ricerca dicotomica (versione iterativa) 5. Algoritmi ricorsivi 5.1. 5.2. 5.3. 5.4. 5.5. La ricorsione: chiamate ricorsive e record di attivazione Algoritmo per il calcolo del fattoriale Algoritmo per il calcolo dei numeri di Fibonacci Ricerca dicotomica ricorsiva Insertion Sort ricorsivo 6. Strumenti matematici per l’analisi degli algoritmi 6.1. 6.2. 6.3. 6.4. Ordini di grandezza delle funzioni Complessità asintotica e notazioni O, W, Q, o e w Complessità polinomiale e superpolinomiale Limiti superiori e inferiori (stretti e non) della complessità di un problema 7. Tecnica divide-et-impera per la progettazione di un algoritmo 7.1. Un esempio: MergeSort 8. Soluzione di equazioni di ricorrenza 8.1. 8.2. 8.3. 8.4. 8.5. Analisi di MergeSort Metodo iterativo Metodo per sostituzione Alberi di ricorsione Metodo principale 2 9. Quicksort 9.1. 9.2. 9.3. 9.4. 9.5. Descrizione dell’algoritmo Selezione del pivot (perno) e procedura PARTITION Analisi del tempo nei casi migliore e peggiore Analisi del tempo nel caso medio QuickSort randomizzato, e sua analisi nel caso medio 10. Ordinamento in tempo lineare 10.1. Limite inferiore per gli algoritmi di ordinamento basati su confronti 10.2. Counting Sort 10.3. Radix Sort 11. Problema della selezione e calcolo del mediano 11.1. Minimo e massimo simultanei 11.2. Selezione in tempo medio lineare 12. Strutture dati 1 12.1. Pile 12.2. Code 12.3. Liste e loro rappresentazione in memoria 13. Strutture dati 2 13.1. Grafi e alberi: definizioni e proprietà 13.2. Relazione tra numero di nodi e altezza di un albero binario 13.3. Rappresentazione di alberi posizionali in memoria: alberi binari, k-ari e rappresentazione figlio-sinistro fratello-destro 14. Alberi binari di ricerca 14.1. Proprietà 14.2. Visita (attraversamento) di un albero binario di ricerca in pre-ordine (ordine anticipato), in inordine (ordine simmetrico) e in post-ordine (ordine posticipato) 14.3. Ricerca di un elemento 14.4. Calcolo del minimo e del massimo elemento in un albero binario di ricerca 14.5. Calcolo del successore e del predecessore di un elemento di un albero binario di ricerca 14.6. Inserimento di un elemento 14.7. Cancellazione di un elemento 15. Strutture dati 3 15.1. Heap: definizioni e proprietà 15.2. Rappresentazione di un albero binario quasi completo in un array 15.3. Costruzione e mantenimento di uno heap: le procedure HEAPIFY e BUILDHEAP 15.4. HEAPSORT, e suo tempo di calcolo 15.5. Code con priorità 16. Tabelle di hash 16.1. Definizione e collisioni 16.2. Tecniche per risolvere le collisioni: liste concatenate, ricerca lineare, ricerca quadratica, doppio hashing 3