Grafos

Post on 13-Jun-2015

781 views 1 download

description

Estructuras de datos: Grafos - Breadth first search, Dijkstra, Bellman-Ford, Floyd-Warshall, Prim

Transcript of Grafos

Grafos

Vicente García Díaz – garciavicente@uniovi.es Universidad de Oviedo, 2011

Estructuras de Datos

2

Tabla de contenidos

1. Algoritmos de búsqueda del camino mínimo1. Algoritmo Breadth first search2. Algoritmo de Dijkstra3. Algoritmo de Bellman-Ford4. Algoritmo de Floyd-Warshall

2. Algoritmos de búsqueda del árbol de recubrimiento mínimo

1. Algoritmo de Prim3. Trabajo en equipo4. Bibliografía

3

Algoritmos de búsqueda del camino mínimo

4

Algoritmo Breadth-first search

•Objetivo:

•Ejemplo de uso:

Encontrar el camino mínimo desde un nodo inicial a todos los demás nodos de un grafo sin tener en cuenta los pesos de los nodos

Saber el número de escalas que hay que hacer desde un aeropuerto para llegar a otro

5

método breadth_first_search(grafo, origen)inicializarcrear cola Qagregar origen a cola Qmientras Q no esté vacia:

sacar elemento v de la cola Qmarcar como visitado vpara cada nodo adyacente w a v en el grafo:

si w no ha sido visitado y no está en la cola:actualizar el contador de w (ahora es v+1)actualizar el predecesor de w (ahora es v)insertar w dentro de la cola Q:

Algoritmo Breadth-first search

Pseudocódigo

6

Ejemplo

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

7

Proceso

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

Nodo inicial

0

Paso 1

V2

COLA DE PROCESO

8

Proceso

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

0

Paso 2

V2,1

V2,1

V2

COLA DE PROCESO

V0V5

9

Proceso

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

0

Paso 3

V2,1

V2,1

V0,2

V0,2

V2

COLA DE PROCESO

V0V5V1V3

10

Proceso

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

0

Paso 4

V2,1

V2,1

V2

COLA DE PROCESO

V0V5V1V3

V0,2

V0,2

11

Proceso

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

0

Paso 5

V1,3

V2

COLA DE PROCESO

V0V5V1V3V4

V2,1

V2,1

V0,2

V0,2

12

Proceso

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

0

Paso 6

V3,3

V2

COLA DE PROCESO

V0V5V1V3V4 V2V0V5V1V6

V2,1

V2,1

V0,2

V0,2

V1,3

13

Proceso

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

0

Paso 7

V2

COLA DE PROCESO

V0V5V1V3V4 V2V0V5V1V6

V2,1

V2,1

V0,2

V0,2

V1,3

V3,3

14

Proceso

Algoritmo Breadth-first search

VO V1

V2 V3 V4

V5 V6

0

Paso 8

V2

COLA DE PROCESO

V0V5V1V3V4 V2V0V5V1V6

V2,1

V2,1

V0,2

V0,2

V1,3

V3,3

15

Ejercicio 1Algoritmo Breadth-first search

• Dada la siguiente organización de objetos, especificar el orden en el que se han recorrido los objetos antes de llegar a encontrar el objeto M desde A

A

B

D

E

F

M

C

G

L

K

H

J

I

16

Algoritmo de Dijkstra

•Objetivo:

•Ejemplo de uso:

Encontrar el camino mínimo desde un nodo inicial a todos los demás nodos de un grafo con pesos positivos

Averiguar la ruta más corta entre dos poblaciones a través de una red de carreteras

17

método dijkstra(grafo, origen)inicializarcrear cola de prioridades Q ordenada de menor a mayor pesoagregar origen a cola Qmientras Q no esté vacia:

sacar elemento v de la cola Qmarcar como visitado vpara cada nodo adyacente w a v en el grafo:

si (peso de w) > (peso de v + peso entre v y w):actualizar el peso de w (disminuye)actualizar el predecesor de w (ahora es v)si w no ha sido visitado:

si w está en la cola Q: actualizar prioridad de w

y si w no está en la cola: insertar w dentro de la cola Q:

