· Entender el desarrollo de programas como un proceso metódico e ingenieril, formado por una serie de etapas con distintos niveles de abstracción, frente a la idea de la programación como arte.
· Reconocer la importancia de la abstracción y conocer los tipos de abstracciones que aparecen en programación: funcional, de datos y de iteradores.
· Concienciarse de la utilidad de desarrollar especificaciones completas y precisas, entendiendo la especificación como un punto de acuerdo entre el usuario y el implementador de una abstracción.
· Comprender el método de especificación formal algebraico o axiomático (basado en una definición mediante axiomas) y el método constructivo u operacional (basado en el uso de precondiciones y postcondiciones).
· Conocer la importancia y ubicuidad de los tipos conjunto y diccionario en el desarrollo de programas, independientemente de la estructura que se use para implementarlos.
· Ser capaz de diseñar, implementar y analizar la eficiencia de las principales estructuras de representación no arbóreas para los tipos conjunto y diccionario, adaptando el diseño a las necesidades específicas de cada aplicación.
· Conocer la estructura de datos de tablas de dispersión, sus distintas variantes y los factores que influyen en su eficiencia y uso de memoria.
· Conocer y comprender una variedad de técnicas eficientes de representación de conjuntos y diccionarios mediante estructuras arbóreas.
· Adquirir la capacidad de evaluar las necesidades de representación de una aplicación específica, tomando decisiones justificadas sobre las estructuras de representación más adecuadas.
· Comprender la necesidad de usar mecanismos de equilibrado o balanceo para conseguir eficiencia en las representaciones arbóreas.
· Ser capaz de diseñar e implementar una estructura de datos para el tipo grafo (en sus distintas variantes) usando listas y matrices de adyacencia.
· Valorar críticamente las ventajas e inconvenientes de las representaciones de grafos mediante listas y matrices de adyacencia, y su influencia en la eficiencia de los algoritmos sobre grafos.
· Conocer y comprender el funcionamiento de una variedad de algoritmos clásicos sobre grafos (tales como los algoritmos de Prim, Kruskal, Dijkstra, Floyd y Warshall), razonando sobre las ideas subyacentes que aportan y analizando su complejidad computacional.
· Ser capaz de usar los algoritmos estudiados como herramientas prácticas para la resolución de problemas en un contexto genérico, a través de la transformación de un problema de interés en un problema sobre grafos.