Información Básica
-
Créditos: 3
-
Horas de trabajo acompañado: 5 / semana (3 horas de clase, 2 de taller)
-
Horas de trabajo independiente: 4 / semana
-
Pre-requisitos: Árboles y Grafos, Computabilidad y Lenguajes Formales, Probabilidad Discreta
-
Tipo de curso: Núcleo de Formación Fundamental
Descripción del Curso
El curso estudia técnicas para diseñar algoritmos como, por ejemplo, dividir y conquistar, programación dinámica, programación voraz/avara y reintento. A los algoritmos desarrollados mediante estas técnicas se les aplican los dos tipos de análisis fundamentales en algoritmia: el de corrección y el de eficiencia. El curso también aborda técnicas de diseño de algoritmos aleatorizados y de algoritmos de aproximación, al igual que explora técnicas en la teoría de números computacional y en la computación geométrica. En la última parte del curso se introducen modelos de computación en paralelo.
Objetivos
Al finalizar el curso los participantes podrán:
-
Usar técnicas de diseño algorítmico para resolver problemas de decisión, optimización y búsqueda computacional.
-
Diseñar algoritmos basándose en los principios de dividir y conquistar, programación avara/voraz y reintento.
-
Describir las ventajas y desventajas de algoritmos aleatorizados y de aproximación.
-
Aplicar técnicas para optimización de recursos en el diseño de una solución algorítmica.
-
-
Demostrar y argumentar la corrección y eficiencia de un algoritmo.
-
Plantear contratos (i.e., precondición, poscondición, invariantes) para algoritmos iterativos y recurrentes.
-
Demostrar que un algoritmo es correcto con respecto a su especificación; en particular, justificar por qué una fórmula es invariante de un ciclo.
-
Calcular las complejidades temporal y espacial de una algoritmo en el peor de los casos.
-
-
Implementar correcta y eficientemente soluciones algorítmicas en un lenguaje de programación.
-
Escribir programas en un lenguaje de programación con base en el diseño algorítmico de una solución.
-
Conocer las ventajas y desventajas de los lenguajes de programación utilizados para implementar un diseño algorítmico.
-
-
Identificar técnicas de aproximación algorítmica para resolver problemas intratables (i.e., computacionalmente difíciles).
-
Entender la programación lineal como un método general para resolver problemas de optimización.
-
Usar la aproximación lineal para obtener algoritmos de aproximación para problemas algorítmicos combinatorios.
-
-
Comprender las diferencias entre los modelos de computación secuenciales y los modelos de computación en paralelo.
-
Distinguir entre modelos de computación secuencial y modelos de computación en paralelo.
-
Conocer las limitaciones prácticas de los modelos de computación en paralelo.
-
Se desarrollan competencias en
-
El uso de un lenguaje de programación imperativo.
-
La implementación de algoritmos correctos y eficientes en un lenguaje de programación.
-
La estimación de complejidades algorítmicas para el peor de los casos.
-
El diseño de casos de prueba para validar el comportamiento de los algoritmos diseñados.
Contenido
Capítulo 1: Introducción
Sesión | Horas teóricas | Prácticas acompañadas | Temas | Profundidad | Bibliografía |
---|---|---|---|---|---|
1-2 | 3 | 2 | Introducción y repaso. Inducción matemática. Diseño algorítmico. Notación asintótica. Algoritmos cuadráticos de ordenamiento. | Uso | [1 caps 1,2] [2 cap 2][3 cap 0, app 1][5 cap 1] |
Total de Horas: 5.
Sesión | Horas de trabajo independiente | Temas | Bibliografía |
---|---|---|---|
1-2 | 4 | Tareas semanales, resolución de problemas en temas vistos | [1,cap 1,2][2 cap 2][3 cap 0, app 1][5 cap 1] |
Total de Horas: 4.
Capítulo 2: Dividir y conquistar
Sesión | Horas teóricas | Prácticas acompañadas | Temas | Profundidad | Bibliografía |
---|---|---|---|---|---|
3-6 | 6 | 4 | Dividir, conquistar y combinar. Relación con inducción matemática. MergeSort. HeapSort. Bisección y búsqueda binaria. Teorema Maestro. | Evaluación | [1 cap 4][2 cap 5][3 cap 1][5 cap 2] |
Total de Horas: 10.
Sesión | Horas de trabajo independiente | Temas | Bibliografía |
---|---|---|---|
3-6 | 8 | Tareas semanales, resolución de problemas en temas vistos | [1 cap 4][2 cap 5][3 cap 1][5 cap 2] |
Total de Horas: 8.
Capítulo 3: Técnicas de diseño algorítmico
Sesión | Horas teóricas | Prácticas acompañadas | Temas | Profundidad | Bibliografía |
---|---|---|---|---|---|
7-11 | 7 | 5.5 | Programación dinámica. Memorización (top-down). Tabulación (bottom-up). Técnicas de ahorro de memoria. | Evaluación | [1 cap 15][2 cap 6][3 caps 5,6][5 cap 3] |
12-15 | 6 | 4 | Algoritmos avaros/voraces. Óptimos locales. Técnicas de demostración de optimalidad. | Evaluación | [1 cap 16][2 cap 4][3 cap 7][5 cap 4] |
16-18 | 5 | 2.5 | Reintento (backtracking). Búsqueda exhaustiva. Heurísticas. | Evaluación | [3 cap 3][5 caps 5,6] |
Total de Horas: 30.
Sesión | Horas de trabajo independiente | Temas | Bibliografía |
---|---|---|---|
7-18 | 24 | Tareas semanales, resolución de problemas en temas vistos | [1 caps 15,16][2 caps 4,6][3 caps 3,5-7][5 caps 3-6] |
Total de Horas: 24.
Capítulo 4: Temas seleccionados
Sesión | Horas teóricas | Prácticas acompañadas | Temas | Profundidad | Bibliografía |
---|---|---|---|---|---|
19-21 | 4 | 3.5 | Teoría de números computacional. El algoritmo de Euclides. Criba de Eratóstenes. Test de primalidad. Factorización de números. Funciones multiplicativas. Aritmética de precisión arbitraria. Ciframiento. | Evaluación | [1 cap 31][4 cap 5][5 cap 10] |
22-24 | 4 | 3.5 | Geometría computacional. Representación de puntos, líneas, segmentos, polígonos. Intersección de segmentos, polígonos. Envolvimiento convexo. | Evaluación | [1 cap 33][4 cap 7] |
Total de Horas: 15.
Sesión | Horas de trabajo independiente | Temas | Bibliografía |
---|---|---|---|
19-24 | 12 | Tareas semanales, resolución de problemas en temas vistos | [1 caps 31,33][4 caps 5,7][5 cap 10] |
Total de Horas: 12.
Capítulo 5: Otras técnicas algorítmicas
Sesión | Horas teóricas | Prácticas acompañadas | Temas | Profundidad | Bibliografía |
---|---|---|---|---|---|
25-26 | 3 | 2 | Algoritmos aleatorizados. Quicksort. El algoritmo de Rabin y Karp. | Uso | [1 cap 7][3 cap 13] |
27-29 | 5 | 2.5 | Algoritmos de aproximación. Programación lineal entera. El algoritmo Simplex. Eliminación Gaussiana. Rounding. Cubrimiento de vértices. | Uso | [1 cap 29,35][3 caps 26] |
Total de Horas: 12.5.
Sesión | Horas de trabajo independiente | Temas | Bibliografía |
---|---|---|---|
25-29 | 10 | Tareas semanales, resolución de problemas en temas vistos | [1 caps 7,29,35][3 caps 13,26] |
Total de Horas: 10.
Capítulo 7: Modelos de computación en paralelo
Sesión | Horas teóricas | Prácticas acompañadas | Temas | Profundidad | Bibliografía |
---|---|---|---|---|---|
30-32 | 5 | 2.5 | Modelos formales de programación en paralelo. Computación secuencial vs. en paralelo. Parallel programming vs. concurrent programming. La ley de Amdahl | Uso | [5 cap 11] |
Total de Horas: 7.5.
Sesión | Horas de trabajo independiente | Temas | Bibliografía |
---|---|---|---|
30-32 | 6 | Tareas semanales, resolución de problemas en temas vistos | [5 cap 11] |
Total de Horas: 6.
Bibliografía
-
T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein. Introduction to algorithms. Third Edition. MIT Press, Cambridge, MA, USA, 2009.
-
J. Kleinberg, É. Tardos. Algorithm Design. Pearson, 2005.
-
J. Erickson. Algorithms. Urbana, USA, 2015. Available online: http://web.engr.illinois.edu/~jeffe/teaching/algorithms/
-
S. Halim, F. Halim. Competitive Programming 3: The new lower bound of programming contests. Lulu, 2013.
-
R. Neapolitan, K. Naimipour. Foundations of Algorithms. 4th Edition. Jones and Barlett Publishers, 2011.
Instalaciones
Salón de clase con computador y proyector. Laboratorio de Ingeniería de Sistemas y Computación.