Algoritmo de Dijkstra

Pseudocódigo

18

Proceso

Algoritmo de Dijkstra

VO V1

V2 V3 V4

V5 V6

4

2

1 3

2 2

10

84

1

5 6

Paso 1

V0,0

COLA DE PROCESO

Nodo inicial

0

19

Proceso

Algoritmo de Dijkstra

VO V1

V2 V3 V4

V5 V6

4

2

1 3

2 2

10

84

1

5 6

Paso 2

V0,0

COLA DE PROCESO

0V0,2

V0,1

V1,2V3,1

20

Proceso

Algoritmo de Dijkstra

VO V1

V2 V3 V4

V5 V6

4

2

1 3

2 2

10

84

1

5 6

Paso 3

V0,0

COLA DE PROCESO

0

V1,2V3,1

V3,3

V2,3

V3,9

V5,9

V3,5

V6,5

V3,3

V4,3

V0,1

V0,2

21

Proceso

Algoritmo de Dijkstra

VO V1

V2 V3 V4

V5 V6

4

2

1 3

2 2

10

84

1

5 6

Paso 4

V0,0

COLA DE PROCESO

0

V1,2V3,1V2,3V5,9V6,5V4,3

V0,1

V0,2

V3,3

V3,9 V3,5

V3,3

22

Proceso

Algoritmo de Dijkstra

VO V1

V2 V3 V4

V5 V6

4

2

1 3

2 2

10

84

1

5 6

Paso 5

V0,0

COLA DE PROCESO

0

V1,2V3,1V2,3V5,9V6,5V4,3

V0,1

V0,2

V3,3

V3,9 V3,5

V3,3

23

Proceso

Algoritmo de Dijkstra

VO V1

V2 V3 V4

V5 V6

4

2

1 3

2 2

10

84

1

5 6

Paso 6

V0,0

COLA DE PROCESO

0

V1,2V3,1V2,3V5,9V6,5V4,3

V0,1

V0,2

V3,3

V3,5

V3,3

V3,9V2,8

V5,8

24

Proceso

Algoritmo de Dijkstra

VO V1

V2 V3 V4

V5 V6

4

2

1 3

2 2

10

84

1

5 6

Paso 7

V0,0

COLA DE PROCESO

02

V1,2V3,1V2,3V5,8V6,5V4,3

V0,1

V0,2

V3,3V3,3

V3,5V2,8V6,6

V5,6

25

Proceso

Algoritmo de Dijkstra

VO V1

V2 V3 V4

V5 V6

4

2

1 3

2 2

10

84

1

5 6

Paso 8

V0,0

COLA DE PROCESO

0

V1,2V3,1V2,3V5,6V6,5V4,3

8

V0,1

V0,2

V3,3

V6,6 V3,5

V3,3

26

Ejercicio 1Algoritmo de Dijkstra

• Desde la población S hay 18 kilómetros a la población A y 15 Km a la población C

• Desde la población A hay 9 Km a la población B y 6 Km a la población C

• Desde la población C hay 7 Km a la población D• Desde la población B hay 28 Km a la población T y 10 Km a la

población D• Desde la población D hay 36 Km la población T

• Calcula las rutas mínimas desde la población S al resto de poblaciones teniendo en cuenta que todas las carreteras tienen sentido de ida y vuelta

27

Ejercicio 2Algoritmo de Dijkstra

• Dado el siguiente sistema, encontrar el camino mínimo desde A a todos los demás nodos

A

G

D

C

B

F

E H

2

6

4

6

4

1

2

1

110

5

3

3

2

28

Algoritmo de Bellman-Ford

•Objetivo:

•Ejemplo de uso:

Encontrar el camino mínimo desde un nodo inicial a todos los demás nodos de un grafo con pesos positivos y negativos

Protocolos de encaminamiento de información

29

método bellman_ford(grafo, origen)inicializarcrear cola Qagregar origen a cola Qmientras Q no esté vacia:

sacar elemento v de la cola Qsi hay bucle negativo

“bucle negativo”y si no, para cada nodo adyacente w a v en el grafo:

