You are on page 1of 8

Teoría de la Programación [TP]

Estructuras de Datos para


los Algoritmos
Juan Ramón Pérez Pérez

Curso 03-04 Teoría de la programación (TP) - 1


Estructuras de Datos

Necesidad de las estructuras de


datos
• Los algoritmos requieren una
representación apropiada de los datos
para lograr ser eficientes.
• Esta representación junto con las
operaciones permitidas se llama
estructura de datos.

Curso 03-04 Teoría de la programación (TP) - 2


Estructuras de Datos

Matrices, pilas y colas


• Matriz (array), estructura de datos que
consta de un número fijo de elementos del
mismo tipo.
– Vectores, matrices unidimensionales.
• Pila, LIFO (Last In Fisrt Out) estructura de
datos en la cual el acceso está limitado al
elemento más recientemente insertado.
• Cola, FIFO (First In First Out) permite
acceder al elemento más antiguo.
Curso 03-04 Teoría de la programación (TP) - 3
Estructuras de Datos

1
Arrays en Java
• Se definen y utilizan con el operador de
indexación  corchetes [ ]
• Es un objeto más  su identificador es una
referencia.
• Arrays dinámicos, cuando llamamos al
constructor decidimos el tamaño.
• length, miembro intrínseco, sólo se puede
consultar, indica cuántos elementos hay en el
array.
• Siempre se controlan los rangos.
Curso 03-04 Teoría de la programación (TP) - 4
Estructuras de Datos

Arrays multidimensionales en Java


– Declaración: int [][]
– Construcción: int [][] matriz= new int [3][4];
– Acceso: matriz[2][0]
– Devolver un array: String[][]
conjuntoCadenas()

Curso 03-04 Teoría de la programación (TP) - 5


Estructuras de Datos

Operaciones con arrays


• java.util.Arrays, clase que implementa un
conjunto de métodos estáticos que permiten
realizar operaciones con arrays:
– equals(), compara la igualdad de dos arrays.
– fill(), rellena un array con un valor.
– sort(), ordena un array.
– binarySearch(), busca un dato en un array ordenado.
– asList(), convierte el array en un contenedor tipo lista
de Java.
• System.arraycopy(), copia datos de un array en
otro, realiza copia superficial.
Curso 03-04 Teoría de la programación (TP) - 6
Estructuras de Datos

2
Diseño de la ordenación de arrays
• Problema de escribir código de ordenación
genérico: debemos llevar a cabo comparaciones
basadas en el tipo del objeto.
• Podemos escribir código de ordenación para
cada tipo  no se puede reutilizar.
• Algoritmo de ordenación coches:
[…]
if (coche1.cilindrada() > coche2.cilindrada())
[…]
• Algoritmo de ordenación aviones:
[…]
if (avion1.verPasajeros() > avion2.verPasajeros())
[…]

Curso 03-04 Teoría de la programación (TP) - 7


Estructuras de Datos

Diseño de la ordenación de arrays


• Podemos “separar los elementos que cambian
de los que permanecen igual”, el algoritmo
general de ordenación permanece igual, lo que
cambia es la forma de comparar los objetos.
• La parte del código que varía la encapsulamos
en la propia clase.
• Algoritmo de ordenación genérico:
[…]
if (Comparable1.comparar(Comparable2)>0)
[…]

Curso 03-04 Teoría de la programación (TP) - 8


Estructuras de Datos

Comparación para la ordenación


• Primera forma de proporcionar esto:
– La clase a ordenar debe implementar la interfaz
java.lang.Comparable.
– Interfaz con un único método compareTo()
Ejemplo
• Segunda forma: CompType.java

– Si tenemos que ordenar una clase que no


implementa comparable o no debemos emplear este
tipo de comparación.
– Crear una clase separada que implementa la interfaz
Comparator.
– Se debe implementar el método compare()
Ejemplo
Curso 03-04 Teoría de la programación (TP) - Reverse.java
9
Estructuras de Datos

3
Operaciones con pilas
• void push(Object x)
– Inserta un nuevo elemento en la pila, si no está llena
• Object pop()
– Devuelve y borra el elemento más recientemente
insertado.
• Object top()
– Devuelve el elemento más recientemente insertado.
• boolean estaVacia()
– Comprueba si la pila está vacía.
• void vaciar()
– Vacía la pila.
DsTools
Interfaz
Pila.java
Curso 03-04 Teoría de la programación (TP) - 10
Estructuras de Datos

Operaciones con colas


• void insertar(Object x)
– Inserta un nuevo elemento en la cola.
• Object extraer()
– Devuelve y borra el elemento más antiguo de la cola.
• Object verPrimero()
– Devuelve el elemento más antiguo de la cola.
• boolean estaVacia()
– Comprueba si la cola está vacía.
• void vaciar()
– Vacía la cola. DsTools
Interfaz
Cola.java
Curso 03-04 Teoría de la programación (TP) - 11
Estructuras de Datos

Listas
• Lista, es una colección de elementos de
información dispuestos en un cierto orden.
El número de elementos no suele estar
fijado, ni suele estar limitado por
anticipado.
• Lista enlazada, los elementos se
almacenan de forma no contigua, en vez
de un vector de posiciones consecutivas.
DsTools

Curso 03-04 Teoría de la programación (TP) - 12


Estructuras de Datos

4
Soporte de Java para listas
• En Java se puede trabajar con el concepto
colección (Collection): grupo de elementos
individuales, a los que se puede aplicar
alguna regla.
• Una lista (List) es un tipo de colección que
contiene elementos en una secuencia
concreta.
• Java incluye dos clases que implementan
el interfaz List: ArrayList y LinkedList.
Curso 03-04 Teoría de la programación (TP) - 13
Estructuras de Datos

Operaciones de Collection
– System.out.println(), visualizar colección.
– add(), añadir un elemento.
– contains(), comprueba si existe un elemento.
– isEmpty(), comprueba si está vacío.
– iterator(), devuelve un iterador.
– size(), devuelve el número de elementos del
contenedor.
– remove(), elimina un elemento del contenedor.
• Clase auxiliar que permite realizar más
operaciones: java.util.Collections.
Curso 03-04 Teoría de la programación (TP) - 14
Estructuras de Datos

Recorrido de una colección


utilizando un iterador
import java.util.*;

public class PruebaIteradorLista {


public static void main(String[] args) {
List l= new ArrayList();

l.add(new Integer(8));
l.add(new Integer(3));

l.add(new Integer(1));

Integer ent= null;


Iterator i= l.iterator();
while (i.hasNext())
{
ent= (Integer)i.next();
System.out.println(ent);
}
} PruebaIteradorLista.java
}
Curso 03-04 Teoría de la programación (TP) - 15
Estructuras de Datos

5
Cola de prioridad
• Estructura de datos que permite guardar
elementos ordenador de menor a mayor.
• Acceder rápidamente al elemento menor de una
colección y poder extraerlo.
• ¿Por qué no utilizar un árbol binario de
búsqueda?
– Árboles binarios innecesariamente potentes.
– Rendimiento pobre en el caso peor.
– Requieren almacenar dos referencias en cada nodo.

Curso 03-04 Teoría de la programación (TP) - 16


Estructuras de Datos

Cola de prioridad
• void insertar(Comparable x)
– Inserta un nuevo elemento en la cola.
• Comparable extraer()
– Devuelve y borra el elemento menor de la cola.
• Comparable buscarMin()
– Devuelve el elemento menor de la cola.
• boolean estaLlena()
– Comprueba si la cola está llena.
• boolean estaVacia()
– Comprueba si la cola está vacía.
• void vaciar()
– Vacía la cola. DsTools
Interfaz
ColaPrioridad.java
Curso 03-04 Teoría de la programación (TP) - 17
Estructuras de Datos

Resumen
Estructura Acceso Otras características

Arrays A cualquier elemento: De tamaño fijo. Se


a[i]  O(1) complican las operaciones
de inserción y borrado.
Pilas Al más reciente: Sólo insertar y extraer el
extraer()  O(1) más reciente.
Colas Al más antiguo: Sólo insertar y extraer el
extraer()  O(1) más antiguo.

Listas enlazadas A cualquier elemento: Las operaciones de


O(n) inserción y borrado son
sencillas.
Colas de prioridad Al menor: insertar()  O(1) en
buscarMin()  O(1) promedio, O(log n) en el
extraer()  O(log n) caso peor.

Curso 03-04 Teoría de la programación (TP) - 18


Estructuras de Datos

6
Árboles
• Un árbol está formado por un conjunto de nodos
y un conjunto de aristas que conectan pares de
nodos, de forma que se obtiene una estructura
jerárquica.
• Un árbol tiene las siguientes características:
– Un nodo es distinguido como la raíz.
– Todo nodo c, excepto la raíz, está conectado por
medio de una arista a un único nodo p. p es el padre
de c, y c es uno de los hijos de p.
– Hay un único camino desde la raíz a cada nodo. El
número de aristas que deben atravesarse es la
longitud del camino.
DsTools

Curso 03-04 Teoría de la programación (TP) - 19


Estructuras de Datos

Grafos (I)
• Un grafo, es un conjunto de nodos unidos
por un conjunto de líneas o flechas.
– Grafos dirigidos, lo nodo están unidos
mediante flechas llamadas aristas.
– Grafos no dirigidos, los nodos están unidos
mediante líneas sin indicación de dirección,
también se llaman aristas.
• En los dos tipos, las secuencias de aristas
pueden formar caminos y ciclos.
Curso 03-04 Teoría de la programación (TP) - 20
Estructuras de Datos

Grafos (II)
• Un grafo es conexo si se puede llegar desde
cualquier nodo hasta cualquier otro siguiendo
una secuencia de aristas, independientemente
del sentido.
• Un grafo es fuertemente conexo si se puede
pasar desde cualquier nodo hasta cualquier otro
siguiendo una secuencia de aristas, respetando
el sentido de las flechas.
• Formalmente un grafo es una pareja G=<N,A>
en donde N es un conjunto de nodos y A es un
conjunto de aristas. DsTools

Curso 03-04 Teoría de la programación (TP) - 21


Estructuras de Datos

7
Bibliografía
• Weiss, Mark Allen. Estructuras de datos en
Java. Addison Wesley 2000. [Cap 6. Estructuras
de datos].
• Brassard, G.; Bratley, P. Fundamentos de
Alforitmia. Prentice Hall 1997. [Cap 5.
Estructuras de datos].
• Bruce Eckel. Piensa en Java. 2ª edición.
Prentice Hall 2002. [Cap. 9 y Cap. 4 final]
• Arnold, Gosling, Holmes. El Lenguaje de
Programación Java. 3ª edición. Addison Wesley
2001.

Curso 03-04 Teoría de la programación (TP) - 22


Estructuras de Datos