Programma del corso (A. A. 2003/2004) Testo adottato: Addison-Wesley R. Sedgewick. Algoritmi in Java. Note * 5.1 - 5.4 significa dal paragrafo 5.1 al paragrafo 5.4, estremi inclusi, e non 5.1 e 5.4 * Il testo si intende integrato dal materiale distribuito dal docente: slide, appunti, esercizi ed esercitazioni svolti dal docente, disponibili on-line 1. Introduzione. Algoritmi e strutture dati: esempi e uso. Tipi astratti. Qualità di algoritmi e strutture dati. - Capitolo 1 (lettura) 2. Efficienza. Efficienza spaziale e temporale. Misura dell’efficienza temporale: obiettivi. Modello di costo RAM. Analisi del caso peggiore e istruzione dominante. Complessità asintotica. Primi esempi: calcolo della complessità di Insertion Sort. Equazioni di ricorrenza. Metodo di sostituzione per la soluzione di equazioni di ricorrenza. Metodo Divide et Impera. Algoritmo Merge Sort e calcolo della sua complessità. - Capitolo 2 fino al par. 2.6 (incluso) - Par. 6.4 - Capitolo 8 fino al par. 8.3 (incluso) - Par. 5.2 (fino al problema delle Torri di Hanoi escluso) - Materiale distribuito dal docente - Esercitazione svolta in laboratorio 3. Tipi di dato astratti e strutture dati elementari. Tipo di dato astratto. Tipi astratti elementari: liste, pile, code. Implementazione di liste, pile e code mediante array e strutture collegate. Generalità sulle classi Java che implementano le liste. - Capitolo 3 (utile lettura di ripasso) - Capitolo 4, introduzione, parr. 4.1-4.2, parr. 4.44.5, 4.7 - Documentazione Java sulle classi LinkedList, ArrayList e Vector - Materiale distribuito dal docente 4. Algoritmi di ordinamento. Selection Sort. Complessità del Selection Sort. Ordinamento di oggetti complessi. Quick Sort. Complessità del Quick Sort nel caso peggiore e nel caso migliore. Alberi di decisione. Limite inferiore alla complessità degli algoritmi di ordinamento basati su confronti. - Capitolo 6, introduzione, parr. 6.1-6.4, 6.6 - Capitolo 7 fino al par. 7.2 (incluso) - Capitolo 8 fino al par. 8.3 (incluso) - Materiale distribuito dal docente 5. Alberi. Tipo astratto albero. Rappresentazione di alberi con strutture collegate. Rappresentazione di alberi in Java. Algoritmi per la visita di alberi. Alberi binari. Rappresentazione di alberi binari. Visita di alberi binari. Rappresentazione di alberi binari con array e con strutture collegate. - Capitolo 5, parr. 5.4-5.7 Per la rappresentazione mediante array: v. implementazione degli Heap - Materiale distribuito dal docente 6. Introduzione ai dizionari. Il tipo astratto dizionario. Implementazione di dizionari con alberi. Alberi binari di ricerca. Definizioni e proprietà. Rappresentazione dei nodi di un albero binario di ricerca. Operazioni sugli alberi binari di ricerca e implementazione di alberi binari di ricerca. Algoritmo di ricerca e sua complessità. Inserimento in un albero binario di ricerca e sua complessità. Cancellazione da un albero binario di ricerca e sua complessità. - Capitolo 12, introduzione e par. 12.1, parr. 12.6, 12.7 (non le dimostrazioni), 12.8, 12.9 (solo cancellazione) - Materiale distribuito dal docente - Esercitazione svolta in laboratorio 7. Dizionari e strutture dati bilanciate. Bilanciamento. Bilanciamento perfetto e bilanciamento in altezza, fattore di bilanciamento. Cenno agli alberi Alberi AVL. Calcolo dell'altezza di alberi bilanciati (binari e k-ari). - Capitolo 13, introduzione - Materiale distribuito dal docente 8. Dizionari su memoria secondaria e alberi B. Dizionari su memoria secondaria. Modello di costo. Btree: definizioni e proprietà. Calcolo dell’altezza di un B-tree nel caso migliore e peggiore. Ricerca in un B-tree. - Capitolo 16, introduzione, par. 16.2, par. 16.3 (solo definizione di albero B, ricerca e proprieta' 16.2) - Materiale distribuito dal docente 9. Hashing. Definizioni. Tabelle hash. Indirizzamento diretto. Funzioni hash perfette. Funzioni hash non perfette e collisioni. Requisiti delle funzioni hash. Tipi di funzioni hash. Risoluzione delle collisioni. Concatenazione e indirizzamento aperto. - Capitolo 14, parr. 14.1, 14.2 (fino alla proprieta' 14.2 esclusa), 14.3 (saltare la proprieta' 14.3), 14.4 fino alla proprieta' 14.4 esclusa, 14.5 fino alla fine di pagina 644 - Materiale distribuito dal docente - Esercitazione svolta in laboratorio 10. Heap. Definizioni e proprietà. Heap minimale e massimale. Operazioni sugli heap. Rappresentazione di heap. Rappresentazione con array. Algoritmi su heap: estrazione del massimo, cancellazione del massimo, inserimento, conversione di una array in un heap. Heap Sort. - Capitolo 9, introduzione, 9.1-9.3, 9.4 fino alla proprieta' 9.6 (esclusa) - Materiale distribuito dal docente 11. Grafi. Definizioni. Rappresentazione di grafi con liste di adiacenza, matrici di incidenza, matrici di adiacenza. Vantaggi e svantaggi delle diverse rappresentazioni. Rappresentazione di grafi in Java. Visita adi un grafo. Visita in profondità e sua implementazione. Visita in ampiezza e sua implementazione. Il problema dei cammini minimi. Proprietà elementari dei cammini minimi. Algoritmo di Dijkstra e sua complessita'. - Capitolo 5, parr. 5.4 e 5.8 - Capitolo aggiuntivo in Inglese messo a disposizione da Pearson's Education - Materiale distribuito dal docente