si (peso de w) > (peso de v + peso entre v y w):actualizar el peso de w (disminuye)actualizar el predecesor de w (ahora es v)si w no está en la cola:

insertar w dentro de la cola Q:

Algoritmo de Bellman-Ford

Pseudocódigo

30

Proceso

Algoritmo de Bellman-Ford

VO

V1

V2 V3

V4

3

4

2

2

1

Paso 1

V0

COLA DE PROCESO

Nodo inicial

0

-3

-1

31

Proceso

Algoritmo de Bellman-Ford

VO

V1

V2 V3

V4

-1

3

4

2

2

1

Paso 2

V0

COLA DE PROCESO

Nodo inicial

0

-3

V0,-1

V1

V0,4

V2

32

Proceso

Algoritmo de Bellman-Ford

VO

V1

V2 V3

V4

-1

3

4

2

2

1

Paso 3

V0

COLA DE PROCESO

Nodo inicial

0

-3

V0,-1

V1

V0,4

V2

V1,1

V3

V1,1

V4

V1,2

33

Proceso

Algoritmo de Bellman-Ford

VO

V1

V2 V3

V4

-1

3

4

2

2

1

Paso 4

V0

COLA DE PROCESO

Nodo inicial

0

-3

V0,-1

V1

V1,2

V2

V1,1

V3

V1,1

V4

34

Proceso

Algoritmo de Bellman-Ford

VO

V1

V2 V3

V4

-1

3

4

2

2

1

Paso 5

V0

COLA DE PROCESO

Nodo inicial

0

-3

V0,-1

V1

V1,2

V2

V1,1

V3

V1,1

V4

35

Proceso

Algoritmo de Bellman-Ford

VO

V1

V2 V3

V4

-1

3

4

2

2

1

Paso 6

V0

COLA DE PROCESO

Nodo inicial

0

-3

V0,-1

V1

V1,2

V2

V1,1

V3

V1,1

V4

V4,-2

V3

36

Proceso

Algoritmo de Bellman-Ford

VO

V1

V2 V3

V4

-1

3

4

2

2

1

Paso 7

V0

COLA DE PROCESO

Nodo inicial

0

-3

V0,-1

V1

V1,2

V2

V1,1

V3

V1,1

V4

V4,-2

V3

V3,-1

V2

37

Proceso

Algoritmo de Bellman-Ford

VO

V1

V2 V3

V4

-1

3

4

2

2

1

Paso 8

V0

COLA DE PROCESO

Nodo inicial

0

-3

V0,-1

V1

V1,2

V2

V1,1

V3

V1,1

V4

V4,-2

V3

V3,-1

V2

38

Ejercicio 1Algoritmo de Bellman-Ford

• Dado el siguiente sistema basado en las penalizaciones que tiene un jugador en función de las acciones que realiza en un videojuego, encontrar las secuencias de acciones cuya penalización sea mínima desde el inicio del juego (nodo A)

A

DC

B E6

7

5

-2

7

9

-382

-4

39

Ejercicio 2Algoritmo de Bellman-Ford

• En base a la tabla, calcular el camino mínimo desde V2 al resto de nodos:

V0 V1 V2 V3 V4 V5 V6

V0 0 4 2

V1 0 2

V2 2 0 3

V3 6 0 6 5 8

V4 -10 0 6

V5 0

V6 1 0

40

Algoritmo de Floyd-Warshall

•Objetivo:

•Ejemplo de uso:

Encontrar el camino mínimo entre todos los pares de nodos de un grafo

Averiguar la ruta más corta entre TODAS las poblaciones a través de una red de carreteras

41

método floyd-warshall(grafo)M[i, j] := ∞ i != j∀M[i, j] := p(i, j) (i, j) en el grafo ∀ ∈M[i, i] := 0 i∀

for k := 1 to n dofor i := 1 to n do

for j := 1 to n dosi M[i, j] > M[i, k] + M[k, j]

M[i, j] = M[i, k] + M[k, j]for i := 1 to n do

si M[i, i] < 0 “bucle negativo”

Algoritmo de Floyd-Warshall

Pseudocódigo

42

Proceso

Algoritmo de Floyd-Warshall

