Doble Grado en International Computer Engineering and Management of Business and Technology

Programación avanzada y estructura de datos

Descripción
La asignatura divide sus contenidos en dos partes claramente diferenciadas: - En la primera parte se trabaja el análisis algorítmico (costes, casos, notación asintótica, resolución de recurrencias simples), la especificación y la verificación formal de algoritmos recursivos simples. Se introduce el análisis de la eficiencia de los programas como un criterio más de calidad. Se estudia también el diseño de algoritmos recursivos simples y múltiples, y varias técnicas de resolución de problemas combinatorios. - En la segunda parte, se introduce el concepto y especificación de tipos abstractos de datos como estructuras de datos lineales, árboles, tablas y grafos. Las técnicas básicas mencionadas incluyen conocimientos teóricos y prácticos, habilidades, experiencias y sentido crítico, todas ellas fundamentadas en teorías y técnicas sólidas, comprobadas y bien establecidas.
Tipo asignatura
Tercer - Obligatoria
Semestre
Anual
Curso
2
Créditos
8.00
Conocimientos previos

Dominio de las técnicas de programación trabajadas en Metodología y Tecnología de la Programación (análisis descendente, modularidad, paso de parámetros y estructuras de datos básicos).
Conocer bien el lenguaje que se utilizará para realizar los ejercicios (Pseudocódigo / C / Java).
Capacidad para seguir y proponer razonamientos matemáticos.

Objetivos

Resultados de aprendizaje
- Uso de un entorno real de programación
- Trabajo en equipo en el análisis, diseño e implementación de software
- Definición de la estructura modular y de datos para llevar a término las aplicaciones informáticas

Al finalizar el curso, el alumno debe ser capaz de:
- Evaluar la eficiencia de un algoritmo a través del cálculo del coste.
- Diseñar un algoritmo recursivo.
- Transformar un algoritmo recursivo en iterativo.
- Justificar la necesidad de la especificación formal de los algoritmos.
- Explicar los principales mecanismos de derivación formal y demostración formal de algoritmos recursivos simples y de llevarlo a la práctica en problemas.
- Hacer la especificación de una función en términos de pre y post-condiciones.
- Implementar un algoritmo sin ambigüedades a partir de la especificación del mismo.
- Escoger los métodos de resolución de problemas combinatorios más adecuados en cada situación.
- Implementar los métodos de Backtracking, Branch & Bound y Greedy adaptados a cada problema en concreto y buscando la máxima eficiencia y eficacia.
- Especificar formalmente cualquier Tipo Abstracto de Datos usando especificación algebraica.
- Implementar un Tipo Abstracto de Datos a partir de su especificación algebraica.
- Diseñar e implementar la estructura de datos más adecuada para una determinada aplicación, dados unos requisitos de eficiencia temporal y espacial.
- Implementar los árboles binarios, n-arios, AVL, 2-3, B y heaps. Implementar también los diversos recorridos posibles.
- Implementar las tablas vistas en la asignatura.
- Implementar las variantes de los diferentes grafos. Implementar la búsqueda del camino mínimo.

Contenidos

Semestre 1 (Ejemplos y problemas en Pseudocódigo / C)

1. Especificación de algoritmos
1.1. Introducción
1.2. Cómo especificar algoritmos
1.3. Precondiciones y postcondiciones: sintaxis y semántica
2. Eficiencia de los algoritmos
2.1. Introducción
2.2. Medidas asintóticas. Tasa de crecimiento
2.3. Cálculo del tiempo de ejecución y del coste
3. Diseño recursivo
3.1. Introducción
3.2. Etapas y diseño de programas recursivos
3.3. Técnica de inmersión
3.4. Técnica de "plegado" y "desplegado"
3.5. Transformación de recursivo simple a iterativo
3.6. Recursividad múltiple. Divide & Conquer
3.7. Ordenación con Divide & Conquer: Mergesort y Quicksort
3.8. Verificación de algoritmos recursivos simples
4. Técnica del Backtracking
4.1. Terminología y caracterización de los problemas
4.2. Esquemas recursivo e iterativo
4.3. Metodología de resolución
4.4. Ejemplos
4.5. Backtracking para encontrar la mejor de las soluciones
4.6. Mejora en la eficiencia
5. Branch & Bound
5.1. Introducción al método
5.2. Esquema algorítmico
5.3. Ejemplos
6. Greedy
6.1. Introducción al método
6.2. Esquema algorítmico
6.3. Ejemplos

Semestre 2 (Ejemplos y problemas en Pseudocódigo / C / Java)

