Está en la página 1de 10

Estructura

de la información
Jordi Àlvarez Canal (coordinador)
Xavier Burgués Illa
Juan Manuel Dodero Beardo
Xavier Franch i Gutiérrez
Elena García Barriocanal
Julià Minguillón Alfonso
Miguel Ángel Sicilia Urbán
Con la colaboración de
Esteve Mariné Gallisà

XP06/75001/00574
© FUOC • XP06/75001/00574 Estructura de la información

Jordi Àlvarez Canal Xavier Burgués Illa Juan Manuel Dodero Beardo Xavier Franch i Gutiérrez

Licenciado en Informática. Ha Ingeniero informático, profesor Doctor Ingeniero en Informática por Profesor titular de universidad en
sido profesor asociado del del Departamento de Lenguajes y la Universidad Carlos III de Madrid. el Departamento de Lenguajes
Departamento de Lenguajes y Sistemas Informáticos de la Profesor del Departamento de y Sistemas Informáticos de
Sistemas Informáticos de la UPC, Universidad Politécnica de Lenguajes y Sistemas de la la Universidad Politécnica de
donde ha impartido asignaturas Cataluña. Imparte asignaturas de Universidad Pontificia de Salamanca Cataluña. En estos años ha
relacionadas con la programación; bases de datos y de programación en Madrid (1995-1999). Ingeniero impartido docencia en asignaturas
profesor de los Estudios de en la Facultad de Informática de I+D en Intelligent Software de estructuras de datos, iniciación a
Informática de la UOC en el Área de Barcelona y es consultor de la Components, S. A. (2000-2002). la programación e ingeniería del
de la Programación e Ingeniería del Universitat Oberta de Catalunya. Profesor del Departamento de software. Ha escrito varios libros
Software. Ha hecho investigación Informática de la Universidad Carlos y otras publicaciones docentes
en el ámbito de la inteligencia III de Madrid (1999-2006). sobre estos temas. Su actividad
artificial y la ingeniería del software, investigadora gira en torno a la
con artículos y presentaciones a selección de componentes software,
nivel nacional e internacional. la ingeniería de requisitos y las líneas
Actualmente se dedica de producto, principalmente. En
profesionalmente al desarrollo estos y otros temas, ha publicado
de software y es consultor cerca del centenar de artículos en
de la UOC. revistas, actas de congresos y libros.

Elena García Barriocanal Julià Minguillón Alfonso Miguel Ángel Sicilia Urbán Esteve Mariné Gallisà

Ingeniero en Informática por la Ingeniero en Informática por Ingeniero en Informática por la Ingeniero técnico industrial por la
Universidad Pontificia de Salamanca la Universidad Autónoma de Universidad Pontificia de Salamanca Universidad Politécnica de Cataluña.
y doctora por la Universidad de Barcelona. Máster en Combinatoria y doctor ingeniero en Informática Licenciado en Derecho por la
Alcalá. Miembro del grupo y Comunicación Digital por por la Universidad Carlos III UNED. Ingeniero técnico e
de investigación Information la Universidad Autónoma de de Madrid. Actualmente es ingeniero en Informática por la
Engineering de la Universidad Barcelona. Doctor ingeniero en profesor del Dpto. de CC. de la UOC. Funcionario de carrera de
de Alcalá, es profesora desde Informática por la Uni-versidad Computación de la Universidad de la Administración local. Desde el
el año 2000 en el Departamento de Autónoma de Barcelona. Alcalá. Coordinador del grupo año 2001, colaborador y consultor
Ciencias de la Computación de Director adjunto del Internet de investigación Information de los Estudios de Informática y
la misma universidad. Trabaja en Interdisciplinary Institute (IN3) de la Engineering en la Universidad de Multimedia de la UOC.
líneas de investigación relacionadas Universitat Oberta de Catalunya. Alcalá, desde el cual dirige diversos
con la web semántica y el Profesor de los Estudios de proyectos de financiación europea
e-learning, interesándose Informática, Multimedia y y nacional. Es editor en jefe de
especialmente por aspectos Telecomunicación de la Universitat International Journal Metadata,
relacionados con la interacción y Oberta de Catalunya. Profesor Semantics and Ontologies y
diseño de interfaces, líneas en las asociado del Departamento de participa en el comité científico de
que tiene numerosas publicaciones. Ingeniería y Comunicaciones de otras revistas internacionales.
la Universidad Autónoma de
Barcelona. Investigador del IN3
en las áreas de Networking
Technologies y E-learning.
Director del grupo de investigación
PERSONAL para la introducción
de aspectos de personalización del
proceso de aprendizaje en entornos
virtuales mediante itinerarios
basados en objetos de aprendizaje
reutilizables.

Segunda edición: febrero 2007