V2

V1 V3

V4V5

3 4

8

-4

6

-5

17

2

Matriz de adyacencia W

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0 INF 1 7

V3 INF 4 0 INF INF

V4 2 INF -5 0 INF

V5 INF INF INF 6 0

Paso 1

0 si i=j Wij = ∞ si los vértices i,j no son adyacentes

El peso de la arista si los vértices i,j si son adyacentes

43

ProcesoAlgoritmo de Floyd-Warshall

Matriz de adyacencia D(0)

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0 INF 1 7

V3 INF 4 0 INF INF

V4 2 INF -5 0 INF

V5 INF INF INF 6 0

Paso 2

V1 V2 V3 V4 V5

V1 NIL 1 1 NIL 1

V2 NIL NIL NIL 2 2

V3 NIL 3 NIL NIL NIL

V4 4 NIL 4 NIL NIL

V5 NIL NIL NIL 5 NIL

Matriz de predecesores P(0)

NIL si i=j o si Dij = INF

i el resto

Pij

K=0 Wij si k=0

min(D(k-1)ij, D(k-1)ik+ D(k-1)kj) si k > 0 D(k)ij

44

ProcesoAlgoritmo de Floyd-Warshall

Matriz de adyacencia D(0)

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0 INF 1 7

V3 INF 4 0 INF INF

V4 2 INF -5 0 INF

V5 INF INF INF 6 0

Paso 3

Wij si k=0

min(D(k-1)ij, D(k-1)ik+ D(k-1)kj) si k > 0 D(k)ij

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0

V3 INF 0

V4 2 0

V5 INF 0

Matriz de adyacencia D(1)

K=1

V1 V2 V3 V4 V5

V1 NIL 1 1 NIL 1

V2 NIL NIL

V3 NIL NIL

V4 4 NIL

V5 NIL NIL

Matriz de predecesores P(1)

45

ProcesoAlgoritmo de Floyd-Warshall

Matriz de adyacencia D(0)

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0 INF 1 7

V3 INF 4 0 INF INF

V4 2 INF -5 0 INF

V5 INF INF INF 6 0

Paso 4

Wij si k=0

min(D(k-1)ij, D(k-1)ik+ D(k-1)kj) si k > 0 D(k)ij

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0 INF

V3 INF 0

V4 2 0

V5 INF 0

Matriz de adyacencia D(1)

K=1 Para i = 2, j = 3:

D(k)23 = min(D(k-1)23, D(k-1)21 + D(k-1)13) => D(1)23 = min(D(0)23, D(0)21 + D(0)13) =>D(1)23 = min(D(0)23, D(0)21 + D(0)13) =>D(1)23 = min(INF, INF + 8) = INF

Estamos mirando si hay algún camino para llegar D23 que pase por D21 y por D13 y que haga más corto al camino actual

V1 V2 V3 V4 V5

V1 NIL 1 1 NIL 1

V2 NIL NIL NIL

V3 NIL NIL

V4 4 NIL

V5 NIL NIL

Matriz de predecesores P(1)

46

ProcesoAlgoritmo de Floyd-Warshall

Matriz de adyacencia D(0)

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0 INF 1 7

V3 INF 4 0 INF INF

V4 2 INF -5 0 INF

V5 INF INF INF 6 0

Paso 5

Wij si k=0

min(D(k-1)ij, D(k-1)ik+ D(k-1)kj) si k > 0 D(k)ij

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0 INF 1 7

V3 INF 4 0 INF INF

V4 2 5 0

V5 INF 0

Matriz de adyacencia D(1)

K=1

Estamos mirando si hay algún camino para llegar D42 que pase por D41 y por D12 y que haga más corto al camino actual

Para i = 4, j = 2:

D(k)42 = min(D(k-1)42, D(k-1)41 + D(k-1)12) => D(1)42 = min(D(0)42, D(0)41 + D(0)12) =>D(1)42 = min(D(0)42, D(0)41 + D(0)12) =>D(1)42 = min(INF, 2 + 3) = 5

V1 V2 V3 V4 V5

V1 NIL 1 1 NIL 1

V2 NIL NIL NIL 2 2

