Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · [email protected] Java: Colas /...

49
[email protected] Colas Carlos Delgado Kloos Dep. Ingeniería Telemática Univ. Carlos III de Madrid Java: Colas / 1

Transcript of Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · [email protected] Java: Colas /...

Page 1: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Colas

Carlos Delgado Kloos

Dep. Ingeniería Telemática

Univ. Carlos III de Madrid

Java: Colas / 1

Page 2: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Ejemplo

La cola del autobús

La cola de la impresora

Java: Colas / 2

Page 3: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Características

Estructura lineal

Acceso de inserción por un extremo yde eliminación por el otro extremo

Java: Colas / 3

Page 4: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Interfaz para colas

Java: Colas / 4

public interface Queue {

public int size();

public boolean isEmpty();

public void enqueue(Object o)

throws QueueOverflowException;

public Object dequeue()

throws EmptyQueueException;

public Object front()

throws EmptyQueueException;

}

Page 5: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Un interfaz y

varias implementaciones

Java: Colas / 5

ArrayQueue

Queue

LinkedQueue

Page 6: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Implementación

basada en arrays

[email protected] Java: Colas / 6

0 1 2 N-13 4 5

1 2 3 4 5

0 1 2 N-13 4 5

5 6 78 9

top tail

toptail

Page 7: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Implementación basada

en listas encadenadas

Java: Pilas / 7

Madrid Miami Múnich

top tail

Page 8: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Implementación basada

en listas encadenadas

Java: Colas / 8

public class LinkedQueue implements Queue {

private Node top = null;

private Node tail = null;

private int size = 0;

(…)

}

Page 9: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Inserción (enqueue)

Java: Colas / 9

MoscúMadrid Miami Múnich

top tailn

Page 10: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Implementación basada

en listas encadenadas

Java: Colas / 10

public void enqueue(Object info) {

Node n = new Node(info, null);

if (top == null)

top = n;

else

tail.setNext(n);

tail = n;

size++;

}

Page 11: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Borrado (dequeue)

Java: Colas / 11

MoscúMadrid Miami Múnich

toptail

Page 12: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]

Implementación basada

en listas encadenadas

Java: Colas / 12

public Object dequeue()

throws EmptyQueueException {

Object info;

if (top == null)

throw new EmptyQueueException();

info = top.getInfo();

top = top.getNext();

if (top == null)

tail = null;

size--;

return info;

}

Page 13: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Actividad

Ver animaciones de colas: http://courses.cs.vt.edu/

csonline/DataStructures/

Lessons/

QueuesImplementationView/

applet.html

http://www.cs.usask.ca/

resources/tutorials/

csconcepts/1998_2/queues/java/

[email protected] Java: Colas / 13

Page 14: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Actividad

Probar el applet DepthBreadth.java

que se encuentra en http://www.faqs.org/docs/javap/c11/s3.html

[email protected] Java: Colas / 14

Page 15: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected]@it.uc3m.es Java: Colas / 15

Otros tipos de colas

(que ya no son colas)

Colas dobles

Colas con prioridad

Page 16: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 16

Deques (colas dobles)

insertFirst

removeFirst

removeLast

insertLast

first last

Page 17: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 17

Interfaz para

colas dobles

public interface Deque {

public int size();

public boolean isEmpty();

public void insertFirst(Object info);

public void insertLast(Object info);

Page 18: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 18

Interfaz para

colas dobles

public Object removeFirst()

throws EmptyDequeException;

public Object removeLast()

throws EmptyDequeException;

public Object first()

throws EmptyDequeException;

public Object last()

throws EmptyDequeException;

}

Page 19: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 19

Pilas y colas

como deques

Stack Dequesize() size()

isEmpty() isEmpty()

top() last()

push(e) insertLast(e)

pop() removeLast()

Queue Dequesize() size()

isEmpty() isEmpty()

front() first()

enqueue(e) insertLast(e)

