====== Algoritmos y Estructuras de Datos II ====== ==== Novedades ==== ===== Generalidades ===== ==== Docentes ==== * Teóricos: Daniel Fridlender. * Prácticos: Beta Ziliani, Demetrio Vilela, Emmanuel Gunther y Leandro Ramos. * Laboratorio: Diego Dubois, Gonzalo Peralta, Jorge Rafael, Leonardo Rodríguez y Santiago Ávalos. * Ayudantes: Erik Canto Torres, Franco Margaria y Mariano Schmidt. ==== 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, en el aula 28 (lab). Los martes se dicta clase, se enuncian y evalúan los proyectos, y se atienden consultas. Los jueves se atienden consultas. ==== Objetivos ==== Se pretende que el alumno adquiera: * capacidad para comprender y describir el problema que resuelve un algoritmo (el “qué”) y diferenciarlo de la manera en que lo resuelve (el “cómo”), * capacidad para analizar algoritmos, compararlos según su eficiencia en tiempo y en espacio, * capacidad y hábito de identificar abstracciones relevantes al abordar un problema computacional, * familiaridad con técnicas de diseño de algoritmos de uso frecuente, * familiaridad con la programación (en el lenguaje c, entre otros) de algoritmos y estructuras de datos, * familiaridad con la utilización de diversos niveles de abstracción y lenguajes de programación. ==== 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. * En {{:algo2:main:algoritmos_y_estructuras_de_datos_ii_2015.doc|Programa de la materia}} se encuentra una descripción detallada de los contenidos, como así también de los objetivos de la materia, modalidad de evaluación, etc. ==== Régimen de aprobación, promoción y regularidad ==== * Parciales: 2. * Fechas: 22/04/2015, 17/06/2015. * Recuperatorio: 24/06/2015. El recuperatorio no cuenta para la promoción. * Proyectos del laboratorio: 4. * Fechas preliminares de evaluación de proyectos: 26/03, **a completar**. * 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 regulares 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 2015, ú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 2015, 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 2015, 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 ==== * {{:algo2:main:p1.2015.04.22.pdf|Primer parcial}}, 22/04/2015. * {{:algo2:main:p2.2015.06.17.pdf|Segundo parcial}}, 17/06/2015. * Primer y segundo recuperatorios, 24/06/2015. ==== Finales ==== ===== 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:analisis.pdf|}} * Buscar en la wiki del año pasado. Los insertaré aquí a medida de que los actualice. /* * {{: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. * 09/03/15: Introducción a la materia, análisis de algoritmos (motivación), problema del bibliotecario, ordenación por selección, número de comparaciones. {{:algo2:main:01.ordenacion_seleccion.pdf|}} * 11/03/15: Conteo de operaciones, número de intercambios. Ordenación por inserción. análisis, mejor caso, peor caso y caso medio.{{:algo2:main:01b.ordenacion_insercion.pdf|}} * 16/03/15: Ordenación por intercalación. {{:algo2:main:02.ordenacion_intercalacion_filminas.pdf|}}. Ordenación rápida. {{:algo2:main:03.ordenacion_rapida_filminas.pdf|}} * 18/03/15: Demo de los diferentes algoritmos de ordenación vistos. Algoritmos "divide y vencerás". Análisis de la ordenación por intercalación y de la ordenación rápida. {{:algo2:main:04.divide_y_venceras.pdf|}} * 23/03/15: Feriado. * 25/03/15: Notación O, Omega y Theta. Propiedades elementales. Regla del límite. Jerarquía. {{:algo2:main:05.notacion_o.pdf|}} * 30/03/15: Jerarquía, propiedades especiales. Algoritmos divide y vencerás. Recurrencias divide y vencerás. Búsqueda binaria. {{:algo2:main:06.recurrencias_dyv.pdf|}} * 01/04/15: Recurrencias homogéneas y no homogéneas. {{:algo2:main:07.recurrencias_homogeneas_y_no.pdf|}} * Segunda parte: Estructuras de Datos. * 06/04/15: Tipos concretos de datos versus tipos abstractos de datos. Tipos concretos: arreglos, listas, tuplas y punteros. {{:algo2:main:08.tipos.pdf|}} * 08/04/15: Tipos abstractos de datos. Paréntesis balanceados, {{:algo2:main:tadcontador.tgz|TAD Contador}}. Delimitadores balanceados, {{:algo2:main:tadpila.tgz|TAD Pila}}. {{:algo2:main:09.tads.pdf|}} * 13/04/15: Implementaciones del TAD Contador. Implementaciones naturales y otras. Implementaciones del TAD Pila. Usando listas, arreglos, listas enlazadas. {{:algo2:main:10.implementaciones_contador_pila.pdf|}} * 15/04/15: Buffer. {{:algo2:main:tadcola.tgz|TAD Cola}}. Implementaciones: usando listas (asumiendo que vienen en el lenguaje), discusión sobre el orden de enqueue; usando arreglos ingenuamente, usando arreglos circulares; usando listas enlazadas ingenuamente, usando listas enlazadas con puntero al primero y al último; y con listas enlazadas circulares. {{:algo2:main:11.colas.pdf|}} * 20/04/15: Repaso de TADs y sus implementaciones. * 22/04/15: 1er parcial. * 27/04/15: Ordenación, {{:algo2:main:tadpcola.tgz|TAD cola de prioridades}}. {{:algo2:main:tadarbolbinario.tgz|TAD árbol binario}}. Terminología habitual: de la botánica y de la genealogía. {{:algo2:main:12.arboles_binarios.pdf|}} * 29/04/15: Árboles binarios de búsqueda. TAD Conjunto finito, {{:algo2:main:abb.tgz|implementación con árboles binarios de búsqueda.}} {{:algo2:main:13.abb.pdf|}} * 04/05/15: Heaps. Heaps balanceados. Implementación sobre arreglos. Heapsort. {{:algo2:main:14.heap.pdf|}} * Tercera parte: Algoritmos Avanzados. * 06/05/15: Algoritmos voraces. Forma general. Problema de la moneda. Problema de la mochila. {{:algo2:main:15.voraz.pdf|}} * 11/05/15: Algoritmos voraces. Problema del árbol generador de costo mínimo. Algoritmo de Prim. Algoritmo de Kruskal. Problema Union-Find. {{:algo2:main:16.voraz.pdf|}} * 13/05/15: Algoritmos voraces. Problema del camino de costo mínimo. Algoritmo de Dijkstra. {{:algo2:main:17.dijkstra.pdf|}}. * 18/05/15: Backtracking. Problema de la moneda, simplificación, generalización, variantes. {{:algo2:main:moneda.tgz|}} Problema de la mochila. Problema de los caminos de costo mínimo. {{:algo2:main:caminos.tgz|}} {{:algo2:main:18.backtracking.pdf|}} * 20/05/15: Programación dinámica: Fibonacci, problema de la moneda, problema de la mochila. {{:algo2:main:19.programacion_dinamica.pdf|}}. {{:algo2:main:fibonacci.tgz|}} {{:algo2:main:moneda2.tgz|}} * 27/05/15: Programación dinámica: algoritmo de Floyd. {{:algo2:main:20.programacion_dinamica.pdf|}}. {{:algo2:main:caminos2.tgz|}} * 01/06/15: Recorrida de grafos. Recorrida de árboles binarios, pre-order, in-order, pos-order. Recorrida de árboles finitarios. Recorrida de grafos dirigidos. DFS y BFS. {{:algo2:main:21.dfs.pdf|}} * 03/06/15: Backtracking y DFS. Problema de las 8 reinas. {{:algo2:main:22.8reinas.pdf|}}.{{:algo2:main:reinas.tgz|}} /* * 19/05/14: Backtracking. Problema de la moneda. Casos sin solución voraz. Solución que usa backtracking. Generalización. Recursión. Exploración de todas las posibilidades. {{:algo2:main:18.backtracking.pdf|}} * 21/05/14: Paro (no hay teórico pero sí práctico). Leer por su propia cuenta el apunte y las filminas. Programación Dinámica. Problema de la moneda. Problema de la mochila. {{:algo2:main:19.programacion_dinamica.pdf|}} * 26/05/14: Programación dinámica. Algoritmo de Floyd para el camino de costo mínimo entre todo par de vértices. {{:algo2:main:20.programacion_dinamica.pdf|}} * 28/05/14: Algoritmo de Floyd, cálculo de los caminos. Obtención de las soluciones en los problemas de la moneda y la mochila. * 02/06/14: Recorrida de grafos. {{:algo2:main:21.dfs.pdf|}} * 04/06/14: Backtracking es DFS en un grafo implícito. El problema de n reinas, {{:algo2:main:reinas.hs.gz|(n reinas en Haskell)}}. {{:algo2:main:22.8reinas.pdf|}} * 09/06/14: Repaso de algoritmos voraces {{:algo2:main:23.combustible.pdf|}}. * 11/06/14: Repaso de backtracking {{:algo2:main:reinas.c.gz|(8 reinas en c)}}. * 16/06/14: Repaso de backtracking y programación dinámica. */ ==== Vínculos interesantes ==== * Algoritmos de ordenación. * {{http://en.wikipedia.org/wiki/Sorting_algorithms | en wikipedia}} * Algunos visualizadores * [[http://sorting.at/]] * [[http://www.sorting-algorithms.com/]] * [[https://www.cs.usfca.edu/~galles/visualization/Algorithms.html]] * [[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:practico1.1.pdf|Parte 1}}, {{:algo2:main:practico1.2.pdf|Parte 2}} y {{:algo2:main:practico1.3.pdf|Parte 3}}. * Práctico 2: Estructuras de datos {{:algo2:main:practico2.pdf|Parte 1}} y {{:algo2:main:practico2.2.pdf|Parte 2}}. * Práctico 3: Algoritmos avanzados {{:algo2:main:practico3.1.pdf|Parte 1, algoritmos voraces}}, {{:algo2:main:practico3.2.pdf|Parte 2, backtracking y programación dinámica}} y {{:algo2:main:practico3.3.pdf|DFS, BFS y backtracking.}} /* * Práctico 3: Tipos abstractos de datos - Árboles {{:algo2:main:2013:practico3.pdf|Práctico 3}} * Práctico 4: Algoritmos voraces. {{:algo2:main:2013:practico4.pdf|Práctico 4}} * Práctico 5: Backtracking, programación dinámica y recorrido de grafos. {{:algo2:main:2013:practico5.pdf|Práctico 5}} */ ==== Notas de parciales ==== ===== Laboratorio ===== Los grupos serán de 2 (dos) personas. Mínimo 2, máximo 2. O sea, 2 :-). ==== Horarios ==== * Martes 14 a 18 hs: Teóricos del taller, presentación de enunciados, entregas y evaluación de proyectos, 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). ==== Proyectos ==== * Proyecto 1: Algoritmos de Ordenación * {{:algo2:proy01-09-03-2015.pdf|Enunciado}} * {{:algo2:esqueleto-proyecto01-09-03-15.tar.gz|Esqueleto de Código}} * Proyecto 2: Diccionario con Listas Enlazadas * {{:algo2:enunciado-proy2.pdf|Enunciado}} * {{:algo2:proy2-esqueleto.tar.gz|Esqueleto de código}} * {{:algo2:main:objetos19-04.tar.gz| Versión nueva del código objeto para testear.}} * Proyecto 3: Diccionario con Árboles Binarios de Búsqueda * {{:algo2:main:bst.pdf|Enunciado}} * Proyecto 4: Algoritmo de Kruskal. * {{:algo2:main:kruskal.pdf|Enunciado}} * {{:algo2:main:esqueleto-p4-2015.tar.gz| Esqueleto}} ==== Clases ==== * Repaso de arreglos, estructuras. {{:algo2:ejemplo-estructuras.tar.gz|Código de ejemplo}} * {{:algo2:main:2014:gdb.pdf|GDB - slides}} * {{:algo2:main:punteros2015.odp| Punteros (slides)}} * {{:algo2:main:2014:tads.pdf|Intro a TADs}} * {{:algo2:main:2014:make.pdf|Makefile - slides}} * {{:algo2:main:persona.tar.gz|Ejemplo Makefile + TAD Person}} ==== Sistema de Integración Continua ==== * [[http://jaime.famaf.unc.edu.ar/| Jaime]] /* {{:algo2:main:2014:pointersintro.odp|Intro a punteros - slides}} {{:algo2:main:2014:pointers-tads-in-c.pdf|Punteros - slides}} {{:algo2:main:2014:tads.pdf|Intro a TADs}} {{:algo2:main:2014:gdb.pdf|GDB - slides}} {{:algo2:main:2014:make.pdf|Makefile - slides}} ==== Cómo correr los tests en sus compus ==== Cómo correr los tests de unidad de los proyectos: ver detalle en [[run-tests-proy2-a|este tutorial]]. ==== Jaime ==== A lo largo de este cuatrimestre, las entregas de los proyectos y las entregas de los "parcialitos" van a ser a través de nuestro ayudante, Jaime. Jaime es un ejecutor de tareas muy muy simple. Por cada proyecto, Jaime va a tener disponible un listado de tareas que va a permitir correr una serie de tests sobre el código producido por cada alumno. Para visitar Jaime, ir a http://jaime.no-ip.info/. Es obligatorio tener un usuario, y se va a crear automáticamente un usuario por cada miembro de cada grupo del taller. Por cualquier duda, consultar en la lista de la materia. */ ===== Instrucciones para inscribirse en la lista de mails ===== Tenemos un googlegroup para los alumnos y los docentes en la siguiente dirección: https://groups.google.com/forum/#!forum/ayed2-famaf Para subscribirse, hacer click en "solicitar membresía" (o "subscribe to this group"). Por favor elegir una dirección de mail que lean todos los días y que no tenga restricciones de tamaño. **No** es obligatorio que sea un email de gmail. Las direcciones de hotmail/outlook están particularmente no recomendadas ya que suelen llenarse rápido y no les llegan los correos. **IMPORTANTE 1**: una vez que se subscribieron al grupo, ir a la casilla de mail que usaron y aceptar la invitación. **IMPORTANTE 2**: si ya estaban logueados en gmail, les aparece un diálogo para la subscripción donde tienen que elegir, entre otras cosas, el tipo de envíos de los emails: elegir "todos los emails", como se muestra acá: {{:algo2:main:2014:ayed2-group.png}} ===== Instrucciones para mandar un mail en la lista de mails ===== Para mandar un mail a la lista de la materia, escribir a: ayed2-famaf@googlegroups.com