Este documento presenta las estructuras de datos más utilizadas, clasificándolas en lineales como listas, pilas y colas, y más sofisticadas como colas de prioridad y diccionarios. Define una estructura de datos como una colección de datos con un conjunto de operaciones que especifican su comportamiento de forma independiente a su implementación.
1. Objetivos
El objetivo general de este tema es presentar las estructuras de datos
más utilizadas, clasificándolas en:
TEMA 6 Las más sencillas: estructuras lineales como Lista Con Punto de
Interés, Pila y Cola
Las más sofisticadas: Cola de Prioridad y Diccionario, que se
CONCEPTOS DE JAVA PARA ESTRUCTURAS DE DATOS definen para resolver problemas de búsqueda y selección de
Diseño y uso de la jerarquía Java de una forma muy eficiente
Estructura de Datos En particular, se definirá una Estructura de Datos (EDA) como una
organización concreta de una colección de datos cuyo comportamiento
debe ser especificado de forma independiente a la implementación:
Reutilización y portabilidad del Software mediante la genericidad y
la ocultación de la información 2
Índice 1.- INTRODUCCIÓN
1.- Introducción Cualquier aplicación informática exige manipular colecciones
Diseño de una EDA (Estructura De dAtos) de datos de talla elevada: insertar, borrar, recuperar y buscar
2.- Clasificación datos en la colección
Librerías de usuario La estructura de la colección debe posibilitar:
3.- Jerarquía de una EDA Manipulación eficaz de los datos
El estándar Java: Collections Framework Su reutilización en otras aplicaciones
4.- Uso de una EDA Se denomina Estructura de Datos (EDA) al conjunto de:
5.- Extensión de una EDA Las operaciones que definen el comportamiento de una
Accediendo a la implementación colección (modelo o especificación)
Utilizando los métodos heredados del modelo La posible representación de la colección en memoria
3 4
(implementación)
1
2. 1.- INTRODUCCIÓN 2.- CLASIFICACIÓN
Diseño de una EDA Clasificación general para la asignatura:
Lineales: permiten gestionar una colección atendiendo
Modelo o especificación de una EDA: descripción del
únicamente al orden de incorporación de sus datos: LIFO (Last
conjunto de operaciones que definen su funcionalidad
In First Out), FIFO (First In First Out) o de acceso secuencial.
(comportamiento), independientemente de cómo se Modelos Pila, Cola y ListaConPI respectivamente
implemente Las implementaciones más sencillas y efectivas se obtienen con una
interface representación lineal de los datos, bien mediante un array o bien
mediante una lista enlazada.
De búsqueda: la búsqueda de un dato específico de una
Implementación de una EDA
colección es su objetivo principal
clase (o jerarquía de clases) que la implementan Modelos Diccionario y ColaDePrioridad
debe emplearse el criterio de eficiencia para decidir qué Una implementación lineal no resulta eficiente; para implementar sus
implementación se debe utilizar 5
operaciones con coste sublineal se requiere que los datos mantengan una
cierta relación de orden entre sí 6
2.- CLASIFICACIÓN 3.- JERARQUÍA DE UNA EDA
Librerías de usuario para el manejo de EDAs Introducción
librerias
Elegir una interface como base de la jerarquía permite:
Imponer la funcionalidad de la EDA a cualquiera de sus
implementaciones
util excepciones estructurasDeDatos
Describir la funcionalidad de la EDA con absoluta
independencia de sus posibles implementaciones
modelos lineales jerarquicos deDispersion
Ejemplo: posible jerarquía para el interfaz Cola
Pila ArrayPila ABBDiccionario TablaHash <<interface>>
Cola<E> Modelo Cola
Cola ArrayCola MonticuloBinario
ListaConPI LEGListaConPI
ColaPrioridad
Diccionario
Dos posibles implementaciones:
ArrayCola<E> LEGCola<E>
Especificación de Implementación de Implementación de Implementación de • Mediante un array
las EDAs (interfaces) las EDAs lineales las EDAs jerárquicas las EDAs de dispersión • Mediante una lista enlazada
7 8
2
3. 3.- JERARQUÍA DE UNA EDA 3.- JERARQUÍA DE UNA EDA
Ejemplo: jerarquía de la EDA Cola El estándar Java: Collections Framework
package librerias.estructurasDeDatos.modelos; package librerias.estructurasDeDatos.modelos;
Java contiene en su librería java.util la jerarquía Collection para
/** Cola<E>: base de la jerarquía /** ArrayCola<E>: implementación la representación y manipulación de colecciones de datos
que representa el modelo de una sobre un array genérico del
Cola genérica */ modelo Cola */ Implementaciones
public interface Cola<E> { public class ArrayCola<E>
// Inserta el dato x al final implements Cola<E> { Árbol Tabla hash +
// de la cola // Atributos Interfaces Tabla hash Array balanceado Lista enlazada lista enlazada
void encolar(E x); protected E elArray[]; Set HashSet TreeSet LinkedHashSet
// SII !esVacia(): elimina y protected int talla;
// devuelve el primer dato … Vector/
List LinkedList
E desencolar(); // Constructor/es ArrayList
// SII !esVacia(): devuelve el public ArrayCola() { … }
Deque ArrayDeque LinkedList
// primer dato de la cola // Implementación de los métodos
E primero(); // del modelo HashMap /
Map TreeMap LinkedHashMap
// Comprueba si la cola está o public void encolar(E x) { … } Hashtable
// no vacía public E desencolar() { … }
boolean esVacia(); public E primero() { … }
} public boolean esVacia() { … } Set: manipulación de conjuntos Deque: fusión de los modelos Pila y Cola
10
} List: colección ordenada / secuencia Map: diccionario
9
4.- USO DE UNA EDA 5.- EXTENSIÓN DE UNA EDA
Mediante composición (TIENE UN(A)) Mediante herencia (ES UN(A))
Se debe trabajar con el modelo, evitar acceder a los detalles de En muchas aplicaciones es necesario extender la funcionalidad
la implementación de una EDA (añadiendo, por ejemplo, nuevos métodos)
Ej: uso de una Cola para diseñar una cola de impresión:
Estas extensiones deben realizarse manteniendo el principio de
import modelos.*; import lineales.*;
public class Impresora {
Trabajamos con el modelo ocultación de la información para garantizar la reutilización del
para evitar el acceso a los
private Cola<Trabajo> colaImpresion;
detalles de implementación software
public Impresora() {
colaImpresion = new ArrayCola<Trabajo>(); La implementación
Hay dos alternativas para realizar esta extensión:
} elegida sólo se Accediendo a los detalles de implementación, es decir,
public void nuevoTrabajo(Trabajo t) { necesita para la
colaImpresion.encolar(t); creación del objeto utilizando los atributos y métodos heredados de la
}
public void imprimirSiguienteTrabajo() { implementación anterior
Trabajo sig = colaImpresion.desencolar();
Accediendo únicamente a los métodos heredados del modelo
sig.imprimir();
11 12
}
}
3
4. 5.- EXTENSIÓN DE UNA EDA 5.- EXTENSIÓN DE UNA EDA
Accediendo a la implementación Accediendo únicamente a los métodos del modelo
Ejemplo: añadir el método vaciar() a la EDA Cola public abstract class ColaExt<E> implements Cola<E> {
public void vaciar() {
while (!esVacia())
public interface ColaExt<E> public class ArrayColaExt<E> desencolar();
extends Cola<E> { extends ArrayCola<E> }
void vaciar(); implements ColaExt<E> { }
} public void vaciar() {
talla = 0;
…
}
La clase que implementa el (sub)modelo debe extender la clase
} abstracta:
Ventaja: acceder a la implementación suele ser más eficiente public class ArrayColaExt<E> extends ColaExt<E> {
…
Inconveniente: acceder a la implementación no siempre es
}
posible debido al principio de ocultación de la información 13 14
4