Prof: Ricardo Baeza Yates
rbaeza@dcc.uchile.cl
www.dcc.uchile.cl/~rbaeza/cursos/cc40a.html
Analizar la eficiencia de diversos algoritmos para resolver una variedad de problemas, principalmente no numéricos. Enseñar al alumno a diseñar y analizar nuevos algoritmos.
Algoritmos y su complejidad. ¿Como se mide la eficiencia de un algoritmo? Tiempo y Espacio. Peor caso, caso promedio. Medidas de orden. Modelo de un computador y sus medidas de complejidad.
Solución de Recurrencias (Números de Fibonacci). Funciones Generatrices. Cálculos asintóticos. Técnicas para cotas inferiores (teoría de la información, adversarios, complejidad de Kolmogorov).
Inducción: ejemplos simples. Otros paradigmas como casos particulares de inducción. Inducción doble y reforzada.
Dividir para reinar: quicksort, mergesort, algoritmos de selección, algoritmo de Strassen, árboles de búsqueda y otras estructuras de datos recursivas.
Programación dinámica. Arboles binarios de búsqueda. Algoritmos en grafos. Subsecuencia común más larga.
Algoritmos en línea vs. los que saben toda la información. Paginamiento. Búsqueda en el plano.
Aleatorizar la entrada: hashing. Algoritmos aleatorios: listas saltadas, hashing perfecto. Algoritmos probabilisticos.
Búsqueda por interpolación, bucketsort, árboles digitales, búsqueda de strings.
Heurísticas en estructuras de datos: auto-organizadas, splay trees. Análisis amortizado. Operaciones sobre conjuntos: Union-Find. Algoritmos golosos: algoritmo de Dijkstra, árboles de cobertura mínimos.
Resolución de problemas NP-completos: búsqueda exhaustiva, algoritmos con soluciones aproximadas acotadas.
Algoritmos paralelos y distribuidos. Algoritmos genéticos. Algoritmos Geométricos (Convex Hull). Búsqueda multidimensional: k-d trees, grid files. Manejo de Memoria Dinámica.
Ricardo Baeza-Yates