Estructuras de Datos Clase 15 Grafos (Primera Parte)

Estructuras de Datos Clase 15 – Grafos (Primera Parte) Dr. Sergio A. Gómez http://cs.uns.edu.ar/~sag Departamento de Ciencias e Ingeniería de la Compu

7 downloads 138 Views 306KB Size

Recommend Stories


Estructuras de datos. Estructuras de datos
Estructuras de datos Un arbol es un conjunto de nodos que cumplen con las relaciones padre, hijo y hermano. Llamamos hijos de un nodo a todos los nodo

Obturaciones de primera clase
I nforme Dr. Walter Denner Grado de doctor en Odontología (2003) Colaborador de investigación en la Policlínica de Odontología Conservadora y Periodon

Story Transcript

Estructuras de Datos Clase 15 – Grafos (Primera Parte) Dr. Sergio A. Gómez http://cs.uns.edu.ar/~sag Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Bahía Blanca, Argentina

Definición • Un grafo G=(V,E) es un conjunto V de vértices (o nodos) y un conjunto E ⊆ V×V de aristas (o arcos). • Intuitivamente E permite representar una relación entre elementos de V. b

c

V = { a, b, c, d, e, f, g } E = { (a,b), (b,c), (c,d), (d,g), (e,g), (e,f), (f,g), (a,e), (b,g) }

a g d e

f Estructuras de datos - Dr. Sergio A. Gómez

2

Definiciones • Un arco (u,v) puede ser: – Dirigido: (u,v) es un par ordenado, o, – No dirigido: (u,v) en realidad es {u,v} y (u,v) es lo mismo que (v,u). • Grafo dirigido o digrafo: Sus arcos son dirigidos. • Ejemplo: Grafo de herencia de interfaces en Java. • Ejemplo: Grafo donde los nodos son esquinas de una ciudad y los arcos son cuadras de una mano. • Grafo no dirigido o simplemente grafo: Sus arcos son no dirigidos. • Ejemplo: Grafo de colaboración entre coautores científicos. • Ejemplo: Grafo donde los nodos son esquinas de un pueblo chico y los arcos son calles doble mano. Estructuras de datos - Dr. Sergio A. Gómez

3

Definiciones • Arcos que inciden en un vértice v = { (x,y) in E : y=v } • Arcos que emergen de un vértice v = {(x,y) in E : x=v } • Grado de incidencia/entrada de un vértice v: indegree(v) = cantidad de arcos que inciden en v • Grado de emergencia/salida de un vértice v: outdegree(v) = cantidad de arcos que emergen de v Estructuras de datos - Dr. Sergio A. Gómez

4

Definiciones • Grafo pesado: Grafo donde las aristas contienen una etiqueta (o peso cuando las etiquetas son numéricas). • Ejemplo: Digrafo donde los vértices son aeropuertos y los arcos representan vuelos (distancias entre aeropuertos si los pesos son números). • Multi(di)grafo: (Di)grafo donde el conjunto de arcos es una colección. Es decir puede haber más de un arco entre cada par de vértices (se llaman “arcos paralelos”) • Grafo simple: Grafo que no es multigrafo. • Ejemplo: Digrafo donde los vértices representan aeropuertos, los arcos son vuelos y puede haber más de un vuelo entre dos aeropuertos. Estructuras de datos - Dr. Sergio A. Gómez

5

Definiciones • Camino: Un camino es una secuencia alternante de vértices y arcos tales que empieza en un vértice y termina en otro y cada arco es incidente en sus vértices predecesor y sucesor. • Ciclo (simple): Un camino que comienza y termina en el mismo vértice (sin repetir arcos). • Ciclo (camino) dirigido: Un ciclo (camino) donde las aristas tienen dirección y son recorridas en su dirección. Estructuras de datos - Dr. Sergio A. Gómez

6

Definiciones • Subgrafo: Un subgrafo H de un grafo G es un grafo donde los vértices de H son un subconjunto de los vértices de G y los arcos de H son un subconjunto de los vértices de G. • Grafo abarcador (spanning subgraph): Es un subgrafo de G que contiene todos los vértices de G. • Grafo conexo: Un grafo G es conexo si para dos vértices cualquiera de G hay un camino entre ellos. • Componentes conexas: Si un grafo no es conexo, sus subgrafos maximales conexos se llaman componentes conexas.

Estructuras de datos - Dr. Sergio A. Gómez

7

Definiciones • Bosque: Un bosque es un grafo sin ciclos. • Árbol: Un árbol es un bosque conexo (i.e. un grafo conexo sin ciclos). • Nota: Los árboles de los temas anteriores se llaman árboles con raíz (rooted tree). • Nota: Los árboles de grafos se llaman árboles libres (free trees). • Árbol abarcador: Subgrafo abarcador que es un árbol libre. Estructuras de datos - Dr. Sergio A. Gómez

8