© Fundació per a la Universitat Oberta de Catalunya
Av. Tibidabo, 39-43, 08035 Barcelona
Diseño: Manel Andreu
Realización editorial: Eureca Media, SL
Depósito legal: B-24.575-2006

Ninguna parte de esta publicación, incluyendo el diseño general y de la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna manera ni por ningún medio, tanto si es eléctrico, como
químico, mecánico, óptico, de grabación, de fotocopia, o por otros métodos, sin la autorización
previa por escrito de los titulares del copyright.
© FUOC • XP06/75001/00574 3 Estructura de la información

Introducción

En las asignaturas de programación precedentes os habéis introducido en las


técnicas básicas más actuales de la programación. Por una parte, la programa-
ción estructurada –que habéis estudiado en Fundamentos de programación– y,
por otra, la programació orientada a objetos (POO) –que habéis estudiado en
Programación orientada a objetos. La programación estructurada os proporciona
las herramientas necesarias para definir algoritmos para problemas de comple-
jidad baja o media. La programación orientada a objetos os proporciona téc-
nicas y herramientas para, estableciendo una analogía con el mundo real,
modelizar el dominio del problema descomponiéndolo en clases de objetos y
relaciones entre éstos. Combinando adecuadamente las herramientas y téc-
nicas que os proporcionan estas dos asignaturas, seréis capaces de abordar pro-
blemas de complejidad y magnitud considerables, así como de proporcionar
soluciones claras e inteligibles que, además, se deberían poder adaptar a nuevos
requisitos con una cierta facilidad.

Ahora bien, hasta aquí, en estas asignaturas habéis resuelto problemas en su to-
talidad, habéis construido algoritmos que definieran el problema en todo su al-
cance y hasta el más mínimo detalle, a partir sólo de aquello que el lenguaje os
proporcionaba, fuera el que fuera: C o Java (si bien probablemente en ocasiones
habréis utilizado algunas de las clases que se incluían en el propio lenguaje,
como la clase java.util.Vector).

Muchas veces nos encontraremos con situaciones concretas que, con pe-
queñas variaciones, se presentan repetidamente en muchas de las aplicaciones
que se construyen. Redefinir cada vez desde cero los algoritmos necesarios
para tratar estas situaciones se puede tolerar en aplicaciones de pequeño ta-
maño (a pesar de que no es deseable), pero es totalmente inadmisible para
aplicaciones de gran tamaño en las que no nos podemos permitir malgastar
recursos en volver a tratar problemas que ya se han solucionado previamente
(aunque sea con pequeñas variaciones).

Reutilizar algoritmos y estructuras que aparecen habitualmente en el desarrollo


de aplicaciones nos puede ahorrar el tener que construir una parte de la aplicación
y, por tanto, esto repercute en la eficacia del proceso de su construcción. Por otra
parte, al reutilizar implementaciones de algoritmos y estructuras que ya se han
probado en otras aplicaciones, estaremos más seguros de que estas implementa-
ciones funcionan correctamente.

Existen distintos modos de incrementar la reutilización en el desarrollo del Tal como ya sabéis de Programación
orientada a objetos, existen
software. Uno de los más usados y también eficaces consiste en lo siguiente: paradigmas, como la orientación a objetos
(OO), que potencian por sí mismas la
reutilización del software.

1) Definir los algoritmos que se presentan repetidamente de una manera bas-


tante general para reutilizarlos en situaciones ligeramente diferentes.
© FUOC • XP06/75001/00574 4 Estructura de la información

2) Agrupar estos algoritmos en una unidad independiente, usualmente deno-


minada biblioteca. En lenguajes orientados a objetos (OO), el elemento reu-
tilizado será directamente una clase y, por lo tanto, hablaremos de bibliotecas
de clases.

3) En el momento de desarrollar una nueva aplicación usaremos aquellas bi-


bliotecas que nos interesen, y podremos utilizar los algoritmos definidos en
ellas sin necesidad de volverlos a definir.

En los tres puntos anteriores encontramos implícitamente definidos dos ro-


les diferentes: el de desarrollador de bibliotecas y el de desarrollador de apli-
caciones (que es al mismo tiempo usuario de las bibliotecas). Nos podemos
encontrar con situaciones en las que un desarrollador asume los dos roles.
Pero también es posible que el desarrollador de aplicaciones únicamente asu-
ma este rol, usando bibliotecas desarrolladas por terceros.

El origen de una biblioteca utilizada para desarrollar una aplicación puede ser
muy variado: se puede tratar tanto de una biblioteca construida por el mismo
equipo de desarrollo, como de una comprada a otra empresa que no tiene
nada que ver con el desarrollo de la aplicación.

Las clases susceptibles de ser reutilizadas y, por tanto, de ser proporcionadas en


