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

Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected]

Colas

Carlos Delgado Kloos

Dep. Ingeniería Telemática

Univ. Carlos III de Madrid

Java: Colas / 1

Page 2: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected]

Ejemplo

�La cola del autobús

�La cola de la impresora

Java: Colas / 2

Page 3: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected]

Un interfaz y

varias implementaciones

Java: Colas / 5

ArrayQueue

Queue

LinkedQueue

Page 6: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected]

Implementación basada

en listas encadenadas

Java: Pilas / 7

Madrid Miami Múnich

top tail

Page 8: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected]

Inserción (enqueue )

Java: Colas / 9

MoscúMadrid Miami Múnich

top tailn

Page 10: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected]

Borrado (dequeue )

Java: Colas / 11

MoscúMadrid Miami Múnich

top tail

Page 12: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Actividad

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

uctures/Lessons/QueuesImplementationView/applet.html

[email protected] Java: Colas / 13

Page 14: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Actividad

�Probar el applet DepthBreadth.javaque se encuentra en http://www.faqs.org/docs/javap/c11/s3.html

[email protected] Java: Colas / 14

Page 15: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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

Otros tipos de colas

(que ya no son colas)

�Colas dobles

�Colas con prioridad

Page 16: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected] Java: Colas / 16

Deques (colas dobles)

insertFirst

removeFirst

removeLast

insertLast

first last

Page 17: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Implementación de deques

basada en listas

�Las listas enlazadas no son apropiadasporque removeLast necesita recorrer la lista completa para obtener la referenciadel penúltimo

�Solución: listas doblemente enlazadas

[email protected] Java: Queues / 23

Page 24: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Inserción en cualquier posición

top

node

DLNode node = new DLNode(data);

prev

null

26

nullnull

null

tail

Page 27: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Eliminación de un nodo

top

Object data = removed.getInfo();

removed

null

30

null

taildata

Page 31: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Eliminación de un nodo

top

null

33

null

taildata

Page 34: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Implementación alternativa

36

top

nullnull

tail

null

null null

Page 37: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected] Java: Colas / 38

Inserción

Madrid Miami Múnich

Moscú

first

second

top tail

Page 39: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected] Java: Colas / 40

Borrado

Madrid Miami MúnichMoscú

firsttop second tail

Page 41: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Actividad

�Ver las “colas” en�http://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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[email protected] Java: Colas / 45

Ejemplo

2 1

3 2 4 1 5

2 1 3

2 1

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

4 533

Page 46: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

minmin

[email protected] Java: Colas / 46

Ejemplo

2 1

3 2 4 1 5

2 1 3

2 1

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

4 533

min

Page 47: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

[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: Carlos Delgado Kloos Dep. Ingeniería Telemática Univ

Actividad

�Probar http://www.akira.ruc.dk/~keld/algoritmik_e99/Applets/Chap11/PriorityQ/PriorityQ.html

[email protected] Java: Colas / 49