ADT Grafo El tipo de dato abstracto Grafo exporta tres sorts: • Graph: Un grafo pesado de vértices con rótulos de tipo V y arcos con rótulos de tipo E • Vertex: La posición de un vértice con rótulo de tipo V • Edge: La posición de un arco con rótulo de tipo E

Estructuras de datos - Dr. Sergio A. Gómez

9

ADT Grafo • vertices(): Retorna una colección iterable con todos los vértices del grafo. • edges(): Retorna una colección iterable con todos los arcos del grafo. • incidentEdges(v): Retorna una colección iterable con todos los arcos incidentes sobre un vértice v • emergentEdges(v): Retorna una colección iterable con todos los arcos emergentes de un vértice v (no está en GT, también le podemos decir successorEdges(v)) Estructuras de datos - Dr. Sergio A. Gómez

10

ADT Grafo • opposite(v,e): Retorna el otro vértice w del arco e=(v,w); ocurre un error si e no es incidente (o emergente de v). • endVertices(e): Retorna un arreglo (de 2 componentes) conteniendo los vértices del arco e. • areAdjacent(v,w): Testea si los vértices v y w son adyacentes. Estructuras de datos - Dr. Sergio A. Gómez

11

ADT Grafo • replace(v,x) : Reemplaza el rótulo del vértice v con x • replace(e,x): Reemplaza el rótulo del arco e con x • insertVertex(x): Inserta y retorna un nuevo vértice con rótulo x • insertEdge(v, w, x): Inserta un arco con rótulo x entre los vértices v y w • insertDirectedEdge(v, w, x): Inserta un arco dirigido con rótulo x entre los vértices v y w Estructuras de datos - Dr. Sergio A. Gómez

12

ADT Grafo • removeVertex(v): Elimina el vértice v y todos sus arcos adyacentes y retorna el rótulo de v • removeEdge(e): Elimina el arco e y retorna el rótulo almacenado en e.

Estructuras de datos - Dr. Sergio A. Gómez

13

ADT Grafo

Buenos Aires

Graph g = new Digrafo(); Vertex bb = g.insertVertex("Bahia Blanca"); Vertex pa = g.insertVertex("Punta Alta"); Vertex ba = g.insertVertex("Buenos Aires"); Vertex mdp = g.insertVertex("Mar del Plata");

400km

Edge vueloBB2PA = g.insertDirectedEdge(bb, pa, 15); g.insertDirectedEdge(bb, mdp, 470); g.insertDirectedEdge(mdp, ba, 400); 470km

Mar del Plata

g.removeEdge(vueloBB2PA); g.removeVertex(pa); Punta Alta

Estructuras de datos - Dr. Sergio A. Gómez

Bahía Blanca

15km 14

Estructuras de datos para grafos • Lista de arcos • Lista de adyacencias • Matriz de adyacencias

Estructuras de datos - Dr. Sergio A. Gómez

15

Lista de arcos

Estructuras de datos - Dr. Sergio A. Gómez

16

Implementación de lista de arcos Position element():E

E -> V Vertex

Edge

Graph

Vertice

Arco

GrafoListaArcos

Rotulo: V posicionEnListaVertices: Position

Rotulo: E posicionEnListaArco: Position cola, punta : Vertice

Estructuras de datos - Dr. Sergio A. Gómez

nodos: PositionList arcos: PositionList

17

Performance de la lista de arcos Dado un grafo G=(V,A) Sea n = #V y m = #A Operación

Tiempo

Vertices

O(n)

Edges

O(m)

endVertices, opposite

O(1)

incidentEdges, areAdjacent

O(m)

Replace

O(1)

insertVertex, insertEdge, removeEdge

O(1)

removeVertex

O(m)

Estructuras de datos - Dr. Sergio A. Gómez

18

Lista de adyacencias

Estructuras de datos - Dr. Sergio A. Gómez

19

Performance de la lista de adyacencias

Operación

Tiempo

Vertices

O(n)

Edges

O(m)

endVertices, opposite

O(1)

incidentEdges(v), areAdjacent

O(deg(v))

Replace

O(1)

insertVertex, insertEdge, removeEdge

O(1)

removeVertex

Estructuras de datos - Dr. Sergio A. Gómez

O(deg(v))

20

Matriz de adyacencias

Estructuras de datos - Dr. Sergio A. Gómez

21

Performance de matriz de adyacencias

Operación

Tiempo

vertices

O(n)

edges

O(m)

endVertices, opposite, areAdjacent

O(1)

incidentEdges(v)

O(n+deg(v))

replace

O(1)

insertVertex, insertEdge, removeEdge

O(1)

insertVertex, removeVertex

O(n2)

Estructuras de datos - Dr. Sergio A. Gómez

22

Implementación de digrafo con lista de adyacencias public interface Vertex extends Position {

} // Vertex.java

public interface Edge extends Position {

} // Edge.java