una biblioteca pueden ser de varios tipos. Un tipo especialmente importante es
el de las clases que nos permiten almacenar colecciones de objetos. En la mayo-
ría de aplicaciones, sean del tipo que sean, tendremos la necesidad de guardar
colecciones de elementos en algún momento.

Así pues, en el desarrollo de aplicaciones de cualquier dominio, será realmente


beneficioso disponer de una biblioteca de clases especializadas en guardar colec-
ciones de elementos. Estas clases se suelen denominar indistintamente contene-
dores o colecciones.

Esta asignatura está dedicada exclusivamente al estudio tanto de la implemen-


tación de colecciones, como a su uso.

En el módulo “Tipos abstractos de datos”, se presenta la asignatura y el entor-


no en el que trabajaremos a lo largo de todo el curso. Las colecciones se pre-
sentan como tipos abstratos de datos (TAD), que nos permiten, por una parte,
asociar de manera alternativa más de una implementación a un conjunto de
funcionalidades (el TAD); y, por otra, ocultar la implementación concreta que
utiliza el usuario del TAD.

Esta dualidad, funcionalidad-implementación, es muy útil en el mundo de la


implementación y el uso de las colecciones. Veremos cómo, para un mismo
TAD, podemos proporcionar diferentes implementaciones alternativas. De-
pendiendo de la situación concreta en la que hayamos de utilizar el TAD, será
mejor utilizar una u otra.
© FUOC • XP06/75001/00574 5 Estructura de la información

Elementos que acompañarán los TAD que estudiamos a lo largo del curso son la
especificación –en la que tiene un papel importante la técnica del diseño por
contrato– y el estudio de los recursos utilizados para cada una de las implemen-
taciones vistas, tanto por lo que se refiere al espacio que ocupan (el espacio ne-
cesario para almacenar la colección de elementos), como por lo referente al
tiempo (necesario para hacer los cálculos para proporcionar las diferentes fun-
cionalidades de los TAD).

El lenguaje Java nos acompañará también a lo largo de todos los módulos. Ya Adicionalmente, el texto se
acompaña de una serie de ejemplos
en lenguaje Java.
en el módulo “Tipos abstractos de datos” veremos con ejemplos cómo trasla- Todos los ejemplos están
completamente implementados
damos todas estas nociones al terreno de la programación con Java. La asigna- y los tenéis disponibles como recurso
electrónico.
tura dispone de una biblioteca de colecciones especialmente diseñada para
ello. Esta biblioteca se ha diseñado con un objetivo claramente didáctico,
además de contener la definición e implementación en lenguaje Java de todos
los TAD, así como las implementaciones vistas en estos apuntes.

El módulo “Complejidad algorítmica” se encarga de presentar las nociones


necesarias para estudiar la eficiencia, tanto en el espacio como en el tiempo,
de las implementaciones que iremos viendo en el curso. Tener claros cuáles
serán los recursos utilizados por las diferentes implementaciones de un TAD
es muy importante con vistas a decidir cuál de éstas es la más adecuada para
cada situación.

En los módulos “Contenedores secuenciales”, “Árboles”, “Colas con prioridad”,


“El TAD Tabla”, “Árboles de búsqueda” y “Grafos” se presentan las colecciones
básicas que se ven en la mayoría de cursos y libros de estructura de la informa-
ción. Para algunas colecciones se presentan a la vez varias implementaciones di-
ferentes. En el módulo “Contenedores secuenciales” se presentan colecciones
con una estructura secuencial, que son las más sencillas; y, a medida que el cur-
so avanza, se introducen colecciones con organizaciones más complejas.

Para cada colección se describe como mínimo una implementación y se presen-


ta un ejemplo de su uso. El objetivo es mostrar, por una parte, la utilidad de la
colección y, por otra, cómo utilizar la interfaz proporcionada por la colección.

Para acabar, el curso concluye con un módulo en el que, a modo de recapitu-


lación, se estudia cómo abordar problemas que requieren el uso de coleccio-
nes, identificando las diferentes colecciones que tomarán parte en la solución
y seleccionando las implementaciones más adecuadas donde sea necesario.
Este último módulo completa la visión del mundo de las estructuras de datos
discutiendo un conjunto de factores que se deben tener en cuenta en el diseño
de bibliotecas de tipo general en este ámbito; y presenta algunas de las bibliotecas
de estructuras de datos más utilizadas en el mundo de la orientación a objetos.
© FUOC • XP06/75001/00574 6 Estructura de la información

Objetivos

En los materiales didácticos de esta asignatura encontraréis las herramientas


necesarias para alcanzar los siguientes objetivos:

1. Entender que en el desarrollo de aplicaciones es deseable fomentar la reu-


