You are here: Foswiki>Main/AED Web>WebHome (03 Dec 2024, MarioStorti)Edit Attach

Universidad Nacional del Litoral
Facultad de Ingeniería y Ciencias Hídricas

Algoritmos y Estructuras de Datos

Ir a la Página de Notas

Novedades feed

[New]

Indice

Cátedra e info de la materia. Contacto

  • 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.
  1. 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
  2. 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.
  3. 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.
  4. 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.
  5. 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++.

Año 2000 (exam00.zip) Año 2001 (exam01.zip) Año 2002 (exam02.zip) Año 2003 (exam03.zip)
Año 2004 (exam04.zip) Año 2005 (exam05.zip) Año 2006 (exam06.zip) Año 2007 (exam07.zip)
Año 2008 (exam08.zip) Año 2009 (exam09.zip) Año 2010 (exam10.zip) Año 2011 (exam11.zip)
Año 2012 (exam12.zip) Año 2013 (exam13.zip) Año 2014 (exam14.zip) Año 2015 (exam15.zip)
Año 2016 (exam16.zip) Año 2017 (exam17.zip) Año 2018 (exam18.zip) Año 2019 (exam19.zip)
Año 2022 (exam22.zip) Año 2023 (exam23.zip) Año 2024 (exam24.zip)  

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
Topic attachments
I Attachment Action Size Date Who Comment
aed-programa.pdfpdf aed-programa.pdf manage 86 K 27 Jul 2015 - 17:48 MarioStorti  
gtp1_aed.pdfpdf gtp1_aed.pdf manage 142 K 07 Aug 2019 - 16:40 CimecUser  
gtp2_aed.pdfpdf gtp2_aed.pdf manage 154 K 07 Aug 2019 - 16:41 CimecUser Guía de TPs nro 2
gtp3_aed.pdfpdf gtp3_aed.pdf manage 163 K 07 Aug 2019 - 16:41 CimecUser  
gtp4_aed.pdfpdf gtp4_aed.pdf manage 210 K 07 Aug 2019 - 16:41 CimecUser  
gtp5_aed.pdfpdf gtp5_aed.pdf manage 96 K 07 Aug 2019 - 16:41 CimecUser  
ver1.hpphpp ver1.hpp manage 3 K 12 Aug 2015 - 17:18 MarioStorti  
Topic revision: r310 - 03 Dec 2024, MarioStorti
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback