29
Repaso Recorrida de grafos Algoritmos y Estructuras de Datos II Recorriendo grafos 3 de junio de 2019 Recorriendo grafos Algoritmos y Estructuras de Datos II

Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

Algoritmos y Estructuras de Datos II

Recorriendo grafos

3 de junio de 2019

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 2: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

Clase de hoy

1 Repaso

2 Recorrida de grafosGeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 3: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

Repaso

cómo vs. qué3 partes

1 análisis de algoritmos2 tipos de datos3 técnicas de resolución de problemas

divide y vencerásalgoritmos voracesbacktrackingprogramación dinámica: problema de la moneda, problemade la mochila, algoritmo de Floydrecorrida de grafos

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 4: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Recorrida de grafos

Recorrer un grafo, significa procesar los vértices del mismo,de forma organizada de modo de asegurarse:

que todos los vértices sean procesados,que ninguno de ellos sea procesado más de una vez.

Se habla de procesar los vértices, pero también utilizaremos lapalabra visitar los vértices. En este contexto, son sinónimos.Puede haber más de una forma natural de recorrer un ciertografo.

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 5: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Recorrida de árboles binarios

Un caso de grafo sencillo que ya han visto es el de árbolbinario. Se han visto 3 maneras de recorrerlo:

pre-order Se visita primero el elemento que se encuentraen la raíz, luego se recorre el subárbol izquierdo yfinalmente se recorre el subárbol derecho.

in-order Se recorre el subárbol izquierdo, luego se visitael elemento que se encuentra en la raíz yfinalmente se recorre el subárbol derecho.

pos-order Se recorre el subárbol izquierdo, luego el derechoy finalmente se visita el elemento que seencuentra en la raíz.

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 6: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Algoritmos

Los siguientes algoritmos reflejan estas distintas maneras derecorrer árboles binarios, generando listas con sus elementos.Los elementos aparecen en el orden en que se visitan.

pre_orderA Vacío = [ ]pre_orderA (Nodo i r d) = r : pre_orderA i ++ pre_orderA d

in_orderA Vacío = [ ]in_orderA (Nodo i r d) = in_orderA i ++ (r : in_orderA d)

pos_orderA Vacío = [ ]pos_orderA (Nodo i r d) = pos_orderA i ++ pos_orderA d ++ [r]

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 7: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo de árbol binario

a

b c

d e f g

h i j k l

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 8: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo, recorrida pre-order

a

b c

d e f g

h i j k l

1

2

3

4

5

6 7

8

9

10

11

12

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 9: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo, recorrida in-order

a

b c

d e f g

h i j k l

7

3

2

1

5

4 6

10

9

8

11

12

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 10: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo, recorrida pos-order

a

b c

d e f g

h i j k l

12

6

2

1

5

3 4

11

8

7

10

9

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 11: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Otras 3 maneras de recorrer árboles binarios

Hay otras tres maneras de recorrer: en cada una de lasanteriores, intercambiar el orden entre las recorridas de lossubárboles. Por ejemplo:

in_order_der_izqA Vacío = [ ]in_order_der_izqA (Nodo i r d) =

in_order_der_izqA d ++ (r : in_order_der_izqA i)

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 12: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Otra manera más de recorrer árboles binarios

a

b c

d e f g

h i j k l

1

2 3

4 5 6 7

8 9 10 11 12

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 13: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Otra manera más de recorrer árboles binarios

Algunas observaciones:salvo la última, todas las formas anteriores de recorrer,primero recorren en profundidadla última que presentamos, no,recorre a lo ancho.Todas las otras son ejemplo de DFS (Depth-first search).La última es ejemplo de BFS (Breadth-first search).Un programa que recorra en BFS es más difícil de escribir,se verá al final de la clase de hoy.

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 14: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Recorrida de árboles finitarios

Son árboles en los que cada vértice tiene una cantidadfinita (pero puede ser variable) de hijos.La recorrida in-order deja de tener sentido (habiendo másde dos hijos, ¿en qué momento habría que visitar elelemento que se encuentra en la raíz?).Las recorridas pre-order y pos-order (DFS) y BFS siguenteniendo sentido.

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 15: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo de árbol finitario

a

b c d e

f g h i j k l

m n o p q

r s t u v w x

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 16: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo, recorrida pre-order

a

b c d e

f g h i j k l

m n o p q

r s t u v w x

1

2

3

4

5 6

7 8

9

10 11

12 13

14

15

16 17 18 19 20 21 22

23

24

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 17: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo, recorrida pos-order

a

b c d e

f g h i j k l

m n o p q

r s t u v w x

1

2 3

4 5

6

7

8 9

10 11

12 13 14 15 16 17 18

19

20

21

22

23

24

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 18: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo, recorrida BFS

a

b c d e

f g h i j k l

m n o p q

r s t u v w x

1

2 3 4 5

6 7 8 9 10 11 12

13 14 15 16 17

18 19 20 21 22 23 24

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 19: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

AlgoritmosMarcas

Cuando se visita un vértice, se marca con un número positivo.

type tmark = tupleord: array[V] of natcont: nat

endproc init(out mark: tmark)

mark.cont:= 0endproc visit(in/out mark: tmark, in v: V)

mark.cont:= mark.cont+1mark.ord[v]:= mark.cont

endRecorriendo grafos Algoritmos y Estructuras de Datos II

Page 20: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Algoritmospre-order

Asumimos que un árbol viene dado por su raíz (root) y unafunción (children) que devuelve (el conjunto o la lista de) loshijos de cada vértice.

fun pre_order(G=(V,root,children)) ret mark: tmarkinit(mark)pre_traverse(G, mark, root)

end

proc pre_traverse(in G, in/out mark: tmark, in v: V)visit(mark,v)for w ∈ children(v) do pre_traverse(G, mark, w) od

end

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 21: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Algoritmospos-order

fun pos_order(G=(V,root,children)) ret mark: tmarkinit(mark)pos_traverse(G, mark, root)

end

proc pos_traverse(in G, in/out mark: tmark, in v: V)for w ∈ children(v) do pos_traverse(G, mark, w) odvisit(mark,v)

end

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 22: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo de grafo

ab

c d e

f

g h

i j k l m n

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 23: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo, DFS en pre-order

ab

c d e

f

g h

i j k l m n

12

3

45 6

7

8 910

11

12

1314

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 24: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

AlgoritmosMarcas

Como ahora puede haber ciclos, es necesario poder averiguarsi un vértice ya fue visitado.

proc init(out mark: tmark)mark.cont:= 0for v ∈ V do mark.ord[v]:= 0 od

end

fun visited(mark: tmark, v: V) ret b: boolb:= (mark.ord[v] 6= 0)

end

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 25: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Algoritmo DFS

fun dfs(G=(V,neighbours)) ret mark: tmarkinit(mark)for v ∈ V do

if ¬visited(mark,v) then dfsearch(G, mark, v) fiod

end

proc dfsearch(in G, in/out mark: tmark, in v: V)visit(mark,v)for w ∈ neighbours(v) do

if ¬visited(mark,w) then dfsearch(G, mark, w) fiod

end

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 26: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

DFS iterativoIntroducimos una pila para evitar recursión

proc dfsearch(in G, in/out mark: tmark, in v: V)var p: stack of Vempty(p)visit(mark,v)push(v,p)while ¬is_empty(p) do

if existe w ∈ neighbours(top(p)) tal que ¬visited(mark,w) thenvisit(mark,w)push(w,p)

else pop(p)fi

odend

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 27: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

BFSSi cambiamos la pila por una cola obtenemos BFS

proc bfsearch(in G, in/out mark: tmark, in v: V)var q: queue of Vempty(q)visit(mark,v)enqueue(q,v)while ¬is_empty(q) do

if existe w ∈ neighbours(first(q)) tal que ¬visited(mark,w) thenvisit(mark,w)enqueue(q,w)

else dequeue(q)fi

odend

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 28: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

BFS, procedimiento principal

fun bfs(G=(V,neighbours)) ret mark: tmarkinit(mark)for v ∈ V do

if ¬visited(mark,v) then bfsearch(G, mark, v) fiod

end

Recorriendo grafos Algoritmos y Estructuras de Datos II

Page 29: Algoritmos y Estructuras de Datos II...Repaso Recorrida de grafos Repaso cómo vs. qué 3 partes 1 análisis de algoritmos 2 tipos de datos 3 técnicas de resolución de problemas

RepasoRecorrida de grafos

GeneralidadesÁrboles binariosÁrboles finitariosGrafos arbitrarios, DFSGrafos arbitrarios, BFS

Ejemplo, BFS

ab

c d e

f

g h

i j k l m n

12

34

5 67 89

10

11

12

1314

Recorriendo grafos Algoritmos y Estructuras de Datos II