tilización del código, y que una buena manera de hacerlo es el uso de bi-
bliotecas que encapsulen algoritmos aplicables a múltiples dominios
(como la definición y la implementación de colecciones de objetos).

2. Entender la teoría y saber usar y aplicar de una manera práctica la dualidad


entre funcionalidad e implementación que nos proporcionan los TAD.

3. Conocer y saber usar las estructuras básicas vistas en este curso para repre-
sentar colecciones de elementos.

4. Entender la implementación de cada una de las implementaciones presen-


tadas a lo largo de estos materiales, siendo capaces de realizar implementa-
ciones equivalentes o pequeñas variaciones sobre las ya vistas.

5. Saber calcular la cantidad de recursos utilizados por una implementación


tanto en lo que se refiere al espacio como al tiempo.

6. Saber elegir las colecciones adecuadas para proporcionar una solución bas-
tante eficiente a un problema, eligiendo también las implementaciones
más adecuadas para la solución planteada.

7. Poner en práctica todos los puntos anteriores usando el lenguaje de progra-


mación Java.
© FUOC • XP06/75001/00574 7 Estructura de la información

Contenidos

Módulo didáctico 1
Tipos abstractos de datos
Jordi Álvarez Canal
1. Contenedores
2. Diseño por contrato
3. Desarrollo de una colección de ejemplo
4. Tipos genéricos o paramétricos
5. Biblioteca de colecciones de la asignatura
6. Presentación del resto de módulos

Módulo didáctico 2
Complejidad algorítmica
Julià Minguillón i Alfonso
1. Introducción a la complejidad algorítmica
2. Notación asintótica de la complejidad algorítmica
3. Complejidad algorítmica de los tipos abstractos de datos

Módulo didáctico 3
Contenedores secuenciales
Jordi Álvarez Canal
1. Pilas
2. Colas
3. Representaciones encadenadas
4. Listas
5. Representaciones con vector: redimensionamiento
6. Los contenedores secuenciales en la Java Collections Framework

Módulo didáctico 4
Árboles
Xavier Burguès i Illa
1. Árboles generales y binarios. Definiciones y conceptos relacionados
2. Recursividad
3. Árboles generales
4. Árboles binarios
5. Recorridos
6. Ejemplo de uso: un sistema de ficheros

Módulo didáctico 5
Colas con prioridad
Elena García Barriocanal; Miguel Ángel Sicilia Urbán
1. El concepto de cola con prioridad
2. Funcionamiento de las colas con prioridad
© FUOC • XP06/75001/00574 8 Estructura de la información

3. Implementación de las colas con prioridad


4. Las colas prioritarias en las JDK
5. Ordenación por pilón: el algoritmo heapsort
6. Ejemplo de uso: algoritmo de Huffman

Módulo didáctico 6
El TAD Tabla
Xavier Franch
1. Presentación del TAD Tabla
2. Implementación por dispersión del TAD Tabla
3. El TAD Conjunto
4. Ejemplo de aplicación: una tabla de símbolos para un lenguaje modular
5. Las tablas y los conjuntos en la Java Collections Framework

Módulo didáctico 7
Árboles de búsqueda
Juan Manuel Dodero Beardo
1. Los árboles de búsqueda
2. Implementación de colecciones ordenadas mediante árboles binarios de
búsqueda
3. Árboles multicamino y árboles B
4. Los árboles de búsqueda en la Java Collections Framework

Módulo didáctico 8
Grafos
Miguel Ángel Sicilia Urbán; Elena García Barriocanal
1. El concepto de grafo
2. El tipo abstracto de datos Grafo
3. Interfaces Java para grafos dirigidos y no dirigidos
4. Implementaciones de grafos
5. Ejemplo de uso: TAD Academia

Módulo didáctico 9
Diseño de estructuras de datos
Jordi Álvarez Canal
1. Diseño de nuevos TAD utilizando una biblioteca de colecciones
2. Diseño de bibliotecas de colecciones
3. Bibliotecas de colecciones existentes
© FUOC • XP06/75001/00574 9 Estructura de la información

Bibliografía

Goodrich, M.; Tamassia, R. (2006). Data structures and algorithms in Java


(4.ª ed.). John Wiley and Sons.

Weiss, M. A. (2003). Data structures & problem solving using Java (2.ª ed.).
Upper Saddle River: Addison Wesley. Disponible en línea en:
<www.cs.fiu.edu/~weiss>.

Sahni, S. (2004). Data structures, algorithms, and applications in Java (2.ª ed.).
Summit: McGraw-Hill.

Franch, X. (2001). Estructuras de datos. Especificación, diseño e implementación


(4.ª ed.). Barcelona: Edicions UPC. Disponible en línea en:
<www.edicionsupc.es>.

Meyer, B. (1999). Construcción de software orientado a objetos. Madrid: Prentice


Hall.

También podría gustarte