Algoritmos y Estructuras de Datos
Ir a la
Página de Notas
Novedades
Indice
- Carreras: Ingeniería Informática, Analista en Informática Aplicada
- Extension: Cuatrimestral
- Carga horaria: 90 hs de clases (30 hs teoría / 60 hs práctica)
- Docentes:
- Mario Storti, (mario.storti at gmail.com)
- Juan Marcelo Giménez (jmarcelogimenez at gmail.com)
- Juan Pablo Vidocevich (jpvido at gmail.com)
- Ignacio Sánchez (ijrsanchez at gmail.com )
Programa Analítico
Está accesible la
planificación de la materia.
- Diseño y análisis de algoritmos.
- Conceptos básicos de algoritmos. Ejemplo: Sincronización de acceso a objetos en cálculo distribuido. Introducción básica a grafos. Planteo del problema mediante grafos. Algoritmo de búsqueda exhaustiva. Generación de las coloraciones. Crecimiento del tiempo de ejecución. Búsqueda exhaustiva mejorada. Algoritmo heurístico. Crecimiento del tiempo de ejecución para el algoritmo ávido. Conclusión del ejemplo.
- Tipos abstractos de datos. Operaciones abstractas y características del TAD conjunto. Interfase del TAD conjunto. Implementación del TAD conjunto. Tiempo de ejecución de un programa. Notación asintótica. Invariancia ante constantes multiplicativas. Invariancia de la tasa de crecimiento ante valores en un conjunto finito de puntos. Transitividad. Regla de la suma. Regla del producto. Funciones típicas utilizadas en la notación asintótica. Equivalencia. La función factorial. Determinación experimental de la tasa de crecimiento. Otros recursos computacionales. Tiempos de ejecución no-polinomiales. Problemas P y NP. Varios parámetros en el problema
- Conteo de operaciones para el cálculo del tiempo de ejecución. Bloques if. Lazos. Suma de potencias. Llamadas a rutinas. Llamadas recursivas
- Tipos de datos abstractos fundamentales.
- El TAD Lista. Descripción matemática de las listas. Operaciones abstractas sobre listas. Una interfase simple para listas. Funciones que retornan referencias. Ejemplos de uso de la interfase. Implementación de listas por arreglos. Eficiencia de la implementación por arreglos. Implementación mediante celdas enlazadas por punteros. El tipo posición. Celda de encabezamiento. Las posiciones `begin' y `end'. Detalles de implementación. Implementación mediante celdas enlazadas por cursores. Cómo conviven varias celdas en un mismo espacio. Gestión de celdas. Analogía entre punteros y cursores. Tiempos de ejecución de los métodos en las diferentes implementaciones. Interfase STL. Ventajas de la interfase STL. Ejemplo de uso. Uso de templates y clases anidadas. Operadores de incremento prefijo y postfijo. Listas doblemente enlazadas.
- El TAD pila. Ejemplo: Una calculadora RPN con una pila. Operaciones abstractas sobre pilas. Interfase para pila. Implementación de una calculadora RPN. Implementación de pilas mediante listas. La pila como un adaptador. Interfase STL.
- El TAD cola. Ejemplo: Intercalación de vectores ordenados. Ordenamiento por inserción. Tiempo de ejecución. Particularidades al estar las secuencias pares e impares ordenadas. Algoritmo de intercalación con una cola auxiliar. Operaciones abstractas sobre colas. Interfase para cola. Implementación del algoritmo de intercalación de vectores. Tiempo de ejecución.
- El TAD correspondencia. Interfase simple para correspondencias. Implementación de correspondencias mediante contenedores lineales. Implementación mediante contenedores lineales ordenados. Implementación de mediante listas ordenadas. Interfase compatible con STL. Tiempos de ejecución para listas ordenadas. Implementación mediante vectores ordenados. Tiempos de ejecución para vectores ordenados. Definición de una relación de orden.
- Arboles.
- Nomenclatura básica de árboles. Altura de un nodo. Profundidad de un nodo. Nivel. Nodos hermanos. Orden de los nodos. Particionamiento del conjunto de nodos. Listado de los nodos de un árbol. Orden previo. Orden posterior. Orden posterior y la notación polaca invertida. Notación Lisp para árboles. Reconstrucción del árbol a partir de sus órdenes.
- Operaciones con árboles. Algoritmos para listar nodos. Inserción en árboles. Algoritmo para copiar árboles. Supresión en árboles. Operaciones básicas sobre el tipo árbol.
- Interfase básica para árboles. Listados en orden previo y posterior y notación Lisp. Funciones auxiliares para recursión y sobrecarga de funciones. Algoritmos de copia. Algoritmo de poda. Implementación de la interfase básica por punteros. El tipo iterator. Las clases `cell' e `iterator'. La clase tree. Interfase avanzada. Ejemplo de uso de la interfase avanzada. Tiempos de ejecución
- Arboles binarios. Listados en orden simétrico. Notación Lisp. Árbol binario lleno. Operaciones básicas sobre árboles binarios. Interfases e implementaciones. Interfase básica. Predicados de igualdad y espejo. Hacer espejo "in place". Implementación con celdas enlazadas por punteros . El algoritmo apply y principios de programación funcional. . Implementación de la interfase avanzada.
- Arboles de Huffman. Condición de prefijos. Representación de códigos como árboles de Huffman. Códigos redundantes. Tabla de códigos óptima. Algoritmo de búsqueda exhaustiva. Generación de los árboles. Un toque de programación funcional. El algoritmo de combinación. Función auxiliar que calcula la longitud media . El algoritmo de Huffman. Implementación del algoritmo. Ejemplo: Un programa de compresión de archivos.
- Conjuntos.
- Introducción a los conjuntos. Notación de conjuntos. Interfase básica para conjuntos. Análisis de flujo de datos.
- Implementación por vectores de bits. Conjuntos universales que no son rangos contiguos de enteros. Descripción del código.
- Implementación con listas. Similaridad entre los TAD conjunto y correspondencia. Algoritmo lineal para las operaciones binarias. Descripción de la implementación. Tiempos de ejecución.
- Interfase avanzada para conjuntos.
- El diccionario. La estructura tabla de dispersión. Tablas de dispersión abiertas. Detalles de implementación. Tiempos de ejecución. Funciones de dispersión. Tablas de dispersión cerradas. Costo de la inserción exitosa. Costo de la inserción no exitosa. Costo de la búsqueda. Supresión de elementos. Costo de las funciones cuando hay supresión. Reinserción de la tabla. Costo de las operaciones con supresión. Estrategias de redispersión. Detalles de implementación.
- Conjuntos con árboles binarios de búsqueda. Representación como lista ordenada de los valores. Verificar la condición de ABB. Mínimo y máximo. Buscar un elemento. Costo de mínimo. Operación de inserción. Operación de borrado. Recorrido en el árbol. Operaciones binarias. Detalles de implementación. Tiempos de ejecución. Balanceo del árbol.
- Ordenamiento.
- Introducción. Relaciones de orden débiles. Signatura de las relaciones de orden. Predicados binarios. Relaciones de orden inducidas por composición. Estabilidad. Primeras estimaciones de eficiencia. Algoritmos de ordenamiento en las STL.
- Métodos de ordenamiento lentos. El método de la burbuja. El método de inserción. El método de selección. Comparación de los métodos lentos. Estabilidad.
- Ordenamiento indirecto. Minimizar la llamada a funciones.
- El método de ordenamiento rápido, quick-sort. Tiempo de ejecución. Casos extremos. Elección del pivote. Tiempo de ejecución. Caso promedio. Dispersión de los tiempos de ejecución. Elección aleatoria del pivote. El algoritmo de partición . Tiempo de ejecución del algoritmo de particionamiento. Búsqueda del pivote por la mediana. Implementación de quick-sort. Estabilidad. El algoritmo de intercambio (swap). Tiempo de ejecución del quick-sort estable.
- Ordenamiento por montículos. El montículo. Propiedades. Inserción. Costo de la inserción. Eliminar el mínimo. Costo de re-heap. Implementación in-place. El procedimiento make-heap. Implementación. Propiedades de la clasificación por montículo.
- Ordenamiento por fusión. Implementación. Estabilidad. Versión estable de split. Merge-sort para vectores. Clasificación externa.
- Comparación de algunas implementaciones de algoritmos de ordenamiento.
Bibliografía
La bibliografía
principal a utilizar serán los apuntes de la cátedra (disponible en esta página) y el libro de Aho.
- Material generado por la catedra:
- Aho, Hopcroft y Ullman, Estructura de Datos Y Algoritmos, Ed. Addison-Wesley (1988).
- Tenenbaum y Augenstein, Estructura de Datos en Pascal, Ed. Prentice-Hall (1983).
- Weiss, Estructuras de Datos y Algoritmos, Ed. Addison Wesley (1995).
- Wirth, Algoritmos y Estructura de Datos, Ed. Prentice Hall (1987).
|
|
Videos de las clases de Teoría y Práctica
- Youtube playlist: bit.ly/aedvid2024 con los videos de las clases de teoría y práctica del DICTADO 2024
- Youtube playlist: bit.ly/aedvid2023 con los videos de las clases de teoría y práctica del DICTADO 2023
- Youtube playlist: bit.ly/aedvid2022 con los videos de las clases de teoría y práctica del DICTADO 2022
- Youtube playlist: bit.ly/aedvid2021 con los videos de las clases de teoría y práctica del DICTADO 2021
- Youtube playlist: bit.ly/aedvid2020 con los videos de las clases de teoría y práctica del DICTADO 2020
- Durante el DICTADO 2016 las clases de teoría han sido grabadas en formato de screencast. Los videos se pueden ver aquí Videos de las clases de teoría o en la siguiente Youtube playlist: bit.ly/aedvid2016
Modalidad de Dictado. Horarios
Se dictarán clases en los siguientes horarios: (Todas las clases se dictan en forma virtual por plataforma Zoom, salvo los exámenes. El enlace de Zoom será enviado por mail. ).
- Teoría [a cargo de M. Storti]:
- Martes de 15:45hs a 17:45hs
- Práctica [a cargo de JP Vidocevich e Ignacio Sánchez]:
- Martes de 18:00hs a 20:00hs
- Jueves de 18:00hs a 20:00hs
Evaluación
La evaluación se realiza mediante
dos exámenes parciales y tres trabajos prácticos de laboratorio (TPL). Los parciales constan de 6 secciones:
CLAS1, PREG1, OPER1, CLAS2, OPER2, PREG2. La regularidad se logra si
-
DP<=2 && DTPL==0 && PP>=40
donde
-
DP
es la cantidad de secciones de parciales adeudadas
-
DTPL
es la cantidad de TPLs adeudados
-
PP
es el promedio pesado de los parciales y TPL.
Recuerden que para aprobar cada sección tienen que tener un porcentaje mínimo de
60% en teoría, y
50% en las restantes.
Lograrán
promoción directa cuando
-
DP==0 && DTPL==0 && PP>=70
Se calcula una
Nota Final igual al promedio pesado
PP de las secciones.
Se realizará un
Examen Recuperatorio. Las reglas del mismo se pueden consultar
aquí.
Aquellos alumnos que no logren promoción directa, deberán rendir un
examen final. Los exámenes finales incluyen
todos los temas dados en la materia y constan de una evaluación de
teoría, que puede ser
oral, y una parte escrita que incluye
programación, operativos, y clases.
Cronograma 2024
- Inicio de Clases: Semana 1 (Martes 2024-08-20)
- TPL1 (Trab Práctico de Laboratorio 1): Semana 4 (Jueves 2024-09-12)
- Parcial 1: Semana 8 (Jueves 2024-10-10)
- TPL2: Semana 10 (Jueves 2024-10-24)
- TPL3: Semana 13 (Jueves 2024-11-14)
- Parcial 2: Semana 14 (Jueves 2024-11-21)
- Recup TPLs: Semana 15 (Martes 2024-11-26)
- Recuperatorio de los dos parciales: Semana 15 (Jueves 2024-11-28)
Guías de Trabajos Prácticos
Aquí se puede bajar las guías en formato
PDF.
Guía 1: Diseño y análisis de algoritmos
Guía 2: Tipos de datos abstractos fundamentales
Guía 3: Árboles
Guía 4: Conjuntos
Guía 5: Ordenamiento
Exámenes parciales y finales tomados previamente
(Previo a 2002 en formato MS-Word, posteriores en formato PDF) (A partir de 2013 incluye los ZIP con el material de los TPL (no encriptados))
- Los exámenes finales se empezaron a tomar en C++ a partir de la primera fecha de julio 2004. Hasta entonces se tomaba en Pascal.
- Todos los ejemplos se escribirán en C++.
Migración de Pascal a C++
El lenguaje de programación que se usa desde el cursado 2004 es C++. (Anteriormente se daba en Pascal)
- El lenguaje de programación que se usa desde el cursado 2004 es C++.* (Anteriormente se daba en Pascal)
- Los exámenes finales se empezaron a tomar en C++ a partir de la primera fecha de julio 2004. Hasta entonces se tomaba en Pascal.
- Todos los ejemplos se escribirán en C++.
Enlaces de interés
Repositorio de archivos
En el
repositorio de archivos se pueden encontrar ejercicios resueltos de las guías o tomados en exámenes parciales y finales previos.
(El viejo repositorio con programas en Pascal se accede aqui )
2018