· Tomar conciencia de la importancia de realizar siempre un análisis y diseño previos del problema, como pasos anteriores a la implementación en un lenguaje de programación
· Distinguir los distintos tiempos de ejecución que se utilizan en el estudio de algoritmos: caso más favorable, más desfavorable y promedio
· Aprender las técnicas básicas del estudio teórico de algoritmos: análisis del tiempo por conteo de instrucciones y estudio de la ocupación de memoria Comprender la importancia de este estudio
· Aprender a realizar estudios experimentales, comprender su importancia y la necesidad de contrastar los resultados experimentales con los teóricos
· Conocer las notaciones de complejidad O (o-grande, orden), Omega, Theta y o (o-pequeña), diferenciando claramente el significado y utilidad de cada una
· Saber comparar las complejidades de distintas funciones
· Conocer la complejidad de las funciones que aparecen más frecuentemente en el estudio de algoritmos, así como la relación entre las complejidades de estas funciones
· Conocer las técnicas básicas de resolución de ecuaciones de recurrencia: expansión de la recurrencia, método de la ecuación característica y utilización de fórmulas maestras
· Comprender el papel de las condiciones iniciales (casos base) en la resolución de ecuaciones recurrentes, y saber determinar cuáles se deben aplicar para cada ecuación dada
· Comprender la técnica de resolución por división en problemas más pequeños
· Conocer y saber aplicar los esquemas básicos de los algoritmos divide y vencerás
· Comprender la técnica de resolución de problemas por avance rápido y los distintos casos que se pueden presentar en la resolución de problemas por esta técnica: obtención de la solución óptima, de una solución no óptima, o no obtención de la solución
· Entender el método de avance rápido como técnica para obtener una solución inicial a partir de la cual se puede realizar una búsqueda local, y conocer algunos ejemplos que se pueden resolver de ese modo
· Comprender la técnica de resolución de problemas por programación dinámica, e identificar las diferencias con divide y vencerás y con avance rápido
· Entender la ventaja de la programación dinámica con respecto a otras técnicas en cuanto a tiempo de ejecución, al evitar la repetición de cálculos que aparece en métodos recursivos
· Saber identificar problemas que cumplen el principio de optimalidad, que es necesario para poder aplicar esta técnica
· Entender el concepto de árbol de solución, y su utilización en la resolución de problemas Comprender que en muchos casos el árbol es sólo una representación lógica del conjunto de todas las posibles soluciones y subsoluciones
· Comprender y saber aplicar la técnica de resolución de problemas por backtracking, entendiendo sus características principales y el concepto de búsqueda en profundidad
· Comprender y saber aplicar la técnica de resolución de problemas por ramificación y poda, entendiendo la importancia de la estimación del beneficio para guiar la búsqueda, y del cálculo de las cotas para podar el árbol de búsqueda
· Comprender la importancia de la heurística en la resolución eficiente de problemas de alto coste computacional