V3 NIL 3 NIL NIL NIL

V4 4 1 NIL

V5 NIL NIL

Matriz de predecesores P(1)

Cambios

47

ProcesoAlgoritmo de Floyd-Warshall

Matriz de adyacencia D(1)

V1 V2 V3 V4 V5

V1 0 3 8 INF -4

V2 INF 0 INF 1 7

V3 INF 4 0 INF INF

V4 2 5 -5 0 -2

V5 INF INF INF 6 0

Paso 6

V1 V2 V3 V4 V5

V1 NIL 1 1 NIL 1

V2 NIL NIL NIL 2 2

V3 NIL 3 NIL NIL NIL

V4 4 1 4 NIL 1

V5 NIL NIL NIL 5 NIL

Matriz de predecesores P(1)

K=1

48

ProcesoAlgoritmo de Floyd-Warshall

Matriz de adyacencia D(2)

V1 V2 V3 V4 V5

V1 0 3 8 4 -4

V2 INF 0 INF 1 7

V3 INF 4 0 5 11

V4 2 5 -5 0 -2

V5 INF INF INF 6 0

Paso 7

V1 V2 V3 V4 V5

V1 NIL 1 1 2 1

V2 NIL NIL NIL 2 2

V3 NIL 3 NIL 2 2

V4 4 1 4 NIL 1

V5 NIL NIL NIL 5 NIL

Matriz de predecesores P(2)

K=2

49

ProcesoAlgoritmo de Floyd-Warshall

Matriz de adyacencia D(5)

V1 V2 V3 V4 V5

V1 0 1 -3 2 -4

V2 3 0 -4 1 -1

V3 7 4 0 5 3

V4 2 -1 -5 0 -2

V5 8 5 1 6 0

Paso 8

V1 V2 V3 V4 V5

V1 NIL 3 4 5 1

V2 4 NIL 4 2 1

V3 4 3 NIL 2 1

V4 4 3 4 NIL 1

V5 4 3 4 5 NIL

Matriz de predecesores P(5)

V2

V1 V3

V4V5

3 4

8

-4

6

-5

17

2

50

¿Camino y coste desde V3 a V5?Algoritmo de Floyd-Warshall

Matriz de adyacencia D(5)

V1 V2 V3 V4 V5

V1 0 1 -3 2 -4

V2 3 0 -4 1 -1

V3 7 4 0 5 3

V4 2 -1 -5 0 -2

V5 8 5 1 6 0

V1 V2 V3 V4 V5

V1 NIL 3 4 5 1

V2 4 NIL 4 2 1

V3 4 3 NIL 2 1

V4 4 3 4 NIL 1

V5 4 3 4 5 NIL

Matriz de predecesores P(5)

V2

V1 V3

V4V5

3 4

8

-4

6

-5

17

2

51

Ejercicio 1Algoritmo de Floyd-Warshall

• Calcular la distancia mínima entre todos los pares de nodos

V2V1

V5

V4V3

3

4

16

2

2

1

3

52

Ejercicio 2Algoritmo de Floyd-Warshall

• Busca un ejemplo en el que al aplicar Floyd-Warshall aparezca un bucle infinito y aplica el algoritmo para visualizar la matriz de adyacencia y la matriz de predecesores

V2V1

V3V4

1

1

-3

1

1

53

Algoritmos de búsqueda del árbol de recubrimiento mínimo

54

Algoritmo de Prim

•Objetivo:

•Ejemplo de uso:

Encontrar el árbol de recubrimiento mínimo en un grafo conexo, no dirigido

Trazar la mínima cantidad de cable posible para cubrir las necesidades de una nueva urbanización

Un grafo es conexo si cada par de vértices está conectado por un camino

55

método prim(grafo, origen)1- marcar un nodo dentro del grafo, el cual será el nodo de partida

2- seleccionar la arista de menor valor que salga del nodo marcado

3- marcar el nodo al que llega la arista seleccionada en el paso previo

4- repetir los pasos 2 y 3 de tal modo que se vayan obteniendo aristas entre nodos marcados y otros que no lo están

5- el algoritmo termina cuando están todos los nodos marcados

