UNIVERSIDAD NACIONAL DE RIO CUARTO FACULTAD DE CIENCIAS EXACTAS, FÍSICO-QUÍMICAS Y NATURALES DEPARTAMENTO DE COMPUTACION Carreras: Analista en Computación y Profesorado en Ciencias de la Computación (Estructuras de Datos y Algoritmos), Licenciatura en Ciencias de la Computación (Algoritmos I) Plan de Estudio: 1999 Asignaturas: Estructura de Datos y Algoritmos/Algoritmos I Códigos: 3325/3301 Docente Responsable: Dr Pablo Castro Equipo Docente: Lic. Sonia Permigiani, Prof Ernesto Cerdá, Dr. Pablo Ponzio Año Académico: 2015 Régimen de la Asignatura: Cuatrimestral Régimen de Correlatividades: Aprobada Regular Introduccion a la algoritmica y Programación Programación Avanzada Algebra (Algoritmos I) Carga Horaria Total: 112 Teóricas: 4 horas Semanales Semanales Prácticas: 4 Horas semanales Laboratorios:4 Horas Carácter de la Asignatura: Obligatoria Contextualización de la Signatura: La asignatura está en el el segundo año de las carreras citadas, el material abordado en la materia provee las herramientas básicas para poder abordar los cursos más avanzados de computación. Objetivos Propuestos: El objetivo esencial de la materia es lograr que los alumnos se familiaricen con las técnicas más importantes de representación de datos, que comprendan los mecanismos de los lenguajes de programación modernos para su implementación, y sepan identificar los problemas prácticos en los cuales pueden emplearse cada una de las representaciones de datos estudiadas. Un objetivo importante de la asignatura es que los alumnos se familiaricen con los conceptos fundamentales de la programación orientada a objetos, y realicen sus primeras actividades prácticas en relación al diseño y la implementación de programas orientados a objetos. Contenidos Básicos del Programa a Desarrollar: Introducción a la programación orientada a objetos. La noción de tipos abstractos de datos. Revisión de implementaciones clásicas de tipos abstractos de datos estructurados lineales. Listas, pilas y colas, y sus implementaciones clásicas. Medidas de tiempo de ejecución de programas. Análisis de tiempo de ejecución en caso promedio y peor caso. Análisis de tiempo de ejecución de algoritmos iterativos y recursivos. Tipos abstractos de datos más avanzados. El tipo abstracto de datos Grafo. Algoritmos de recorrido/visita de grafos: recorridos "primero en profundidad" y "primero a lo ancho". Implementaciones clásicas de grafos (matrices de adyacencias y listas de adyacencias). Grafos dirigidos y no dirigidos. Grafos con costos. Aplicaciones del tipo abstracto de datos Grafo. Algoritmos clásicos sobre grafos. Cálculo de camino de mínimo costo: Algoritmos de Dijkstra y Floyd. Clausura transitiva: Algoritmo de Warshall. El problema del árbol abarcador de costo mínimo: Algoritmos de Prim y Kruskal. Estructuras de datos avanzadas. Heaps y sus aplicaciones. Fundamentación de los Contenidos: Los contenidos abordados en esta materia son los clásicos abordados en la bibliografía de estrucutras de datos y algoritmos, estos proveen a los alumnos las herramientas básicas que les permitirá construir software de calidad en su vida profesional; así como se enseñarán los conceptos fundamentales para que los alumnos puedan comprender la teoría más avanzada en ciencias de la computación que será necesaria en su vida académica. Las estructuras de datos que son enseñadas proveen una visión amplia de las prácticas de programación existentes en la actualidad y además la teoría de complejidad abordada en la materia permite que los estudiantes incorporen criterios de calidad de software que son fundamentales en la actualidad. Los conceptos abordados son estudiados con un lenguaje orientado a objetos que es muy utilizado en la actualidad, el lenguaje Java. Actividades a Desarrollar: Clases teóricas: 4 horas semanales de clases teóricas, divididas en dos clases de dos horas cada una; en estas clases se les enseña a los estudiantes la teória básica de la materia. Clases práctica: 4 horas semanales de clases prácticas y de laboratorio, estas clases permiten a los estudiantes afianzar los conocimientos teóricos mediante la aplicación de la teória a porblemas medianamente complejos. Laboratorios: 4 horas semanales de laboratorios, en estas clases los estudiantes implementan en lenguajes de programación los conceptos vistos en los teóricos y prácticos. Horarios de Consulta: Cada docente provee horas de consulta adicionales para los prácticos, teóricos y laboratorios, estas son dos horas semanales adicionales. Nómina de Trabajos Practicos. Se realizarán 10 trabajos prácticos para las clases de laboratorios y horas prácticas: Reuso, Encapsulación, Orientación a Objectos, Algebras, Intro.Java, Arboles, Analísis de Tiempo de Ejecución, Sorting, Diccionarios, Grafos, Además se dará a los alumnos un trabajo práctico obligatorio sobre programación, que deberán aprobar para regularizar la materia. Horarios de Clases: Teóricos: Miercoles y Viernes de 14 a 16hs. Practicos: Miercoles de 10 a 12hs, Jueves de 14 a 16hs. Laboratorios: Lunes de 10 a 12hs y Lunes de 14 a 16hs Modalidad de Evaluación: Exámenes parciales. La materia tendrá dos exámenes parciales, cada uno con una recuperación. Los exámenes parciales serán teórico-prácticos, y abarcarán la primera y la segunda mitad de los contenidos de la asignatura, respectivamente. La evaluación del alumnado será complementada con trabajos prácticos obligatorios (ver más abajo). Examen Final. El examen final para alumnos regulares se llevará a cabo mediante evaluación oral, si el número de alumnos evaluados así lo permite. Abarcará la totalidad de los contenidos de la asignatura, verificando que los alumnos hayan adquirido los conocimientos teóricos y puedan aplicarlos en casos concretos en la práctica. Por otra parte, el examen final para alumnos libres estará compuesto por una primera instancia escrita, en la cual se evaluarán las capacidades de los alumnos para construir programas utilizando las técnicas de representación de datos aprendidas en la asignatura. La segunda instancia del examen final para alumnos libres será similar al examen final para alumnos regulares. Programa Analítico Contenidos. Introducción a la programación orientada a objetos. Clases y objetos. Relaciones de agregación y uso. Herencia y polimorfismo. Genericidad. Introducción al diseño orientado a objetos. Conceptos de cohesión y acoplamiento. Principio abierto-cerrado. La noción de tipos abstractos de datos. Representación de datos. Funciones de abstracción e invariantes de representación. Implementación de tipos abstractos de datos en lenguajes orientados a objetos. Especificaciones básicas y jerárquica. Corrección y completitud Revisión de implementaciones clásicas de tipos abstractos de datos estructurados lineales. Listas, pilas y colas, y sus implementaciones clásicas. Comparación de las implementaciones clásicas de tipos abstractos de datos lineales. Medidas de tiempo de ejecución de programas. Análisis de tiempo de ejecución en caso promedio y peor caso. Análisis de tiempo de ejecución de algoritmos iterativos y recursivos. Resolución de ecuaciones de recurrencias. Tasas de crecimiento de funciones de tiempo de ejecución. Análisis empírico del tiempo de ejecución de programas. Tipos abstractos de datos más avanzados. Los tipos abstractos de datos Conjunto y Diccionario. Diccionarios y su implementación. Árboles como estructuras de datos. Recorridos sobre árboles (inorder, preorder, postorder). Árboles binarios de búsqueda. AVLs y árboles 2-3. Comparación de las implementaciones clásicas de diccionarios de acuerdo a la eficiencia de sus operaciones. El tipo abstracto de datos Grafo. Algoritmos de recorrido/visita de grafos: recorridos "primero en profundidad" y "primero a lo ancho". Implementaciones clásicas de grafos (matrices de adyacencias y listas de adyacencias). Grafos dirigidos y no dirigidos. Grafos con costos. Aplicaciones del tipo abstracto de datos Grafo. Algoritmos clásicos sobre grafos. Cálculo de camino de mínimo costo: Algoritmos de Dijkstra y Floyd. Clausura transitiva: Algoritmo de Warshall. El problema del árbol abarcador de costo mínimo: Algoitmos de Prim y Kruskal. Estructuras de datos avanzadas. Heaps y sus aplicaciones. Diagramas binarios de decisión (BDDs) y aplicaciones. Hashing. Cronograma de Clases y Parciales Seman a Fech a 1 19/08 Introducción a /15 la materia 1 21/08 Mecanismos de /15 Reuso 2 26/08 /13 28/08 /15 2/09/ 15 4/09/ 5 2 3 3 4 4 Teóricos Fech a Prácticos Fech a Laboratorios Parciales/Re c 20/08 repaso Encapsulación Prog. OO Prog. OO y Ejemplos. TADs y Algebras 09/09 Algebras /15 11/09 Funciones de /15 Abstracción 5 16/09 Introd. Java /15 5 18/09 Introd. Java /15 6 25/09 Excepciones en /15 Java 6 30/09 Arboles /15 26/08 OO 24/08 OO 27/08 OO 31/08 OO 02/09 Algebras 03/09 07/09 Imp.Algebras 9/09 Intro.Java 10/09 14/09 Java 16/09 Java 17/09 30 Sept. (1er parcial) 8 Oct. (recuperato rio) 7 2/10/ 15 7 7/10/ 15 Arboles (Cont.) 21/09 Ej.Arboles Analisis de tiempo de ejecución 14/10 Big Oh, Big /15 Omega, etc 24/09 Arboles 30/09 8 16/10 Sorting /15 1/10 7/10 8/10 9 21/10 Sorting cont. /15 9 23/10 Diccionarios e /15 implementacion es 28/10 Diccionarios e /15 implementacion es 30/10 Grafos /15 8 10 10 11 4/11/ 15 Algoritmos sobre Grafos 11 6/11/ 15 Algoritmos sobre grafos 12 11/11 Intro. /15 complejidad 12 13/11 Intro. /15 Coplejidad 13 18/11 Estructuras /15 avanzadas (binomial heaps, arboles B*, etc) 20/11 Estruc. /15 Avanzadas 13 14 25/11 Repaso /15 28/09 Analisis de ej. Analisis 05/10 Impl.Sorting 14/10 Anal.Sortin 15/10 g 21/10 Diccionario 22/10 s 19/10 Imp.Diccionari os 28/10 Grafos 29/10 26/10 Imp.Grafos 4 de Nov. Entrega TP 11/11 Alg.Grafos 12/11 Repaso 02/11 Imp.Alg.Grafos 09/11 2 Nov. 2do parcial 6 Nov. 2do rec. Bibliografía Obligatoria: Mark Allen Weiss, " Data Structures and Algorithm Analysis in Java", Addison-Wesley, 2010 T.Cormen, C. Leiserson, R.Rivest. C.Stein, “Introduction to Algorithms”, The MIT Press, 2001. Bibliografía de Consulta: A. Aho, J. Hopcroft y J. Ullman, "Data Structures and Algorithms", Addison-Wesley, 1983. U. Manber, "Introduction to Algorithms: A Creative Approach", Addison-Wesley, 1989. B. Meyer, “Object Oriented Software Construction”, Prentice-Hall, 2000. B. Liskov, “Program Development in Java”, Addison-Wesley, 2000. A. Levitin, "Introduction to the Design and Analysis of Algorithms", Addison-Wesley, 2003.