CORSO DI LABORATORIO DI ALGORITMI E STRUTTURE DATI - A.A. 2005/2006 Programma dettagliato delle lezioni svolte Docente: Giovanna Melideo [email protected] http://www.di.univaq.it/melideo/index-personal.htm 1. Martedì 4 ottobre ore 17 Presentazione del corso. Richiami: Strutture dati elementari (array, strutture, liste). Concetto tipo di dato astratto (ADT). Esempi: un ADT per i punti del piano, un ADT per la gestione di liste. Rif. [1], capp. 3 e 4 - disponibile materiale integrativo online 2. Giovedì 6 ottobre ore 15 Un ADT per la gestione di liste (continuazione) e suo uso per la definizione di alcune funzioni derivate per l'elaborazione delle liste. Definizione alternativa di una interfaccia per l'elaborazione delle liste e esempio di applicazione. Rif. [1], capp. 3 e 4 - disponibile materiale integrativo online 3. Venerdì 7 ottobre ore 11:30 Esercitazione: ordinamento per inserzione di una lista (Insertionsort), svolgimento esercizi vari Disponibile materiale integrativo online 4. Martedì 11 ottobre ore 17 ADT Stack. Interfacce per l'elaborazione di stack e relative implementazioni. Rif. [1], cap. 4 - disponibile materiale integrativo online 5. Giovedì 13 ottobre ore 15 Esercitazione: esempio di client dell'ADT Stack (conversione di un'espressione da forma infissa a forma postfissa e valutazione di un'espressione postfissa). ADT Queue. Interfacce per l'elaborazione di code e relative implementazioni mediante liste concatenate e array (buffer circolare). Rif. [1], cap. 4 - disponibile materiale integrativo online 6. Venerdì 14 ottobre ore 11:30 Alberi: definizioni, proprietà, ADT Btree. Definizione di una interfaccia per l'elaborazione degli alberi binari e esempi di applicazione. Rif. [1], cap. 5 - disponibile materiale integrativo online 7. Martedì 18 ottobre ore 17 Visite di alberi: visite in profondità ricorsive e iterative (prima versione): metodi preorder, inorder, postorder. Rif. [1], cap. 5 - disponibile materiale integrativo online 8. Giovedì 20 ottobre ore 15 Visite di alberi: visite iterative inorder e postorder (seconda versione ) e visita in ampiezza (levelorder) (vedi codice lezione precedente). Esercitazione: svolgimento esercizi vari basati sulle visite degli alberi. Rif. [1], cap. 5 - disponibile materiale integrativo online 9. Venerdì 21 ottobre ore 11:30 Ordinamento di array: metodi elementari (Insertionsort, Selectionsort, Bubblesort). Definizione di una interfaccia per l'ordinamento di array e relativi esempi di applicazione su array di caratteri e array di stringhe. Rif. [1], cap. 6 - disponibile materiale integrativo online 1 10. Giovedì 27 ottobre ore 9:30 Ordinamento di array: Quicksort (implementazioni ricorsiva ed iterativa della versione base), Quicksort con partizionamento a tre vie; Mergesort: merging a due vie e merging astratto sul posto; Mergesort top-down, Mergesort bottom-up. Rif. [1], §§ 7.1--7.3, 7.6, 8.1--8.3, 8.5 - disponibile materiale integrativo online 11. Giovedì 27 ottobre ore 15 Esercitazione: ordinamento di termini di un polinomio. Ordinamento di liste concatenate: Insertionsort, Selectionsort, Mergesort. Tipo puntatore generico void *, funzioni per la manipolazione di blocchi di memoria (memcpy, memmove), ordinamento di array "generici" (avanzato). Rif. [1], §§ 3.4 (programma 3.11), 6.9, 8.7 - disponibile materiale integrativo online 12. Venerdì 28 ottobre ore 11:30 ADT Coda con priorità. Implementazioni elementari. La struttura dati heap: ripristino dei vincoli di uno heap (funzioni FixUp, FixDown), inserimento e cancellazione di elementi. Costruzione top-down e bottom-up di uno heap. Coda con priorità basata su heap. Applicazione: uso delle code con priorità per l'ordinamento di valori. Heapsort. Rif. [1], §§ 9.1--9.4 - disponibile materiale integrativo online 13. Giovedì 3 novembre ore 15 Esercitazione. 14. Venerdì 4 novembre ore 11:30 Esercitazione. Disponibile materiale integrativo online 15. Martedì 15 novembre ore 17 Correzione prova intermedia. ADT Tabella di Simboli (ST): introduzione e discussione sui diversi approcci implementativi. Rif. [1], § 12.1 16. Giovedì 17 novembre ore 15 Alberi binari di ricerca (BST): definizione, ricerca ed inserimento di un elemento (versioni ricorsiva ed iterativa). Rotazioni su BST. Applicazione: uso di BST per ordinamento. Rif. [1], §§ 12.5, 12.8 - disponibile materiale integrativo ondine 17. Venerdì 18 novembre ore 11:30 BST: inserimento di un elemento alla radice, cancellazione di un elemento e unione di BST (vedi codice lezione precedente: rif. BST2.c). Rotazioni doppie in un BST. Rif. [1], §§ 12.8, 12.9 18. Martedì 22 novembre ore 17 Splay BST: inserimento splay in un BST Alberi 2-3-4 top-down. Alberi red-black: 3-nodi e 4-nodi; scomposizione di 4-nodi; algoritmo di inserimento in un BST redblack con rotazioni. Rif. [1], §§ 13.2--13.4 - disponibile materiale integrativo online 19. Giovedì 24 novembre ore 15 Inserimento in un BST red-black con rotazioni. Alberi AVL: definizione della struttura dati; relazione tra BST red-black e alberi AVL ADT ST: esempio di interfaccia per la gestione di ST e relativa implementazione mediante array ordinati; funzioni di ricerca sequenziale, binaria e per interpolazione. Rif. [1], §§ 13.4, 12.3--12.5 - disponibile materiale integrativo online 2 20. Lunedì 28 novembre ore 15 (3h) Grafi: definizioni e rappresentazioni mediante matrice di adiacenza, liste di adiacenza, matrice di incidenza e liste di archi. Definizione di interfacce per la gestione di grafi non etichettati rappresentati mediante liste di adiacenza e matrice di adiacenza. Rif. [1], § 3.7; Rif. [2], § 11.2 - disponibile materiale integrativo online 21. Giovedì 1 dicembre ore 9:30 Visite di grafi. Implementazioni: visita ricorsiva in profondità e visite iterative in ampiezza ed in profondità. Rif. [1], § 5.8 - disponibile materiale integrativo online 22. Giovedì 1 dicembre ore 15 Esercitazione: albero dei cammini minimi in grafi non etichettati (vedi codice lezione precedente); soluzione di alcuni esercizi sui grafi. Grafi etichettati. Albero dei cammini minimi in grafi etichettati (approccio Dijkstra). Disponibile materiale integrativo online 23. Lunedì 5 dicembre ore 15 (3h) Union-Find: Algoritmi Quick-Find e Quick-Union. Euristiche: bilanciamento nell'operazione Union (Union by rank e Union by size) e compressione nell'operazione Find (Find by compression e Find by splitting) . Applicazioni: verifica della connessione di un grafo non orientato; implementazione algoritmo di Kruskal per la ricerca del minimo albero ricoprente in un grafo non orientato etichettato. Rif. [1] §1.3, [2] cap.9 - disponibile materiale integrativo online 24. Martedì 6 dicembre ore 17 Esercitazione. Legenda: testi di riferimento [1] "Algoritmi in C", terza ed., di Robert Sedgewick, edito da Addison-Wesley, 2002. [2] "Algoritmi e strutture dati", C. Demetrescu, I. Finocchi, G.F. Italiano, edito da MacGraw Hill. 3