Algoritmo de Prim

Pseudocódigo

56

Proceso

Algoritmo de Prim

VO V1

V3 V4

V2

59

87

Paso 1

Nodo inicial

7

V5

V6

5

15

6 8

11

9

57

Proceso

Algoritmo de Prim

VO V1

V3 V4

V2

59

87

Paso 2

7

V5

V6

5

15

6 8

11

9

Árbol Opciones Grafo

{V3} {V3, V0} = 5{V3, V1} = 9{V3, V4} = 15{V3, V5} = 6

{V0, V1, V2, V4, V5, V6}

58

Proceso

Algoritmo de Prim

VO V1

V3 V4

V2

59

87

Paso 3

7

V5

V6

5

15

6 8

11

9

Árbol Opciones Grafo

{V0, V3} {V3, V1} = 9{V3, V4} = 15{V3, V5} = 6{V0, V1} = 7

{V1, V2, V4, V5, V6}

59

Proceso

Algoritmo de Prim

VO V1

V3 V4

V2

59

87

Paso 4

7

V5

V6

5

15

6 8

11

9

Árbol Opciones Grafo

{V0, V3, V5} {V3, V1} = 9{V3, V4} = 15{V0, V1} = 7 {V5, V4} = 8{V5, V6} = 11

{V1, V2, V4, V6}

60

Proceso

Algoritmo de Prim

VO V1

V3 V4

V2

59

87

Paso 5

7

V5

V6

5

15

6 8

11

9

Árbol Opciones Grafo

{V0, V1, V3, V5}

{V3, V1} = C{V3, V4} = 15{V5, V4} = 8{V5, V6} = 11{V1, V2} = 8{V1, V4} = 7

{V2, V4, V6}

61

Proceso

Algoritmo de Prim

VO V1

V3 V4

V2

59

87

Paso 6

7

V5

V6

5

15

6 8

11

9

Árbol Opciones Grafo

{V0, V1, V3, V4, V5}

{V3, V1} = C{V3, V4} = C{V5, V4} = C{V5, V6} = 11{V1, V2} = 8{V4, V2} = 5{V4, V6} = 9

{V2, V6}

62

Proceso

Algoritmo de Prim

VO V1

V3 V4

V2

59

87

Paso 7

7

V5

V6

5

15

6 8

11

9

Árbol Opciones Grafo

{V0, V1, V2, V3, V4, V5}

{V3, V1} = C{V3, V4} = C{V5, V4} = C{V5, V6} = 11{V1, V2} = C{V4, V6} = 9

{V6}

63

Proceso

Algoritmo de Prim

VO V1

V3 V4

V2

59

87

Paso 8

7

V5

V6

5

15

6 8

11

9

Árbol Opciones Grafo

{V0, V1, V2, V3, V4, V5, V6}

{V3, V1} = C{V3, V4} = C{V5, V4} = C{V5, V6} = C{V1, V2} = C

{}

64

•Realizar trabajos en grupo para presentarlos y defenderlos en clase

•El trabajo de grafos puede consistir en:▫Escoger un algoritmo y aplicarlo en un caso real▫Comparar dos o más algoritmos

•Se entregará en formato Power Point en el campus virtual

Trabajo en equipo

65

Bibliografía

• WEISS, Mark Allen; (2000) Data Estructures & Problem Solving Using Java. Addison Wesley. ISBN 03-2154-140-5.

• JAIME SISA, Alberto; (2002) Estructuras de Datos y Algoritmos con énfasis en programación orientada a objetos. Pearson Educación. ISBN 958-699-044-3.

• JOYANES AGUILAR, LUIS (2007) Estructuras de Datos en Java. McGraw Hill. ISBN: 9788448156312.

• STANDISH, Thomas A (1998). Data structures in Java. Addison Wesley ISBN 0-201-30564-X.

• WEISS, Mark Allen; (2000) Estructuras de Datos en Java. Addison Wesley. ISBN 84-7829-035-4.

• WIRTH, Niklaus (1992). Algoritmos + Estructuras de Datos = Programas. Prentice-Hall. ISBN: 84-219-0172-9.