public interface Graph { // Graph.java public Iterable vertices(); public Iterable edges(); public Iterable incidentEdges(Vertex v); public Iterable succesorEdges(Vertex v); public Vertex opposite(Vertex v, Edge e); public Vertex [] endVertices(Edge e); public boolean areAdjacent(Vertex v, Vertex w); public V replace( Vertex v, V x); public E replace( Edge e, E x); public Vertex insertVertex(V x); public Edge insertEdge(Vertex v, Vertex w, E x); public V removeVertex(Vertex v); public E removeEdge(Edge e); } Estructuras de datos - Dr. Sergio A. Gómez

23

// Vertice.java

public class Vertice implements Vertex { private V rotulo; private PositionList adyacentes; private Position posicionEnNodos; public V element() { return rotulo; } public Vertice( V rotulo ) { this.rotulo = rotulo; adyacentes = new Lista(); } public void setRotulo(V nuevoRotulo) { … } public PositionList getAdyacentes() { … } public void setPosicionEnNodos(Position p ) { … } public Position getPosicionEnNodos() { …} } Estructuras de datos - Dr. Sergio A. Gómez

24

// Arco.java public class Arco implements Edge { private E rotulo; private Vertice sucesor, predecesor; private Position posicionEnAdyacentes; public Arco( E rotulo, Vertice predecesor, Vertice sucesor ) { /* solo setea atributos */ } public E element() { return rotulo; } public Vertice getPredecesor() { … } public Vertice getSucesor() { … } public Position getPosicionEnAdyacentes() { … } public void setPosicionEnAdyacentes( Position p) { … } } Estructuras de datos - Dr. Sergio A. Gómez

25

// Digrafo.java public class Digrafo implements Graph { protected PositionList nodos; public Digrafo() { nodos = new Lista(); } public Iterable vertices() { PositionList lista = new Lista(); for( Vertex v : nodos ) lista.addLast(v); Uso: return lista; for( Vertex v : g.vertices() ) } System.out.println( v.element() ); Tvertices(n, m) = O(n) Tarea: PensarEstructuras cómo de agregar la lista de arcos. datos - Dr. Sergio A. Gómez

26

// Atributos del grafo: // protected PositionList nodos;

public Iterable edges() { PositionList lista = new Lista(); for( Vertex v : nodos ) for( Edge e : succesorEdges(v)) lista.addLast(e); return lista; } Tedges(n, m) = O(n+m) Tarea: Pensar cómo cambia esta Implementación si agrego la lista de arcos. Estructuras de datos - Dr. Sergio A. Gómez

27

// Atributos del grafo: // protected PositionList nodos;

public Iterable successorEdges( Vertex v) { PositionList lista = new Lista(); Vertice vert = (Vertice) v; for( Edge e : vert.getAdyacentes() ) lista.addLast(e); return lista; } TsuccessorEdges(n,m) = O(deg(v))

Estructuras de datos - Dr. Sergio A. Gómez

28

// Atributos del grafo: // protected PositionList nodos;

public Vertex insertVertex(V x) { Vertice v = new Vertice(x); nodos.addLast(v); v.setPosicionEnNodos(nodos.last()); return v; } TinsertVertex(n,m) = O(1)

Estructuras de datos - Dr. Sergio A. Gómez

29

// Atributos del grafo: // protected PositionList nodos; //Inserta un arco dirigido de v a w public Edge insertEdge(Vertex v, Vertex w, E x) { Vertice vv = ((Vertice) v); Vertice ww = ((Vertice) w); Arco arco = new Arco(x, vv, ww); vv.getAdyacentes().addLast(arco); arco.setPosicionEnAdyacentes(vv.getAdyacentes().last()); return arco; } TinsertEdge(n,m) = O(1)

Estructuras de datos - Dr. Sergio A. Gómez

30

// Atributos del grafo: // protected PositionList nodos; public E removeEdge(Edge e) { try { Arco ee = ((Arco) e); Position pee = ee.getPosicionEnAdyacentes(); Vertice pred = ee.getPredecesor(); return pred.getAdyacentes().remove(pee).element(); } catch(InvalidPositionException excep) { return null; } } TremoveEdge(n,m) = O(1)

Estructuras de datos - Dr. Sergio A. Gómez

31

// Atributos del grafo: // protected PositionList nodos; // Asume que no tiene arcos. public V removeVertex(Vertex v) { try { Position pos = ((Vertice) v).getPosicionEnNodos(); return nodos.remove( pos ).element(); } catch(InvalidPositionException e) { return null; } } TremoveVertex(n,m) = O(1) Tarea: Pensar cómo modificarla para Primero eliminar todos los arcos Que salen del nodo v (como propone GT) Estructuras de datos - Dr. Sergio A. Gómez

32

Bibliografía • Capítulo 13 de M. Goodrich & R. Tamassia, Data Structures and Algorithms in Java. Fourth Edition, John Wiley & Sons, 2006.

Estructuras de datos - Dr. Sergio A. Gómez

33

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.