dequeue() removeFirst()

Page 20: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 20

Definición de pilas

a partir de deques

public class DequeStack implements Stack {

private Deque deque;

public DequeStack() {

deque = new Deque();

}

public int size() {

return deque.size();

}

public boolean isEmpty() {

return deque.isEmpty();

}

Page 21: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 21

Definición de pilas

a partir de deques

public void push(Object info) {

deque.insertLast(info);

}

public Object pop()

throws EmptyStackException {

try {

return deque.removeLast();

} catch (EmptyDequeException ede) {

throw new EmptyStackException();

}

}

Page 22: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 22

Definición de pilas

a partir de deques

public Object top()

throws EmptyStackException {

try {

return deque.last();

} catch (EmptyDequeException ede) {

throw new EmptyStackException();

}

}

Page 23: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Implementación de deques

basada en listas

Las listas enlazadas no son apropiadas porque removeLast necesita recorrer la

lista completa para obtener la referencia del penúltimo

Solución: listas doblemente enlazadas

[email protected] Java: Queues / 23

Page 24: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Listas doblemente enlazadas

Listas enlazadas en que cada nodo, además de almacenar el dato y la referencia del siguiente nodo, almacena también la referencia del nodo anterior

Permiten recorrer la lista en ambos sentidos

Reducen el coste de extracción del último nodo

top

24

info

nextprev

info

nextprev

info

nextprev

nullnull

tail

Page 25: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

La clase DLNode

Public class DLNode {

private Object info;

private DLNode next;

private DLNode prev;

public DLNode(Object info) {…}

public DLNode(Object info, DLNode prev, DLNode next) {…}

public DLNode getNext() {…}

public void setNext(DLNode next) {…}

public DLNode getPrev() {…}

public void setPrev(DLNode prev) {…}

public Object getInfo() {…}

public void setInfo(Object info) {…}

}

25

Page 26: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Inserción en cualquier posición

top

node

DLNode node = new DLNode(data);

prev

null

26

nullnull

null

tail

Page 27: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Inserción en cualquier posición

top

node

node.setPrev(prev);

if (prev != null) {

node.setNext(prev.getNext());

prev.setNext(node);

}

prev

null

27

null

tail

Page 28: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Inserción en cualquier posición

top

nodeif (prev == null) {

node.setNext(top);

top = node;

}

if (node.getNext() != null) {

node.getNext().setPrev(node);

} else {

tail = node;

}

prev

null

28

null

tail

Page 29: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Inserción en cualquier posición

/**

* Inserts ‘data’ after the ‘prev’ node. If ‘prev’

* is null, ‘data’ is inserted at the first position of

* the list.

*/

public void insert(DLNode prev, Object data) {

DLNode node = new DLNode(data);

node.setPrev(prev);

if (prev != null) {

node.setNext(prev.getNext());

prev.setNext(node);

} else {

node.setNext(top);

top = node;

}

if (node.getNext() != null) {

node.getNext().setPrev(node);

} else {

tail = node;

}

}29

Page 30: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Eliminación de un nodo

top

Object data = removed.getInfo();

removed

null

30

null

taildata

Page 31: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Eliminación de un nodo

top

if (removed.getPrev() != null) {

removed.getPrev().setNext(removed.getNext());

} else {

top = removed.getNext();

}

removed

null

31

null

taildata

Page 32: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Eliminación de un nodo

top

if (removed.getNext() != null) {

removed.getNext().setPrev(removed.getPrev());

} else {

tail = removed.getPrev();

}

removed

null

32

null

taildata

Page 33: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Eliminación de un nodo

top

null

33

null

taildata

Page 34: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Eliminación de un nodo

/**

* Removes a node from the list and returns

* the information it holds.

*/

public Object remove(DLNode removed) {

Object data = removed.getInfo();

if (removed.getPrev() != null) {

removed.getPrev().setNext(removed.getNext());

} else {

top = removed.getNext();

}

if (removed.getNext() != null) {

removed.getNext().setPrev(removed.getPrev());

} else {

tail = removed.getPrev();

}

return data;

}

34

Page 35: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Implementación alternativa

La implementación anterior se complica debido a la necesidad de comprobar que existen los nodosanterior y posterior

Posible simplificación:Crear dos nodos especiales, sin datos, de tal forma

que uno esté siempre al principio y el otro siempre al final:Una lista vacía sólo contiene estos dos nodos.

Está garantizado en cualquier operación de inserción o extracción que siempre existen el nodo anterior y siguiente.

Las referencias top y tail no cambian nunca de valor.

35

Page 36: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Implementación alternativa

36

top

nullnull

tail

null

null null

Page 37: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 37

Implementación

basada en listas

public class DLDeque implements Deque {

private DLNode top, tail;

private int size;

public DLDeque() {

top = new DLNode();

tail = new DLNode();

tail.setPrev(top);

top.setNext(tail);

size = 0;

}

Page 38: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 38

Inserción

Madrid Miami Múnich

Moscú

first

second

top tail

Page 39: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 39

Implementación

basada en listas

public void insertFirst(Object info) {

DLNode second = top.getNext();

DLNode first = new DLNode(info, top, second);

second.setPrev(first);

top.setNext(first);

size++;

}

Page 40: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 40

Borrado

Madrid Miami MúnichMoscú

firsttop

secondtail

Page 41: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 41

Implementación

basada en listas

public Object removeFirst()

throws EmptyDequeException {

if (top.getNext() == tail)

throw new EmptyDequeException();

DLNode first = top.getNext();

Object info = first.getInfo();

DLNode second = first.getNext();

top.setNext(second);

second.setPrev(top);

size--;

return info;

}

Page 42: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Actividad

Ver las “colas” enhttp://java.sun.com/docs/books/tutorial

/collections/interfaces/queue.html

http://java.sun.com/javase/6/docs/api

/java/util/Queue.html

[email protected] Java: Colas / 42

Page 43: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 43

Colas con prioridad

Una cola con prioridad esuna estructura de datos lineal que devuelve los elementos de acuerdo aun valor asociado a ellos (prioridad)(y no al orden en que fueron insertados).

La prioridad puede coincidir con el valor del elemento, pero también puede diferir de él.

Page 44: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 44

Interfaz

public interface PriorityQueue {

public int size();

public boolean isEmpty();

public void insertItem(Comparable priority,

Object info);

public Object minElem()

throws EmptyPriorityQueueException;

public Object removeMinElem()

throws EmptyPriorityQueueException;

public Object minKey()

throws EmptyPriorityQueueException;

}

Page 45: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 45

Ejemplo

2 1

3 2 4 1 5

2 1 3

2 1

+ + + – + – + –+ + + – + – + –

4 533

Page 46: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

minmin

[email protected] Java: Colas / 46

Ejemplo

2 1

3 2 4 1 5

2 1 3

2 1

+ + + – + – + –+ + + – + – + –

4 533

min

Page 47: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 47

Ejemplo

2 5

3 2 4 1 5

2 1 3

2

+ + + – + – + –+ + + – + – + –

11 33 4

inserta en ordeninserta en ordeninserta en ordeninserta en ordeninserta en orden

Page 48: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

[email protected] Java: Colas / 48

Implementaciones

Con una secuencia sin ordenar

Inserción fácil

Comparación al extraer

Con una secuencia ordenada

Comparación al insertar

Extracción fácil

Page 49: Colas - UC3M › java › 2011-12 › units › pilas-colas › ... · cdk@it.uc3m.es Java: Colas / 43 Colas con prioridad Una cola con prioridad es una estructura de datos lineal

Actividad

Probar http://www.akira.ruc.dk/~keld/algoritmik_e99/

Applets/Chap11/PriorityQ/PriorityQ.html

[email protected] Java: Colas / 49