====== Algoritmos y Estructuras de Datos II ====== ==== Novedades ==== ===== Generalidades ===== ==== Docentes ==== * Teóricos: Daniel Fridlender. * Prácticos: Silvia Pelozo y Alejandro Tiraboschi. * Ayudantes: Martín Becerra. * Laboratorio: Natalia Bidart, Matías Bordese, Diego Dubois y Leonardo Rodríguez. * Ayudantes: Maximiliano Bustos, Luciano Silvi y Milagro Teruel. ==== Horarios ==== * Teóricos: lunes de 9 a 11hs y miércoles de 14 a 16hs, en el aula 17. * Prácticos: lunes de 11 a 13hs y miércoles de 16 a 18hs, en el aula 17. * Laboratorio: martes y jueves de 14 a 18hs. Los martes se dicta clase, se enuncian y evalúan los proyectos, y se atienden consultas. Los jueves también se atienden consultas. ==== Programa ==== * Los contenidos se dividen en tres partes: * Análisis de algoritmos: algoritmos de ordenación, orden de un algoritmo, recurrencias. * Tipos abstractos de datos: tipos concretos versus tipos abstractos, contador, pila, cola, árboles. * Técnicas de programación: algoritmos voraces, divide y vencerás, programación dinámica, backtracking. * {{:algo2:main:algoritmos_y_estructuras_de_datos_ii_2013.doc|Programa de la materia}}. ==== Régimen de aprobación, promoción y regularidad ==== * Parciales: 2. * Fechas preliminares: 29/4/13 y 17/6/13. * Recuperatorio: 24/6/13. El recuperatorio no cuenta para la promoción. * Proyectos del laboratorio: 4. * Fechas preliminares de evaluación de proyectos: 9/4/13, 7/5/13, 28/5/13 y 18/6/13. * Regularidad: aprobando dos parciales (eventualmente recuperando uno de ellos) + aprobando al menos 3 de los 4 proyectos del laboratorio (**uno de ellos debe ser el 4to**). * Promoción: aprobando cada parcial con 6 o más, con promedio total de 7 o más + aprobando cada proyecto del laboratorio con 6 o más. * Examen final: evaluación por escrito de teórico-práctico + resolución de problemas frente a la computadora (1 ó 2 días). * Alumnos libres: ambas partes del examen (teórico y laboratorio) contienen ejercicios adicionales. * Los alumnos que promocionan sólo los parciales o sólo los proyectos del laboratorio serán exceptuados de rendir la parte promocionada **en las mesas de julio-agosto** de 2013, únicamente. ==== Preguntas frecuentes ==== * La regularidad requiere regularidad en el teórico/práctico y en el laboratorio? * Sí: la regularidad de la materia es un AND de la regularidad del teórico/práctico con la regularidad del taller. * Si voy al laboratorio un jueves de 14 a 18hs, ¿tendré a quien consultar mis dudas? * Sí, habrá docentes o ayudantes a quienes podrás consultar. * Si apruebo los parciales pero no los proyectos del laboratorio, ¿deberé resolver ejercicios adicionales en el examen escrito? * Sí, porque vas a rendir como alumno libre. * Si apruebo los proyectos del laboratorio pero no alcanzo a aprobar los parciales, ¿deberé rendir un examen de laboratorio con ejercicios adicionales? * Sí, porque vas a rendir como alumno libre. * El año pasado aprobé los parciales pero no los proyectos del laboratorio, ¿debo rendir los parciales nuevamente durante este año? * Para poder regularizar, sí. * El año pasado aprobé los proyectos del laboratorio pero no alcancé a aprobar los parciales, ¿debo volver a hacer el laboratorio este año? * Para poder regularizar, sí. * ¿Puedo rendir el examen final sin haber hecho el laboratorio? * Sí. Como alumno libre. Pero deberás demostrar suficientes conocimientos de programación durante el examen. * El año pasado regularicé (es decir, estaba inscripto como regular, aprobé los parciales y los proyectos del laboratorio). Quiero volver a cursar este año. ¿Voy a perder la regularidad obtenida el año pasado? * Si te inscribís en la materia automáticamente perdés esa regularidad. Te conviene volver a cursarla sin inscribirte. * En ese caso, ¿qué pasa si este año promociono? * Te inscribís en la primera fecha de exámenes y te pasamos la nota de la promoción. * Tengo condición de regular y promocioné los parciales pero no los proyectos del laboratorio. ¿Debo rendir el escrito también? * En las mesas de julio-agosto 2013, no. Después de esas mesas, sí. * Tengo condición de regular y promocioné los proyectos del laboratorio pero no los parciales. ¿Debo rendir el laboratorio también? * En las mesas de julio-agosto 2013, no. Después de esas mesas, sí. /* ¿Incluso si no regularicé el laboratorio ? Incluso en ese caso. */ /* ¿Incluso si no regularicé el escrito ? Incluso en ese caso. */ ===== Evaluaciones ===== ==== Parciales ==== * Primer {{:algo2:main:2013.04.29.p1.pdf|parcial}}, 29/04/2013. * Segundo {{:algo2:main:2013.06.17.p2.pdf|parcial}}, 17/06/2013. * Primer {{:algo2:main:2013.06.24.r1.pdf|recuperatorio}}, 24/06/2013. * Segundo {{:algo2:main:2013.06.24.r2.pdf|recuperatorio}}, 24/06/2013. ==== Finales ==== * Primer {{:algo2:main:2013.07.03.f1.pdf|final}}, 03/07/2013. * Segundo {{:algo2:main:2013.07.24.f2.pdf|final}}, 24/07/2013. ===== Teórico ===== ==== Horarios ==== Lunes de 9 a 11hs y miércoles de 14 a 16hs, en el aula 17. ==== Bibliografía ==== * Notas de Algoritmos y Estructuras de Datos II. * {{:algo2:main:01.analisis.pdf|}} * {{:algo2:main:02.tiposconcretos.pdf|}} * {{:algo2:main:03.tiposabstractos.pdf|}} * {{:algo2:main:04.implementacioneselementales.pdf|}} * {{:algo2:main:05.listasenlazadas.pdf|}} * {{:algo2:main:06.arbolesbinarios.pdf|}} * {{:algo2:main:07.tecnicasavanzadas.pdf|}} * {{:algo2:main:08.dfs.pdf|}} * Brassard and Bratley, Fundamentals of Algoritmics. * Manber, Introduction to Algorithmics: A Creative Approach. * Bibliografía Complementaria * Cormen, Leiserson, Rivest y Stein, Introduction to Algorithms. * Balcázar, Programación Metódica. * Biggs, Matemática Discreta. * Kaldewaij, Programming: the Derivation of Algorithms. * Blanco, Smith y Barsotti, {{http://www.cs.famaf.unc.edu.ar/~damian/algoritmos1/apunte/main.pdf|Cálculo de Programas}}. * Tutoriales de lenguaje C * {{algo2:cursc.html | En castellano pero básico}} * [[http://www.cs.cf.ac.uk/Dave/C/ | En ingles pero muy completo]] * [[http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html|Manual de referencia en inglés]] \\ This is a reference manual for the C programming language as implemented by the GNU Compiler Collection (GCC). * Otros * {{algo2:main:cookoopvsadt90.pdf|Object-Oriented Programming Versus Abstract Data Types}} ==== Clases ==== * Primera parte: Análisis de Algoritmos. * 11/03/13: Introducción a la materia, análisis de algoritmos (motivación), problema del bibliotecario, ordenación por selección, número de comparaciones, conteo de operaciones, número de intercambios, ordenación por inserción, análisis, mejor caso, peor caso y caso medio. {{:algo2:main:01.ordenacion_elemental_filminas.pdf|}}. Ordenación por selección y por inserción en el sitio {{http://www.sorting-algorithms.com/}}. * 13/03/13: Repaso. Análisis de algoritmos. Ordenación por intercalación. {{:algo2:main:02.ordenacion_intercalacion_filminas.pdf|}}. * 18/03/13: Análisis de la ordenación por intercalación. Ordenación rápida.{{:algo2:main:03.ordenacion_rapida_filminas.pdf|}}. * 20/03/13: Notación O, Omega y Theta. Propiedades elementales. Regla del límite. Jerarquía. Propiedades adicionales. {{:algo2:main:04.notacion_o.pdf|}}. * 25/03/13: Notación O, Omega y Theta. Propiedades. Jerarquía. Algoritmos divide y vencerás. Recurrencias divide y vencerás.{{:algo2:main:05.recurrencias_dyv.pdf|}} * 27/03/13: Recurrencias homogéneas y no homogéneas.{{:algo2:main:06.recurrencias_homogeneas_y_no.pdf|}} * Segunda parte: Estructuras de Datos. * 03/04/13: Tipos de datos. Tipos concretos y tipos abstractos. Tipos concretos: arreglos, listas, tuplas y punteros.{{:algo2:main:07_tipos.pdf|}} * 08/04/13: Tipos abstractos de datos. Paréntesis balanceados, TAD contador. Delimitadores balanceados, TAD pila.{{:algo2:main:08.tads.pdf|}} * 10/04/13: Tipos abstractos de datos. Productor-consumidor. Buffer. TAD cola. TAD cola de prioridades. {{:algo2:main:09.tads.pdf|}} * 15/04/13: Implementaciones elementales. Implementaciones de los TAD contador, pila y cola usando enteros, listas y arreglos. {{:algo2:main:10.implementaciones_elementales.pdf|}}. Pilas y colas en arreglos y demo de factorial en el sitio [[http://www.cs.usfca.edu/~galles/visualization/Algorithms.html|]] * 17/04/13: Implementaciones avanzadas: listas enlazadas. Implementaciones de pilas y colas usando listas enlazadas.{{:algo2:main:11.listas_enlazadas.pdf|}} * 22/04/13: Árboles binarios. Introducción, terminología. Especificación, implementación. Posición. Repaso para el parcial. {{:algo2:main:12.arboles_binarios.pdf|}} * 24/04/13: Repaso. {{:algo2:main:13.repaso.pdf|}} * 29/04/13: 1er parcial. * 06/05/13: Resolución del primer {{:algo2:main:2013.04.29.p1.pdf|parcial}}. Repaso de árboles binarios. Árboles binarios de búsqueda (ABBs). Ejemplos. Definición. TAD diccionario: especificación e implementación utilizando ABBS. {{:algo2:main:14.abb.pdf|}} * 08/05/13: Comentarios sobre errores frecuentes del parcial. Heaps. Ejemplos. Definición. Inserción en un heap. Flotar un elemento. Borrado en un heap. Hundir un elemento. Implementación de un heap en un arreglo. Implementación de cola de prioridades usando heaps. Heapsort. {{:algo2:main:15.heap.pdf|}} * Tercera parte: Algoritmos Avanzados. * 13/05/13: Algoritmos voraces, forma general, problema de la moneda, problema de la mochila. Árboles generadores de costo mínimo. Algoritmo de Prim. {{:algo2:main:16.voraz.pdf|}} * 15/05/13: Algoritmo de Kruskal. Problema union-find. {{:algo2:main:17.voraz.pdf|}} * 20/05/13: Problema del camino de costo mínimo. Algoritmo de Dijkstra. {{:algo2:main:18.dijkstra.pdf|}} * 22/05/13: Repaso de algoritmos voraces. Problema de las ballenas (tomado del práctico). * 27/05/13: Backtracking: problema de la moneda, problema de la mochila. Problema del camino de costo mínimo entre todo par de vértices de un grafo dirigido.{{:algo2:main:19.backtracking.pdf|}} * 29/05/13: Programación dinámica. Problema de la moneda. Problema de la mochila. {{:algo2:main:20.programacion_dinamica.pdf|}} * 03/06/13: Programación dinámica. Algoritmo de Floyd. Recuperación de la solución óptima en el problema de la moneda, de la mochila y algoritmo de Floyd.{{:algo2:main:21.programacion_dinamica.pdf|}} * 05/06/13: Recorrida de grafos: árboles binarios, árboles finitarios, grafos en general. DFS y BFS.{{:algo2:main:22.dfs.pdf|}} * 10/06/13: Repaso: backtracking y dfs, 8 reinas.{{:algo2:main:23.8reinas.pdf|}} Además, un programita en Haskell que genera todas las soluciones al problema de n reinas. {{:algo2:main:reinas.pdf|Para usarlo, cambiale la extensión por .hs}} * 12/06/13: Repaso: algoritmos voraces. {{:algo2:main:24.combustible.pdf|}} * 17/06/13: 2do parcial. * 19/06/13: Repaso: revisión del parcial.{{:algo2:main:25.parcial.pdf|}} * 24/06/13: Recuperatorio. ==== Vínculos interesantes ==== * Algoritmos de ordenación. * {{http://en.wikipedia.org/wiki/Sorting_algorithms | en wikipedia}} * Algunos visualizadores * [[http://www.sorting-algorithms.com/]] * [[http://www.cs.ubc.ca/~harrison/Java/sorting-demo.html]] * [[http://math.hws.edu/TMCM/java/xSortLab/]] * [[http://thomas.baudel.name/Visualisation/VisuTri/]] * Algo-Ritmos * [[http://www.youtube.com/watch?v=XaqR3G_NVoo|Ordenación por intercalación]] * [[http://www.youtube.com/watch?v=kDgvnbUIqT4|Ordenación rápida]] * Notación //O// * {{http://en.wikipedia.org/wiki/O_notation | en wikipedia}} * Visualizador * {{http://rechneronline.de/function-graphs/}} * TADs * Algunos visualizadores * Pilas y colas {{http://www.cs.usfca.edu/~galles/visualization/download.html}} * Árboles binarios {{http://webpages.ull.es/users/jriera/Docencia/AVL/AVL%20tree%20applet.htm|AVL}} ===== Práctico ===== ==== Horarios ==== Lunes de 11 a 13hs y miércoles de 16 a 18hs, en el aula 17. ==== Guías de ejercicios ==== Práctico 1: Análisis de algoritmos {{:algo2:main:2013:practico1.1.pdf|Parte 1}} -- {{:algo2:main:2013:practico1.2.pdf|Parte 2}} {{:algo2:main:2013:practico2.1.pdf|Práctico 2}}: Tipos abstractos de datos {{:algo2:main:2013:practico3.pdf|Práctico 3}}: Tipos abstractos de datos - Árboles {{:algo2:main:2013:practico4.pdf|Práctico 4}}: algoritmos voraces {{:algo2:main:2013:practico5.pdf|Práctico 5}}: backtracking, programación dinámica y recorrido de grafos ==== Notas de parciales ==== Disponibles en [[http://famaf.guarani.unc.edu.ar/|Guarani]]: * Primer parcial ===== Laboratorio ===== Los grupos serán de 2 (dos) personas. Mínimo 2, máximo 2. O sea, 2 :-). El listado completo de grupos y mapeo a profes encargados es: [[algo2:main:2013:grupos|grupos del lab (ordenado por nombre de alumno)]] o [[algo2:main:2013:grupos2|grupos del lab (ordenado por número de grupo)]]. ==== Horarios ==== * Martes 14 a 18 hs: Teórico del taller, evaluación de entregas si corresponde, y consultas. * Jueves 14 a 18 hs: Uso del laboratorio y consultas. Todas las clases son en el laboratorio de computación del 2do piso (aula 28). ==== Clases ==== * Manual para hacer tipos abstractos de datos en C: {{:algo2:main:2013:tads-in-c-howto.pdf}} * Material sobre punteros (las filminas de la charla): {{:algo2:main:2013:pointers.pdf}} * Charla de Makefile: {{:algo2:main:2013:make.pdf}} ==== Proyectos ==== * Proyecto 1: Ordenación, algoritmos elementales y avanzados. * {{:algo2:main:2013:proy01.pdf|Enunciado del proyecto 1}} * {{:algo2:main:2013:sorting-skeleton_0.99.1_2013-03-12.tar.gz|Esqueleto del código a completar (versión 0.99.1)}} * Proyecto 2: Tipos Abstractos de Datos: Diccionario usando Listas Enlazadas. * {{:algo2:main:2013:proy02a.pdf|Enunciado del proyecto 2 - parte A}} * {{:algo2:main:2013:proy02b.pdf|Enunciado del proyecto 2 - parte B}} * {{:algo2:main:2013:dictionary-skeleton-amd64_1.0_2013-04-09.tar.gz|Esqueleto del código a completar (para arquitecturas de 64 bits, versión 1.0)}} * {{:algo2:main:2013:dictionary-skeleton-i386_1.0_2013-04-09.tar.gz|Esqueleto del código a completar (para arquitecturas de 32 bits, versión 1.0)}} * {{:algo2:main:2013:dictionary-skeleton-mac_1.0_2013-04-11.tar.gz|Esqueleto del código a completar (para arquitecturas Mac de 64 bits, versión 1.0)}} * Proyecto 3: Tipos Abstractos de Datos: Diccionario usando Árboles Binarios de Búsqueda. * {{:algo2:main:2013:proy03.pdf|Enunciado del proyecto 3}} * Proyecto 4: Algoritmo de Kruskal. * {{:algo2:main:2013:proy04.pdf|Enunciado del proyecto 4}} * {{:algo2:main:2013:kruskal-skeleton_1.0_2013-05-28.tar.gz|TAD graph y helpers (sin código objeto)}} * {{:algo2:main:2013:kruskal-skeleton_1.0_2013-05-28_object_files.tar.gz|Código objeto de heap, priority queue, stack, union find y main - Arquitecturas de 64 bits}} * {{:algo2:main:2013:kruskal-skeleton_1.0_2013-05-30_object_files_32bits.tar.gz|Código objeto de heap, priority queue, stack, union find y main - Arquitecturas de 32 bits}} ===== Instrucciones para inscribirse en la lista de mails ===== Desde el [[http://webmail.famaf.unc.edu.ar/src/login.php|webmail del FaMAF]] enviar un mail a: alualgo2-join@famaf.unc.edu.ar con cualquier subject o cuerpo del mail. Después de enviarlo debe llegar un mail con un link a una página donde donde se deben llenar los datos personales. Todo esto hay que hacerlo desde el [[http://webmail.famaf.unc.edu.ar/|webmail del FaMAF]]. ===== Instrucciones para mandar un mail en la lista de mails ===== Desde el [[http://webmail.famaf.unc.edu.ar/src/login.php|webmail del FaMAF]] enviar un mail a: alualgo2@famaf.unc.edu.ar Tener en cuenta que todos los alumnos y todos los profes reciben los mails de esta lista. === ¡¡ Tener en cuenta !! === Si se cometió un error el sistema enviará un mail avisando. Por lo cual, siempre lea el mail de respuesta a la inscripción y verifique que no hubo un error. Si es así, repita el proceso. Cualquier problema consultar con los administradores del laboratorio.