Análisis y Diseño de Algoritmos 2022-2

Profesores

  • Carlos Ramírez (carlosalbertoramirez *at* javerianacali.edu.co)

  • Camilo Rocha (camilo.rocha *at* javerianacali.edu.co)

Horario

  • Martes (Palmas 3.1) 09:00 - 11:00

  • Jueves (Palmas 3.1) 09:00 - 11:00

Atención a estudiantes

  • Jueves 11am - 12m (Camilo Rocha, Of. 2.02 Facultad de Ingeniería y Ciencias)

Monitor

  • Guido Salazar

Programa del curso

Bitácora

  1. Bienvenida (07/26) [grabación]

  2. Notación asintótica; dividir y conquistar (07/28) [grabación, apuntes]

    • Notación asintótica

    • Subarreglo de suma máxima [código]

  3. Teorema maestro; propiedades de la notación O (08/02) [grabación, apuntes]

    • Conjuntos disyuntos (en inglés, union-find) [apuntes]

    • Repaso estructuras de datos [apuntes]

  4. Dividir y conquistar (08/04) [grabación, apuntes]

  5. Dividir y conquistar (08/09) [apuntes]

    • Teselación de un tablero generalizado de ajedrez

    • Ordenamiento de arreglos

  6. Dividir y conquistar (08/11) [grabación, apuntes]

    • MergeSort

  7. Semana diagonal (08/16)

  8. Semana diagonal (08/18)

  9. Dividir y conquistar (08/23) [grabación, apuntes]

  10. Programación dinámica (08/25) [grabación, apuntes] (sesión del 02/11/2022)

    • Introducción

    • Fibonacci con memorización y tabulación

  11. Programación dinámica (08/30) [grabación, apuntes]

    • Fibonacci (continuación)

  12. Programación dinámica (09/01) [grabación, apuntes]

    • Distancia mínima de edición entre cadenas [código]

  13. Programación dinámica (09/06) [grabación, apuntes]

    • Subsecuencia común más larga (LCS) [código]

    • Problema del morral (Knapsack) [código]

  14. Parcial 1 (09/08) [enunciado]

  15. Programación dinámica (09/13) [grabación, apuntes]

    • Multiplicación de matrices [código]

  16. Programación dinámica (09/15) [grabación, apuntes]

    • Agente viajer (TSP)

  17. Programación dinámica (09/20) [grabación, apuntes]

    • Subsecuencia creciente maximal (LIS) - primera solución [código]

  18. Programación dinámica (09/22) [grabación, apuntes]

    • Subsecuencia creciente maximal (LIS) - segunda solución

  19. Algoritmos voraces (09/27) [grabación, apuntes]

    • Selección maximal de actividades - solución iterativa [código]

  20. Algoritmos voraces (09/29) [grabación, apuntes]

    • Selección maximal de actividades - solución recurrente [código]

  21. Algoritmos voraces (10/04) [grabación, apuntes]

    • Mínimo cubrimiento de intervalos [código]

  22. Algoritmos voraces (10/06) [grabación, apuntes]

  23. Algoritmos voraces (10/11) [grabación, apuntes]

    • Códigos de Huffman

  24. Programación dinámica (10/13) [grabación, apuntes]

    • Repaso: Planeación de inventario (Tarea 3)

  25. Reintento (10/18) [grabación]

    • El problema de las reinas en un tablero de ajedrez

  26. Parcial (10/20) [enunciado, solución]

  27. Reintento (10/25) [grabación, apuntes]

    • El problema de las reinas en un tablero de ajedrez [código]

    • Segmentación de texto [código]

  28. Reintento (10/27) [grabación, apuntes]

  29. Clases de complejidad computacional (11/01) [grabación, apuntes]

    • Lenguajes formales

    • Problemas decidibles e indecidibles

    • La clase P

  30. Clases de complejidad computacional (11/03) [grabación, apuntes]

    • Repaso clase anterior

    • La clase NP

  31. Clases de complejidad computacional (11/08) [grabación, apuntes]

    • Reducciones polinomiales

    • Problemas NP-Completos

  32. Clases de complejidad computacional (11/10) [grabación, apuntes]

    • Reducción de 3CNFSAT a CLIQUE

    • Cierre del curso

Enlaces

Proyecto

Roller Coaster (Codingame) : enunciado

Entrega 0 (10%)

Esta entrega consta de un documento que describe la naturaleza de la solución del problema. En este documento se debe reflejar qué tanto entiende del problema, cuál es su estrategia de solución y la cantidad de trabajo que ha hecho para el proyecto. En esta entrega no es necesario tener una solución del problema pero sí tener claro cómo se puede resolver.

El documento para esta entrega no tendrá más de 3 páginas y, como mínimo, deberá contener la siguiente información:

    • Especificación del problema (entrada y salida)

    • Algoritmos y estructuras de datos que usará su solución (cada decisión debe ser justificada)

    • Estrategia de solución

    • Análisis (alto nivel) de complejidad temporal y espacial de su solución

    • De ser necesario, citas bibliográficas del material consultado y que será usado en la solución del proyecto

Recuerde que el proyecto es individual.

Entrega 1 (20%)

Esta entrega consta de un único archivo fuente en el lenguaje de programación Python que debe ser aceptado en la arena como correcto en la arena disponible para el proyecto para el caso de prueba #1: Simple case.

El contenido del archivo debe contar con:

    • Un encabezado que declare de forma unívoca la autoría del código: (i) nombre del autor (estudiante quien entrega el proyecto), (ii) su código de estudiante y (iii) la frase de compromiso del código de honor del curso.

    • Documentación de cada una de las funciones usando el estándar de Python.

    • El archivo debe ser enviado, también, por BrightSpace.

Cualquier archivo entregado sin seguir los lineamientos anteriores será ignorado para efecto de la calificación del proyecto.

Entrega 2 (70%)

Esta entrega consta de dos partes: (i) solución de casos de prueba y (ii) sustentación.

Los casos de prueba están clasificados en 10 categorías. Para obtener una puntación perfecta en esta entrega es indispensable que una solución resuelva correctamente todos los casos de prueba disponibles en la arena para los casos de prueba #1 a #10. Para que una solución sea considerada para puntuar es necesario que el archivo cumpla con las condiciones de la Entrega 1. Tenga en cuenta también que los casos de prueba deben ser resueltos por la misma solución, es decir, no es posible usar dos soluciones distintas para los casos de prueba.

Adicionalmente, para esta entrega se evaluarán durante la sustentación los siguientes requisitos no funcionales:

    • Diseño y uso clases para abstraer elementos de la solución

    • Nombres de variables, funciones/metodos, etc. en inglés

    • Elegancia del código

La sustentación de cada proyecto tomará alrededor de 10 minutos y para ello se abirará una lista de turnos. Para la sustentación es importante estar en capacidad de explicar la estrategia de solución, explicar los algoritmos utilizados (de memoria), describir las estructuras de datos utilizadas, y complejidades temporal y espacial de la solución. Una sustentación insatisfactoria del proyecto puede anular cualquier puntación otrogable por resolver satisfactoriamente casos de prueba.

La sustentación es un factor entre 0 y 1 que pondera la puntuación enumerada anteriormente: entre mejor sea la sustentación, mayor será este factor.

Tareas