7. Tipos abstractos de datos
7.1. Introducción. Concepto de tipos abstractos de datos
7.2. Especificación algebraica de tipos abstractos de datos
7.3. Ejemplos
8. Árboles
8.1. Introducción
8.2. Árboles n-arios y árboles binarios
8.3. Recorridos
8.4. Árboles de búsqueda
8.5. Árboles AVL
8.6. Árboles B
8.7. Heaps
9. Tablas
9.1. Introducción
9.2. Especificación
9.3. Diseño de tablas
9.4. Tablas de hash
9.5. Implementación de tablas usando árboles equilibrados
10. Grafos
10.1. Introducción
10.2. Eespecificación
10.3. Representación
10.4. Recorrido de grafos
10.5. Algoritmos de caminos mínimos
10.6. Árboles de expansión minimales
11. Patrones de diseño GRASP y GOF

Metodología

Las actividades formativas básicas para cada resultado de aprendizaje son:
Para el `Uso de un entorno real de programación´
- Trabajo en laboratorio
- Dedicación personal a las prácticas de laboratorio
- Actividades de evaluación
Para el `Trabajo en equipo en el análisis, diseño e implementación de software´
- Presentación en el aula de los conceptos y procedimientos asociados al módulo, utilizando el método de la lección
- Trabajo en laboratorio
- Dedicación personal a las prácticas de laboratorio
- Estudio y trabajo personales del alumno
- Actividades de evaluación
Para la `Definición de la estructura modular y de datos para llevar a término las aplicaciones informáticas´
- Presentación en el aula de los conceptos y procedimientos asociados al módulo, utilizando el método de la lección
- Estudio y trabajo personales del alumno
- Actividades de evaluación

Mas concretamente, la metodología es un híbrido de la clase magistral junto con los ejercicios hechos en clase y en casa y con sesiones prácticas sobre ejercicios cortos o sobre las mismas prácticas a entregar. Se va combinando de forma que el alumno pueda ir asimilando los contenidos firmemente. Se procura un ritmo de exposición de los conocimientos conjuntamente con la ejercitación de éstos para facilitar este ritmo que garantice la asimilación de los conocimientos a corto, medio y largo plazo.

Evaluación

Las herramientas de evaluación usadas para cada resultado de aprendizaje son :
Para el « Uso de un entorno real de programación »
- Informes o ejercicios en el laboratorio
- Desarrollo y presentación de prácticas personales o en grupo
Para el « Trabajo en equipo en el análisis, diseño e implementación de software »
- Exámenes
- Ejercicios en clase
- Informes o ejercicios en el laboratorio
- Desarrollo y presentación de prácticas personales o en grupo
Para la « Definición de la estructura modular y de datos para llevar a término las aplicaciones informáticas »
- Exámenes
- Ejercicios en clase
- Informes o ejercicios en el laboratorio
- Desarrollo y presentación de prácticas personales o en grupo

Criterios evaluación

Para calcular la nota final es imprescindible que la teoría y las prácticas estén todas aprobadas con un mínimo de 5.
Nota Final = 60% Nota Teoría + 40% Nota Prácticas

La teoría consta de una parte mayoritaria de exámenes semestrales y una parte de evaluación continua donde se destaca el punto de control realizado a medio semestre así como otros ejercicios realizados y recogidos en clase o ejercicios cortos prácticos implementados y totalmente funcionales. Para tener en cuenta la nota de evaluación continua, la nota de examen debe ser igual o superior a 3.5.

Los semestres liberan materia hasta la convocatoria extraordinaria siempre y cuando tengan una nota mínima de cinco (5).

La nota semestral del alumno se calcula como:

Nota Semestre = MAX (70% Nota Examen + 30% Nota AC, 100% Nota Examen)

En junio existe la posibilidad de recuperar el 1r Semestre.
En julio (convocatoria extraordinaria) hay la posibilidad de recuperar el 1r Semestre y el 2o Semestre.
La nota de teoría de la asignatura, siempre que los dos semestres tingan una nota igual o superior a cinco (5), se calcula como:

Nota Teoría = 50% Nota 1r Semestre + 50% Nota 2n Semestre

En cada semestre hay una práctica y un ejercicio práctico a entregar. Cada práctica y cada ejercicio deberán superarse con un mínimo de 5 para calcularse la nota de prácticas,
Nota Prácticas Semestre = 75% NotaPracSemestre + 25% NotaEjercicioPracSemestre

Nota Prácticas = 50% NotaPracSem1 + 50% NotaPracSem2

Los exámenes finales del primer y segundo semestre, el examen del punto de control del segundo semestre y las prácticas del primer y segundo semestre se evaluarán mediante rúbricas adhoc.

Bibliografía básica

Disponible en la intranet.

Material complementario

Disponible en la intranet.